Index: src/codec/SkBmpStandardCodec.cpp |
diff --git a/src/codec/SkBmpStandardCodec.cpp b/src/codec/SkBmpStandardCodec.cpp |
index fd4d6d18bc2d3df2ea6366554dc3bf56ec72700e..cb108681731e2d4b9452b95b803412b0b5f01262 100644 |
--- a/src/codec/SkBmpStandardCodec.cpp |
+++ b/src/codec/SkBmpStandardCodec.cpp |
@@ -20,7 +20,7 @@ SkBmpStandardCodec::SkBmpStandardCodec(const SkImageInfo& info, SkStream* stream |
SkCodec::SkScanlineOrder rowOrder, bool inIco) |
: INHERITED(info, stream, bitsPerPixel, rowOrder) |
, fColorTable(nullptr) |
- , fNumColors(this->computeNumColors(numColors)) |
+ , fNumColors(numColors) |
, fBytesPerColor(bytesPerColor) |
, fOffset(offset) |
, fSwizzler(nullptr) |
@@ -82,9 +82,12 @@ SkCodec::Result SkBmpStandardCodec::onGetPixels(const SkImageInfo& dstInfo, |
// access memory outside of our color table array. |
*numColors = maxColors; |
} |
+ // Don't bother reading more than maxColors. |
+ const uint32_t numColorsToRead = |
+ fNumColors == 0 ? maxColors : SkTMin(fNumColors, maxColors); |
// Read the color table from the stream |
- colorBytes = fNumColors * fBytesPerColor; |
+ colorBytes = numColorsToRead * fBytesPerColor; |
SkAutoTDeleteArray<uint8_t> cBuffer(new uint8_t[colorBytes]); |
if (stream()->read(cBuffer.get(), colorBytes) != colorBytes) { |
SkCodecPrintf("Error: unable to read color table.\n"); |
@@ -112,7 +115,7 @@ SkCodec::Result SkBmpStandardCodec::onGetPixels(const SkImageInfo& dstInfo, |
// Fill in the color table |
uint32_t i = 0; |
- for (; i < fNumColors; i++) { |
+ for (; i < numColorsToRead; i++) { |
uint8_t blue = get_byte(cBuffer.get(), i*fBytesPerColor); |
uint8_t green = get_byte(cBuffer.get(), i*fBytesPerColor + 1); |
uint8_t red = get_byte(cBuffer.get(), i*fBytesPerColor + 2); |