| Index: src/ports/SkImageEncoder_WIC.cpp
|
| diff --git a/src/ports/SkImageEncoder_WIC.cpp b/src/ports/SkImageEncoder_WIC.cpp
|
| index ff651d32fa07ee42ae34518a34f276445804e4e7..5523ea2e11e267e13ad049e48752043a5bf5c9e8 100644
|
| --- a/src/ports/SkImageEncoder_WIC.cpp
|
| +++ b/src/ports/SkImageEncoder_WIC.cpp
|
| @@ -83,55 +83,34 @@
|
| return false;
|
| }
|
|
|
| - // First convert to BGRA if necessary.
|
| + //Convert to 8888 if needed.
|
| const SkBitmap* bitmap;
|
| SkBitmap bitmapCopy;
|
| - if (kBGRA_8888_SkColorType == bitmapOrig.colorType()) {
|
| + if (kN32_SkColorType == bitmapOrig.colorType() && bitmapOrig.isOpaque()) {
|
| bitmap = &bitmapOrig;
|
| } else {
|
| - if (!bitmapOrig.copyTo(&bitmapCopy, kBGRA_8888_SkColorType)) {
|
| + if (!bitmapOrig.copyTo(&bitmapCopy, kN32_SkColorType)) {
|
| return false;
|
| }
|
| bitmap = &bitmapCopy;
|
| }
|
|
|
| - // WIC expects unpremultiplied pixels. Unpremultiply if necessary.
|
| - if (kPremul_SkAlphaType == bitmap->alphaType()) {
|
| + // 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);
|
| }
|
| }
|
| }
|
| -
|
| - // Finally, if we are performing a jpeg encode, we must convert to BGR.
|
| - void* pixels = bitmap->getPixels();
|
| - size_t rowBytes = bitmap->rowBytes();
|
| - SkAutoMalloc pixelStorage;
|
| - WICPixelFormatGUID formatDesired = GUID_WICPixelFormat32bppBGRA;
|
| - if (kJPEG_Type == fType) {
|
| - formatDesired = GUID_WICPixelFormat24bppBGR;
|
| - rowBytes = SkAlign4(bitmap->width() * 3);
|
| - pixelStorage.reset(rowBytes * bitmap->height());
|
| - for (int y = 0; y < bitmap->height(); y++) {
|
| - uint8_t* dstRow = SkTAddOffset<uint8_t>(pixelStorage.get(), y * rowBytes);
|
| - for (int x = 0; x < bitmap->width(); x++) {
|
| - uint32_t bgra = *bitmap->getAddr32(x, y);
|
| - dstRow[0] = (uint8_t) (bgra >> 0);
|
| - dstRow[1] = (uint8_t) (bgra >> 8);
|
| - dstRow[2] = (uint8_t) (bgra >> 16);
|
| - dstRow += 3;
|
| - }
|
| - }
|
| -
|
| - pixels = pixelStorage.get();
|
| - }
|
| -
|
|
|
| //Initialize COM.
|
| SkAutoCoInitialize scopedCo;
|
| @@ -205,6 +184,7 @@
|
|
|
| //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);
|
| @@ -217,10 +197,12 @@
|
| //Write the pixels into the frame.
|
| if (SUCCEEDED(hr)) {
|
| SkAutoLockPixels alp(*bitmap);
|
| - hr = piBitmapFrameEncode->WritePixels(height,
|
| - (UINT) rowBytes,
|
| - (UINT) rowBytes * height,
|
| - reinterpret_cast<BYTE*>(pixels));
|
| + const UINT stride = (UINT) bitmap->rowBytes();
|
| + hr = piBitmapFrameEncode->WritePixels(
|
| + height
|
| + , stride
|
| + , stride * height
|
| + , reinterpret_cast<BYTE*>(bitmap->getPixels()));
|
| }
|
|
|
| if (SUCCEEDED(hr)) {
|
| @@ -241,7 +223,6 @@
|
| case SkImageEncoder::kBMP_Type:
|
| case SkImageEncoder::kICO_Type:
|
| case SkImageEncoder::kPNG_Type:
|
| - case SkImageEncoder::kJPEG_Type:
|
| break;
|
| default:
|
| return nullptr;
|
|
|