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"); |
} |