aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gm/encode.cpp50
-rw-r--r--src/images/SkForceLinking.cpp3
-rw-r--r--src/ports/SkImageEncoder_WIC.cpp49
3 files changed, 16 insertions, 86 deletions
diff --git a/gm/encode.cpp b/gm/encode.cpp
deleted file mode 100644
index 3b6d43deba..0000000000
--- a/gm/encode.cpp
+++ /dev/null
@@ -1,50 +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 "gm.h"
-#include "SkCanvas.h"
-#include "SkData.h"
-#include "SkImageEncoder.h"
-#include "Resources.h"
-
-namespace skiagm {
-
-class EncodeGM : public GM {
-public:
- EncodeGM() {}
-
-protected:
- SkString onShortName() override {
- return SkString("encode");
- }
-
- SkISize onISize() override {
- return SkISize::Make(1024, 600);
- }
-
- void onDraw(SkCanvas* canvas) override {
- SkBitmap orig;
- GetResourceAsBitmap("mandrill_512_q075.jpg", &orig);
- sk_sp<SkData> pngData(SkImageEncoder::EncodeData(orig, SkImageEncoder::kPNG_Type, 100));
- sk_sp<SkData> jpegData(SkImageEncoder::EncodeData(orig, SkImageEncoder::kJPEG_Type, 100));
-
- sk_sp<SkImage> pngImage = SkImage::MakeFromEncoded(pngData);
- sk_sp<SkImage> jpegImage = SkImage::MakeFromEncoded(jpegData);
- canvas->drawImage(pngImage.get(), 0.0f, 0.0f);
- canvas->drawImage(jpegImage.get(), 512.0f, 0.0f);
-
- SkPaint paint;
- sk_tool_utils::set_portable_typeface(&paint);
- const char text[] = "Images should look more-or-less the same.";
- canvas->drawText(text, sizeof(text) - 1, 450.0f, 550.0f, paint);
- }
-
-private:
- typedef GM INHERITED;
-};
-
-DEF_GM( return new EncodeGM; )
-}
diff --git a/src/images/SkForceLinking.cpp b/src/images/SkForceLinking.cpp
index 2afe7192a9..e97106fdf8 100644
--- a/src/images/SkForceLinking.cpp
+++ b/src/images/SkForceLinking.cpp
@@ -14,8 +14,7 @@
int SkForceLinking(bool doNotPassTrue) {
if (doNotPassTrue) {
SkASSERT(false);
-#if !defined(SK_BUILD_FOR_MAC) && !defined(SK_BUILD_FOR_WIN) && !defined(SK_BUILD_FOR_IOS) && \
- defined(SK_HAS_JPEG_LIBRARY)
+#if defined(SK_HAS_JPEG_LIBRARY)
CreateJPEGImageEncoder();
#endif
#if defined(SK_HAS_WEBP_LIBRARY)
diff --git a/src/ports/SkImageEncoder_WIC.cpp b/src/ports/SkImageEncoder_WIC.cpp
index ff651d32fa..5523ea2e11 100644
--- a/src/ports/SkImageEncoder_WIC.cpp
+++ b/src/ports/SkImageEncoder_WIC.cpp
@@ -83,56 +83,35 @@ bool SkImageEncoder_WIC::onEncode(SkWStream* stream
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;
+ *dst = SkUnPreMultiply::PMColorToColor(*src);
}
}
-
- pixels = pixelStorage.get();
}
-
//Initialize COM.
SkAutoCoInitialize scopedCo;
if (!scopedCo.succeeded()) {
@@ -205,6 +184,7 @@ bool SkImageEncoder_WIC::onEncode(SkWStream* stream
//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 @@ bool SkImageEncoder_WIC::onEncode(SkWStream* stream
//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 @@ static SkImageEncoder* sk_imageencoder_wic_factory(SkImageEncoder::Type t) {
case SkImageEncoder::kBMP_Type:
case SkImageEncoder::kICO_Type:
case SkImageEncoder::kPNG_Type:
- case SkImageEncoder::kJPEG_Type:
break;
default:
return nullptr;