Index: src/core/SkOrderedReadBuffer.cpp |
diff --git a/src/core/SkOrderedReadBuffer.cpp b/src/core/SkOrderedReadBuffer.cpp |
index 5a4cf96a9243cfc54203d6121da4f772b6f87ab7..85491c5607545b04f8c48652399a611b3524cd21 100644 |
--- a/src/core/SkOrderedReadBuffer.cpp |
+++ b/src/core/SkOrderedReadBuffer.cpp |
@@ -169,33 +169,51 @@ uint32_t SkOrderedReadBuffer::getArrayCount() { |
} |
void SkOrderedReadBuffer::readBitmap(SkBitmap* bitmap) { |
- const size_t length = this->readUInt(); |
- if (length > 0) { |
- // Bitmap was encoded. |
- const void* data = this->skip(length); |
- const int width = this->readInt(); |
- const int height = this->readInt(); |
- if (fBitmapDecoder != NULL && fBitmapDecoder(data, length, bitmap)) { |
- SkASSERT(bitmap->width() == width && bitmap->height() == height); |
+ const int width = this->readInt(); |
+ const int height = this->readInt(); |
+ // The writer stored a boolean value to determine whether an SkBitmapHeap was used during |
+ // writing. |
+ if (this->readBool()) { |
+ // An SkBitmapHeap was used for writing. Read the index from the stream and find the |
+ // corresponding SkBitmap in fBitmapStorage. |
+ const uint32_t index = fReader.readU32(); |
+ fReader.readU32(); // bitmap generation ID (see SkOrderedWriteBuffer::writeBitmap) |
+ if (fBitmapStorage) { |
+ *bitmap = *fBitmapStorage->getBitmap(index); |
+ fBitmapStorage->releaseRef(index); |
+ return; |
} else { |
+ // The bitmap was stored in a heap, but there is no way to access it. Set an error and |
+ // fall through to use a place holder bitmap. |
+ SkErrorInternals::SetError(kParseError_SkError, "SkOrderedWriteBuffer::writeBitmap " |
+ "stored the SkBitmap in an SkBitmapHeap, but " |
+ "SkOrderedReadBuffer has no SkBitmapHeapReader to " |
+ "retrieve the SkBitmap."); |
+ } |
+ } else { |
+ // The writer stored false, meaning the SkBitmap was not stored in an SkBitmapHeap. |
+ const size_t length = this->readUInt(); |
+ if (length > 0) { |
+ // A non-zero size means the SkBitmap was encoded. |
+ const void* data = this->skip(length); |
+ if (fBitmapDecoder != NULL && fBitmapDecoder(data, length, bitmap)) { |
+ SkASSERT(bitmap->width() == width && bitmap->height() == height); |
+ return; |
+ } |
// This bitmap was encoded when written, but we are unable to decode, possibly due to |
- // not having a decoder. Use a placeholder bitmap. |
+ // not having a decoder. |
SkErrorInternals::SetError(kParseError_SkError, |
"Could not decode bitmap. Resulting bitmap will be red."); |
- bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height); |
- bitmap->allocPixels(); |
- bitmap->eraseColor(SK_ColorRED); |
- } |
- } else { |
- if (fBitmapStorage) { |
- const uint32_t index = fReader.readU32(); |
- fReader.readU32(); // bitmap generation ID (see SkOrderedWriteBuffer::writeBitmap) |
- *bitmap = *fBitmapStorage->getBitmap(index); |
- fBitmapStorage->releaseRef(index); |
} else { |
+ // A size of zero means the SkBitmap was simply flattened. |
bitmap->unflatten(*this); |
+ return; |
} |
} |
+ // Could not read the SkBitmap. Use a placeholder bitmap. |
+ bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height); |
+ bitmap->allocPixels(); |
+ bitmap->eraseColor(SK_ColorRED); |
} |
SkTypeface* SkOrderedReadBuffer::readTypeface() { |