Chromium Code Reviews| Index: src/images/SkImageDecoder_libgif.cpp |
| diff --git a/src/images/SkImageDecoder_libgif.cpp b/src/images/SkImageDecoder_libgif.cpp |
| index 1d25120da9c7585abbd002a16d724932d57d1595..ffec30bc05f73ecb615fd4b3dba992253f6fe526 100644 |
| --- a/src/images/SkImageDecoder_libgif.cpp |
| +++ b/src/images/SkImageDecoder_libgif.cpp |
| @@ -225,9 +225,9 @@ bool SkGIFImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* bm, Mode mode) { |
| return error_return(gif, *bm, "null cmap"); |
| } |
| + SkPMColor colorPtr[256]; // storage for worse-case |
|
scroggo
2013/10/07 21:58:42
worst*
reed1
2013/10/09 12:19:54
Done.
|
| colorCount = cmap->ColorCount; |
| - SkColorTable* ctable = SkNEW_ARGS(SkColorTable, (colorCount)); |
| - SkPMColor* colorPtr = ctable->lockColors(); |
| + SkAlphaType alphaType = kOpaque_SkAlphaType; |
| for (int index = 0; index < colorCount; index++) |
| colorPtr[index] = SkPackARGB32(0xFF, |
| cmap->Colors[index].Red, |
| @@ -235,13 +235,15 @@ bool SkGIFImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* bm, Mode mode) { |
| cmap->Colors[index].Blue); |
| transpIndex = find_transpIndex(temp_save, colorCount); |
| - if (transpIndex < 0) |
| - ctable->setFlags(ctable->getFlags() | SkColorTable::kColorsAreOpaque_Flag); |
| - else |
| + if (transpIndex >= 0) { |
| + SkASSERT((unsigned)transpIndex < (unsigned)colorCount); |
| colorPtr[transpIndex] = 0; // ram in a transparent SkPMColor |
| - ctable->unlockColors(true); |
| + alphaType = kPremul_SkAlphaType; |
| + } |
| - SkAutoUnref aurts(ctable); |
| + SkAutoTUnref<SkColorTable> ctable(SkNEW_ARGS(SkColorTable, |
| + (colorPtr, colorCount, |
| + alphaType))); |
| if (!this->allocPixelRef(bm, ctable)) { |
| return error_return(gif, *bm, "allocPixelRef"); |
| } |