Index: src/images/SkImageDecoder_libico.cpp |
diff --git a/src/images/SkImageDecoder_libico.cpp b/src/images/SkImageDecoder_libico.cpp |
index 7855546a2ccb5d849e4405c184a6d9a671d99b55..4d19714a11b20c134aa9e6e38c3849529b50f798 100644 |
--- a/src/images/SkImageDecoder_libico.cpp |
+++ b/src/images/SkImageDecoder_libico.cpp |
@@ -20,7 +20,7 @@ public: |
} |
protected: |
- virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode) SK_OVERRIDE; |
+ virtual Result onDecode(SkStream* stream, SkBitmap* bm, Mode) SK_OVERRIDE; |
private: |
typedef SkImageDecoder INHERITED; |
@@ -72,12 +72,12 @@ static int calculateRowBytesFor8888(int w, int bitCount) |
return 0; |
} |
-bool SkICOImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) |
+SkImageDecoder::Result SkICOImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) |
{ |
SkAutoMalloc autoMal; |
const size_t length = SkCopyStreamToStorage(&autoMal, stream); |
if (0 == length) { |
- return false; |
+ return kFailure; |
} |
unsigned char* buf = (unsigned char*)autoMal.get(); |
@@ -86,13 +86,16 @@ bool SkICOImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) |
//incorrect values, but still decode properly? |
int reserved = read2Bytes(buf, 0); // 0 |
int type = read2Bytes(buf, 2); // 1 |
- if (reserved != 0 || type != 1) |
- return false; |
+ if (reserved != 0 || type != 1) { |
+ return kFailure; |
+ } |
+ |
int count = read2Bytes(buf, 4); |
//need to at least have enough space to hold the initial table of info |
- if (length < (size_t)(6 + count*16)) |
- return false; |
+ if (length < (size_t)(6 + count*16)) { |
+ return kFailure; |
+ } |
#ifdef SK_SUPPORT_LEGACY_IMAGEDECODER_CHOOSER |
int choice; |
@@ -137,8 +140,9 @@ bool SkICOImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) |
} |
//you never know what the chooser is going to supply |
- if (choice >= count || choice < 0) |
- return false; |
+ if (choice >= count || choice < 0) { |
+ return kFailure; |
+ } |
#else |
const int choice = 0; // TODO: fold this value into the expressions below |
#endif |
@@ -156,7 +160,7 @@ bool SkICOImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) |
const size_t offset = read4Bytes(buf, 18 + choice*16); |
// promote the sum to 64-bits to avoid overflow |
if (((uint64_t)offset + size) > length) { |
- return false; |
+ return kFailure; |
} |
// Check to see if this is a PNG image inside the ICO |
@@ -165,13 +169,18 @@ bool SkICOImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) |
SkAutoTDelete<SkImageDecoder> otherDecoder(SkImageDecoder::Factory(&subStream)); |
if (otherDecoder.get() != NULL) { |
// Disallow nesting ICO files within one another |
+ // FIXME: Can ICO files contain other formats besides PNG? |
if (otherDecoder->getFormat() == SkImageDecoder::kICO_Format) { |
- return false; |
+ return kFailure; |
} |
// 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; |
+ const Result result = otherDecoder->decode(&subStream, bm, this->getDefaultPref(), |
+ mode); |
+ // FIXME: Should we just return result here? Is it possible that data that looked like |
+ // a subimage was not, but was actually a valid ICO? |
+ if (result != kFailure) { |
+ return result; |
} |
} |
} |
@@ -209,7 +218,7 @@ bool SkICOImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) |
break; |
default: |
SkDEBUGF(("Decoding %ibpp is unimplemented\n", bitCount)); |
- return false; |
+ return kFailure; |
} |
//these should all be zero, but perhaps are not - need to check |
@@ -260,13 +269,13 @@ bool SkICOImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) |
if (SkImageDecoder::kDecodeBounds_Mode == mode) { |
delete[] colors; |
- return true; |
+ return kSuccess; |
} |
if (!this->allocPixelRef(bm, NULL)) |
{ |
delete[] colors; |
- return false; |
+ return kFailure; |
} |
SkAutoLockPixels alp(*bm); |
@@ -296,7 +305,7 @@ bool SkICOImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) |
//ensure we haven't read off the end? |
//of course this doesn't help us if the andOffset was a lie... |
//return andOffset + (andLineWidth >> 3) <= length; |
- return true; |
+ return kSuccess; |
} //onDecode |
//function to place the pixel, determined by the bitCount |