Index: src/images/SkImageDecoder_libico.cpp |
diff --git a/src/images/SkImageDecoder_libico.cpp b/src/images/SkImageDecoder_libico.cpp |
index 195b6ff08b9338ee4c4502b4efb6f5b5a2c31785..04978b00c19333b8b37ed3c3eda0248086f68605 100644 |
--- a/src/images/SkImageDecoder_libico.cpp |
+++ b/src/images/SkImageDecoder_libico.cpp |
@@ -152,6 +152,20 @@ bool SkICOImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) |
int offset = read4Bytes(buf, 18 + choice*16); |
if ((size_t)(offset + size) > length) |
return false; |
+ |
+ // Check to see if this is a PNG image inside the ICO |
+ { |
+ SkMemoryStream subStream(buf + offset, size, false); |
+ SkAutoTDelete<SkImageDecoder> otherDecoder(SkImageDecoder::Factory(&subStream)); |
+ if (otherDecoder.get() != NULL) { |
+ // Set fields on the other decoder to be the same as this one. |
+ this->copyFieldsToOther(otherDecoder.get()); |
+ if(otherDecoder->decode(&subStream, bm, this->getDefaultPref(), mode)) { |
+ return true; |
+ } |
+ } |
+ } |
+ |
//int infoSize = read4Bytes(buf, offset); //40 |
//int width = read4Bytes(buf, offset+4); //should == w |
//int height = read4Bytes(buf, offset+8); //should == 2*h |