Index: src/images/SkImageDecoder_libpng.cpp |
diff --git a/src/images/SkImageDecoder_libpng.cpp b/src/images/SkImageDecoder_libpng.cpp |
index 4e4106aede85f8266c3b9ffd234e025f9f6a0e02..baab8946c7fa5cd3380556eb84e546e20eddaf3a 100644 |
--- a/src/images/SkImageDecoder_libpng.cpp |
+++ b/src/images/SkImageDecoder_libpng.cpp |
@@ -648,8 +648,6 @@ bool SkPNGImageDecoder::decodePalette(png_structp png_ptr, png_infop info_ptr, |
png_colorp palette; |
png_bytep trans; |
int numTrans; |
- bool reallyHasAlpha = false; |
- SkColorTable* colorTable = NULL; |
png_get_PLTE(png_ptr, info_ptr, &palette, &numPalette); |
@@ -660,21 +658,20 @@ bool SkPNGImageDecoder::decodePalette(png_structp png_ptr, png_infop info_ptr, |
the colortable by 1 (if its < 256) and duplicate the last color into that slot. |
*/ |
int colorCount = numPalette + (numPalette < 256); |
+ SkPMColor colorStorage[256]; // worse-case storage |
scroggo
2013/10/07 21:58:42
worst*
reed1
2013/10/09 12:19:54
Done.
|
+ SkPMColor* colorPtr = colorStorage; |
- colorTable = SkNEW_ARGS(SkColorTable, (colorCount)); |
- |
- SkPMColor* colorPtr = colorTable->lockColors(); |
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { |
png_get_tRNS(png_ptr, info_ptr, &trans, &numTrans, NULL); |
*hasAlphap = (numTrans > 0); |
} else { |
numTrans = 0; |
- colorTable->setFlags(colorTable->getFlags() | SkColorTable::kColorsAreOpaque_Flag); |
} |
// check for bad images that might make us crash |
if (numTrans > numPalette) { |
numTrans = numPalette; |
} |
+ bool reallyHasAlpha = numTrans > 0; |
scroggo
2013/10/07 21:58:42
This is going to change the behavior. Previously,
reed1
2013/10/09 12:19:54
Fixed
scroggo
2013/10/09 16:05:23
Still not fixed. Counterexample:
- numTrans > 0
-
reed1
2013/10/09 16:16:36
Done.
|
int index = 0; |
int transLessThanFF = 0; |
@@ -703,8 +700,10 @@ bool SkPNGImageDecoder::decodePalette(png_structp png_ptr, png_infop info_ptr, |
if (numPalette < 256) { |
*colorPtr = colorPtr[-1]; |
} |
- colorTable->unlockColors(true); |
- *colorTablep = colorTable; |
+ |
+ SkAlphaType alphaType = reallyHasAlpha ? kPremul_SkAlphaType : kOpaque_SkAlphaType; |
scroggo
2013/10/07 21:58:42
You need to check getRequireUnpremultipliedColors
reed1
2013/10/09 12:19:54
Fixed
|
+ *colorTablep = SkNEW_ARGS(SkColorTable, |
+ (colorStorage, colorCount, alphaType)); |
*reallyHasAlphap = reallyHasAlpha; |
return true; |
} |