Index: src/images/SkImageDecoder_libwebp.cpp |
diff --git a/src/images/SkImageDecoder_libwebp.cpp b/src/images/SkImageDecoder_libwebp.cpp |
index 95b9a97878f381c6244279f6c7e4833c5afc81a5..9cf84493ad89b4c555539fc0b24825a212b24a5d 100644 |
--- a/src/images/SkImageDecoder_libwebp.cpp |
+++ b/src/images/SkImageDecoder_libwebp.cpp |
@@ -114,7 +114,17 @@ protected: |
virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode) SK_OVERRIDE; |
private: |
+ /** |
+ * Called when determining the output config to request to webp. |
+ * If the image does not have alpha, there is no need to premultiply. |
+ * If the caller wants unpremultiplied colors, that is respected. |
+ */ |
+ bool shouldPremultiply() const { |
+ return SkToBool(fHasAlpha) && !this->getRequireUnpremultipliedColors(); |
+ } |
+ |
bool setDecodeConfig(SkBitmap* decodedBitmap, int width, int height); |
+ |
SkStream* fInputStream; |
int fOrigWidth; |
int fOrigHeight; |
@@ -157,18 +167,16 @@ static bool return_false(const SkBitmap& bm, const char msg[]) { |
return false; // must always return false |
} |
-static WEBP_CSP_MODE webp_decode_mode(const SkBitmap* decodedBitmap, int hasAlpha) { |
+static WEBP_CSP_MODE webp_decode_mode(const SkBitmap* decodedBitmap, bool premultiply) { |
WEBP_CSP_MODE mode = MODE_LAST; |
SkBitmap::Config config = decodedBitmap->config(); |
- // For images that have alpha, choose appropriate color mode (MODE_rgbA, |
- // MODE_rgbA_4444) that pre-multiplies RGB pixel values with transparency |
- // factor (alpha). |
+ |
if (config == SkBitmap::kARGB_8888_Config) { |
- mode = hasAlpha ? MODE_rgbA : MODE_RGBA; |
+ mode = premultiply ? MODE_rgbA : MODE_RGBA; |
} else if (config == SkBitmap::kARGB_4444_Config) { |
- mode = hasAlpha ? MODE_rgbA_4444 : MODE_RGBA_4444; |
+ mode = premultiply ? MODE_rgbA_4444 : MODE_RGBA_4444; |
} else if (config == SkBitmap::kRGB_565_Config) { |
- mode = MODE_RGB_565; |
+ mode = MODE_RGB_565; |
} |
SkASSERT(MODE_LAST != mode); |
return mode; |
@@ -224,8 +232,8 @@ static bool webp_idecode(SkStream* stream, WebPDecoderConfig* config) { |
static bool webp_get_config_resize(WebPDecoderConfig* config, |
SkBitmap* decodedBitmap, |
- int width, int height, int hasAlpha) { |
- WEBP_CSP_MODE mode = webp_decode_mode(decodedBitmap, hasAlpha); |
+ int width, int height, bool premultiply) { |
+ WEBP_CSP_MODE mode = webp_decode_mode(decodedBitmap, premultiply); |
if (MODE_LAST == mode) { |
return false; |
} |
@@ -251,10 +259,10 @@ static bool webp_get_config_resize(WebPDecoderConfig* config, |
static bool webp_get_config_resize_crop(WebPDecoderConfig* config, |
SkBitmap* decodedBitmap, |
- const SkIRect& region, int hasAlpha) { |
+ const SkIRect& region, bool premultiply) { |
if (!webp_get_config_resize(config, decodedBitmap, region.width(), |
- region.height(), hasAlpha)) { |
+ region.height(), premultiply)) { |
return false; |
} |
@@ -372,7 +380,8 @@ bool SkWEBPImageDecoder::onDecodeSubset(SkBitmap* decodedBitmap, |
SkAutoLockPixels alp(*bitmap); |
WebPDecoderConfig config; |
- if (!webp_get_config_resize_crop(&config, bitmap, rect, fHasAlpha)) { |
+ if (!webp_get_config_resize_crop(&config, bitmap, rect, |
+ this->shouldPremultiply())) { |
return false; |
} |
@@ -430,7 +439,7 @@ bool SkWEBPImageDecoder::onDecode(SkStream* stream, SkBitmap* decodedBitmap, |
WebPDecoderConfig config; |
if (!webp_get_config_resize(&config, decodedBitmap, origWidth, origHeight, |
- hasAlpha)) { |
+ this->shouldPremultiply())) { |
return false; |
} |