From 0a6151d66cc32d91eca037c91e557158cf8a2be2 Mon Sep 17 00:00:00 2001 From: "reed@google.com" Date: Thu, 10 Oct 2013 14:44:56 +0000 Subject: Revert "Revert "change SkColorTable to be immutable"" This reverts commit b8162cb840f4cb6002ef68d5ac775c6a122c52a9. Fixed was call-sites in benches that used the (now gone) setIsOpaque api. R=scroggo@google.com Review URL: https://codereview.chromium.org/26572006 git-svn-id: http://skia.googlecode.com/svn/trunk@11695 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/images/SkImageDecoder_libpng.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'src/images/SkImageDecoder_libpng.cpp') diff --git a/src/images/SkImageDecoder_libpng.cpp b/src/images/SkImageDecoder_libpng.cpp index 4e4106aede..951083b0f4 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,17 +658,16 @@ 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]; // worst-case storage + 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; @@ -692,7 +689,7 @@ bool SkPNGImageDecoder::decodePalette(png_structp png_ptr, png_infop info_ptr, *colorPtr++ = proc(*trans++, palette->red, palette->green, palette->blue); palette++; } - reallyHasAlpha |= (transLessThanFF < 0); + bool reallyHasAlpha = (transLessThanFF < 0); for (; index < numPalette; index++) { *colorPtr++ = SkPackARGB32(0xFF, palette->red, palette->green, palette->blue); @@ -703,8 +700,18 @@ bool SkPNGImageDecoder::decodePalette(png_structp png_ptr, png_infop info_ptr, if (numPalette < 256) { *colorPtr = colorPtr[-1]; } - colorTable->unlockColors(true); - *colorTablep = colorTable; + + SkAlphaType alphaType = kOpaque_SkAlphaType; + if (reallyHasAlpha) { + if (this->getRequireUnpremultipliedColors()) { + alphaType = kUnpremul_SkAlphaType; + } else { + alphaType = kPremul_SkAlphaType; + } + } + + *colorTablep = SkNEW_ARGS(SkColorTable, + (colorStorage, colorCount, alphaType)); *reallyHasAlphap = reallyHasAlpha; return true; } -- cgit v1.2.3