Chromium Code Reviews| 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; |
| } |