Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(610)

Unified Diff: src/images/SkImageDecoder_libpng.cpp

Issue 26210007: Image decoder fixes (mostly) around A8. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Rebase Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/images/SkImageDecoder_libjpeg.cpp ('k') | src/images/SkScaledBitmapSampler.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/images/SkImageDecoder_libpng.cpp
diff --git a/src/images/SkImageDecoder_libpng.cpp b/src/images/SkImageDecoder_libpng.cpp
index e54387af34cf960f143a9963d857fd100e7bba73..4047fea85098fb4e30398309073ad15199bdddaf 100644
--- a/src/images/SkImageDecoder_libpng.cpp
+++ b/src/images/SkImageDecoder_libpng.cpp
@@ -372,9 +372,14 @@ bool SkPNGImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* decodedBitmap,
if ((SkBitmap::kA8_Config == config || SkBitmap::kIndex8_Config == config)
&& 1 == sampleSize) {
- // A8 is only allowed if the original was GRAY.
- SkASSERT(config != SkBitmap::kA8_Config
- || PNG_COLOR_TYPE_GRAY == colorType);
+ if (SkBitmap::kA8_Config == config) {
+ // For an A8 bitmap, we assume there is an alpha for speed. It is
+ // possible the bitmap is opaque, but that is an unlikely use case
+ // since it would not be very interesting.
+ reallyHasAlpha = true;
+ // A8 is only allowed if the original was GRAY.
+ SkASSERT(PNG_COLOR_TYPE_GRAY == colorType);
+ }
for (int i = 0; i < number_passes; i++) {
for (png_uint_32 y = 0; y < origHeight; y++) {
uint8_t* bmRow = decodedBitmap->getAddr8(0, y);
@@ -456,17 +461,22 @@ bool SkPNGImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* decodedBitmap,
if (0 != theTranspColor) {
reallyHasAlpha |= substituteTranspColor(decodedBitmap, theTranspColor);
}
- if (reallyHasAlpha && this->getRequireUnpremultipliedColors() &&
- SkBitmap::kARGB_8888_Config != decodedBitmap->config()) {
- // If the caller wants an unpremultiplied bitmap, and we let them get
- // away with a config other than 8888, and it has alpha after all,
- // return false, since the result will have premultiplied colors.
- return false;
- }
- if (SkBitmap::kA8_Config == decodedBitmap->config()) {
- reallyHasAlpha = true;
+ if (reallyHasAlpha && this->getRequireUnpremultipliedColors()) {
+ switch (decodedBitmap->config()) {
+ case SkBitmap::kIndex8_Config:
+ // Fall through.
+ case SkBitmap::kARGB_4444_Config:
+ // We have chosen not to support unpremul for these configs.
+ return false;
+ default: {
+ // Fall through to finish the decode. This config either
+ // supports unpremul or it is irrelevant because it has no
+ // alpha (or only alpha).
+ // These brackets prevent a warning.
+ }
+ }
}
-
+
SkAlphaType alphaType = kOpaque_SkAlphaType;
if (reallyHasAlpha) {
if (this->getRequireUnpremultipliedColors()) {
@@ -852,9 +862,14 @@ bool SkPNGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) {
if ((SkBitmap::kA8_Config == config || SkBitmap::kIndex8_Config == config)
&& 1 == sampleSize) {
- // A8 is only allowed if the original was GRAY.
- SkASSERT(config != SkBitmap::kA8_Config
- || PNG_COLOR_TYPE_GRAY == colorType);
+ if (SkBitmap::kA8_Config == config) {
+ // For an A8 bitmap, we assume there is an alpha for speed. It is
+ // possible the bitmap is opaque, but that is an unlikely use case
+ // since it would not be very interesting.
+ reallyHasAlpha = true;
+ // A8 is only allowed if the original was GRAY.
+ SkASSERT(PNG_COLOR_TYPE_GRAY == colorType);
+ }
for (int i = 0; i < number_passes; i++) {
png_configure_decoder(png_ptr, &actualTop, i);
@@ -945,8 +960,20 @@ bool SkPNGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) {
if (0 != theTranspColor) {
reallyHasAlpha |= substituteTranspColor(&decodedBitmap, theTranspColor);
}
- if (SkBitmap::kA8_Config == decodedBitmap.config()) {
- reallyHasAlpha = true;
+ if (reallyHasAlpha && this->getRequireUnpremultipliedColors()) {
+ switch (decodedBitmap.config()) {
+ case SkBitmap::kIndex8_Config:
+ // Fall through.
+ case SkBitmap::kARGB_4444_Config:
+ // We have chosen not to support unpremul for these configs.
+ return false;
+ default: {
+ // Fall through to finish the decode. This config either
+ // supports unpremul or it is irrelevant because it has no
+ // alpha (or only alpha).
+ // These brackets prevent a warning.
+ }
+ }
}
SkAlphaType alphaType = kOpaque_SkAlphaType;
if (reallyHasAlpha) {
« no previous file with comments | « src/images/SkImageDecoder_libjpeg.cpp ('k') | src/images/SkScaledBitmapSampler.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698