Index: src/ports/SkImageDecoder_WIC.cpp |
diff --git a/src/ports/SkImageDecoder_WIC.cpp b/src/ports/SkImageDecoder_WIC.cpp |
deleted file mode 100644 |
index 43068fc8f6b74985e496dfb06acadf358b58d831..0000000000000000000000000000000000000000 |
--- a/src/ports/SkImageDecoder_WIC.cpp |
+++ /dev/null |
@@ -1,246 +0,0 @@ |
- |
-/* |
- * Copyright 2011 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#include "SkTypes.h" |
- |
-#if defined(SK_BUILD_FOR_WIN32) |
- |
-// Workaround for: |
-// http://connect.microsoft.com/VisualStudio/feedback/details/621653/ |
-// http://crbug.com/225822 |
-// In VS2010 both intsafe.h and stdint.h define the following without guards. |
-// SkTypes brought in windows.h and stdint.h and the following defines are |
-// not used by this file. However, they may be re-introduced by wincodec.h. |
-#undef INT8_MIN |
-#undef INT16_MIN |
-#undef INT32_MIN |
-#undef INT64_MIN |
-#undef INT8_MAX |
-#undef UINT8_MAX |
-#undef INT16_MAX |
-#undef UINT16_MAX |
-#undef INT32_MAX |
-#undef UINT32_MAX |
-#undef INT64_MAX |
-#undef UINT64_MAX |
- |
-#include <wincodec.h> |
-#include "SkAutoCoInitialize.h" |
-#include "SkImageEncoder.h" |
-#include "SkIStream.h" |
-#include "SkMovie.h" |
-#include "SkStream.h" |
-#include "SkTScopedComPtr.h" |
-#include "SkUnPreMultiply.h" |
- |
-//All Windows SDKs back to XPSP2 export the CLSID_WICImagingFactory symbol. |
-//In the Windows8 SDK the CLSID_WICImagingFactory symbol is still exported |
-//but CLSID_WICImagingFactory is then #defined to CLSID_WICImagingFactory2. |
-//Undo this #define if it has been done so that we link against the symbols |
-//we intended to link against on all SDKs. |
-#if defined(CLSID_WICImagingFactory) |
-#undef CLSID_WICImagingFactory |
-#endif |
- |
-///////////////////////////////////////////////////////////////////////// |
- |
-SkMovie* SkMovie::DecodeStream(SkStreamRewindable* stream) { |
- return nullptr; |
-} |
- |
-///////////////////////////////////////////////////////////////////////// |
- |
-class SkImageEncoder_WIC : public SkImageEncoder { |
-public: |
- SkImageEncoder_WIC(Type t) : fType(t) {} |
- |
- // DO NOT USE this constructor. This exists only so SkForceLinking can |
- // link the WIC image encoder. |
- SkImageEncoder_WIC() {} |
- |
-protected: |
- virtual bool onEncode(SkWStream* stream, const SkBitmap& bm, int quality); |
- |
-private: |
- Type fType; |
-}; |
- |
-bool SkImageEncoder_WIC::onEncode(SkWStream* stream |
- , const SkBitmap& bitmapOrig |
- , int quality) |
-{ |
- GUID type; |
- switch (fType) { |
- case kBMP_Type: |
- type = GUID_ContainerFormatBmp; |
- break; |
- case kICO_Type: |
- type = GUID_ContainerFormatIco; |
- break; |
- case kJPEG_Type: |
- type = GUID_ContainerFormatJpeg; |
- break; |
- case kPNG_Type: |
- type = GUID_ContainerFormatPng; |
- break; |
- default: |
- return false; |
- } |
- |
- //Convert to 8888 if needed. |
- const SkBitmap* bitmap; |
- SkBitmap bitmapCopy; |
- if (kN32_SkColorType == bitmapOrig.colorType() && bitmapOrig.isOpaque()) { |
- bitmap = &bitmapOrig; |
- } else { |
- if (!bitmapOrig.copyTo(&bitmapCopy, kN32_SkColorType)) { |
- return false; |
- } |
- bitmap = &bitmapCopy; |
- } |
- |
- // We cannot use PBGRA so we need to unpremultiply ourselves |
- if (!bitmap->isOpaque()) { |
- SkAutoLockPixels alp(*bitmap); |
- |
- uint8_t* pixels = reinterpret_cast<uint8_t*>(bitmap->getPixels()); |
- for (int y = 0; y < bitmap->height(); ++y) { |
- for (int x = 0; x < bitmap->width(); ++x) { |
- uint8_t* bytes = pixels + y * bitmap->rowBytes() + x * bitmap->bytesPerPixel(); |
- |
- SkPMColor* src = reinterpret_cast<SkPMColor*>(bytes); |
- SkColor* dst = reinterpret_cast<SkColor*>(bytes); |
- |
- *dst = SkUnPreMultiply::PMColorToColor(*src); |
- } |
- } |
- } |
- |
- //Initialize COM. |
- SkAutoCoInitialize scopedCo; |
- if (!scopedCo.succeeded()) { |
- return false; |
- } |
- |
- HRESULT hr = S_OK; |
- |
- //Create Windows Imaging Component ImagingFactory. |
- SkTScopedComPtr<IWICImagingFactory> piImagingFactory; |
- if (SUCCEEDED(hr)) { |
- hr = CoCreateInstance( |
- CLSID_WICImagingFactory |
- , nullptr |
- , CLSCTX_INPROC_SERVER |
- , IID_PPV_ARGS(&piImagingFactory) |
- ); |
- } |
- |
- //Convert the SkWStream to an IStream. |
- SkTScopedComPtr<IStream> piStream; |
- if (SUCCEEDED(hr)) { |
- hr = SkWIStream::CreateFromSkWStream(stream, &piStream); |
- } |
- |
- //Create an encode of the appropriate type. |
- SkTScopedComPtr<IWICBitmapEncoder> piEncoder; |
- if (SUCCEEDED(hr)) { |
- hr = piImagingFactory->CreateEncoder(type, nullptr, &piEncoder); |
- } |
- |
- if (SUCCEEDED(hr)) { |
- hr = piEncoder->Initialize(piStream.get(), WICBitmapEncoderNoCache); |
- } |
- |
- //Create a the frame. |
- SkTScopedComPtr<IWICBitmapFrameEncode> piBitmapFrameEncode; |
- SkTScopedComPtr<IPropertyBag2> piPropertybag; |
- if (SUCCEEDED(hr)) { |
- hr = piEncoder->CreateNewFrame(&piBitmapFrameEncode, &piPropertybag); |
- } |
- |
- if (SUCCEEDED(hr)) { |
- PROPBAG2 name = { 0 }; |
- name.dwType = PROPBAG2_TYPE_DATA; |
- name.vt = VT_R4; |
- name.pstrName = L"ImageQuality"; |
- |
- VARIANT value; |
- VariantInit(&value); |
- value.vt = VT_R4; |
- value.fltVal = (FLOAT)(quality / 100.0); |
- |
- //Ignore result code. |
- // This returns E_FAIL if the named property is not in the bag. |
- //TODO(bungeman) enumerate the properties, |
- // write and set hr iff property exists. |
- piPropertybag->Write(1, &name, &value); |
- } |
- if (SUCCEEDED(hr)) { |
- hr = piBitmapFrameEncode->Initialize(piPropertybag.get()); |
- } |
- |
- //Set the size of the frame. |
- const UINT width = bitmap->width(); |
- const UINT height = bitmap->height(); |
- if (SUCCEEDED(hr)) { |
- hr = piBitmapFrameEncode->SetSize(width, height); |
- } |
- |
- //Set the pixel format of the frame. If native encoded format cannot match BGRA, |
- //it will choose the closest pixel format that it supports. |
- const WICPixelFormatGUID formatDesired = GUID_WICPixelFormat32bppBGRA; |
- WICPixelFormatGUID formatGUID = formatDesired; |
- if (SUCCEEDED(hr)) { |
- hr = piBitmapFrameEncode->SetPixelFormat(&formatGUID); |
- } |
- if (SUCCEEDED(hr)) { |
- //Be sure the image format is the one requested. |
- hr = IsEqualGUID(formatGUID, formatDesired) ? S_OK : E_FAIL; |
- } |
- |
- //Write the pixels into the frame. |
- if (SUCCEEDED(hr)) { |
- SkAutoLockPixels alp(*bitmap); |
- const UINT stride = (UINT) bitmap->rowBytes(); |
- hr = piBitmapFrameEncode->WritePixels( |
- height |
- , stride |
- , stride * height |
- , reinterpret_cast<BYTE*>(bitmap->getPixels())); |
- } |
- |
- if (SUCCEEDED(hr)) { |
- hr = piBitmapFrameEncode->Commit(); |
- } |
- |
- if (SUCCEEDED(hr)) { |
- hr = piEncoder->Commit(); |
- } |
- |
- return SUCCEEDED(hr); |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-static SkImageEncoder* sk_imageencoder_wic_factory(SkImageEncoder::Type t) { |
- switch (t) { |
- case SkImageEncoder::kBMP_Type: |
- case SkImageEncoder::kICO_Type: |
- case SkImageEncoder::kPNG_Type: |
- break; |
- default: |
- return nullptr; |
- } |
- return new SkImageEncoder_WIC(t); |
-} |
- |
-static SkImageEncoder_EncodeReg gEReg(sk_imageencoder_wic_factory); |
- |
-DEFINE_ENCODER_CREATOR(ImageEncoder_WIC); |
- |
-#endif // defined(SK_BUILD_FOR_WIN32) |