Chromium Code Reviews| Index: src/core/SkOrderedReadBuffer.cpp |
| diff --git a/src/core/SkOrderedReadBuffer.cpp b/src/core/SkOrderedReadBuffer.cpp |
| index 85491c5607545b04f8c48652399a611b3524cd21..a5be45eab1bed3f76aa9f8d6ae0fe547acc81a6d 100644 |
| --- a/src/core/SkOrderedReadBuffer.cpp |
| +++ b/src/core/SkOrderedReadBuffer.cpp |
| @@ -23,6 +23,7 @@ SkOrderedReadBuffer::SkOrderedReadBuffer() : INHERITED() { |
| fFactoryArray = NULL; |
| fFactoryCount = 0; |
| fBitmapDecoder = NULL; |
| + fPictureVersion = SkPicture::PICTURE_VERSION; |
| } |
| SkOrderedReadBuffer::SkOrderedReadBuffer(const void* data, size_t size) : INHERITED() { |
| @@ -37,6 +38,7 @@ SkOrderedReadBuffer::SkOrderedReadBuffer(const void* data, size_t size) : INHERI |
| fFactoryArray = NULL; |
| fFactoryCount = 0; |
| fBitmapDecoder = NULL; |
| + fPictureVersion = SkPicture::PICTURE_VERSION; |
| } |
| SkOrderedReadBuffer::SkOrderedReadBuffer(SkStream* stream) { |
| @@ -53,6 +55,7 @@ SkOrderedReadBuffer::SkOrderedReadBuffer(SkStream* stream) { |
| fFactoryArray = NULL; |
| fFactoryCount = 0; |
| fBitmapDecoder = NULL; |
| + fPictureVersion = SkPicture::PICTURE_VERSION; |
| } |
| SkOrderedReadBuffer::~SkOrderedReadBuffer() { |
| @@ -168,52 +171,88 @@ uint32_t SkOrderedReadBuffer::getArrayCount() { |
| return *(uint32_t*)fReader.peek(); |
| } |
| +void SkOrderedReadBuffer::setPictureVersion(uint32_t version) { |
| + SkASSERT(version <= SkPicture::PICTURE_VERSION); |
| + fPictureVersion = version; |
| +} |
| + |
| void SkOrderedReadBuffer::readBitmap(SkBitmap* bitmap) { |
| - 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. |
| + if (10 == fPictureVersion) { |
|
scroggo
2013/04/29 18:50:41
codereview makes this unobvious, but the only chan
|
| + // Old code to read a bitmap in PICTURE_VERSION 10 |
| const size_t length = this->readUInt(); |
| if (length > 0) { |
| - // A non-zero size means the SkBitmap was encoded. |
| + // 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); |
| + } else { |
| + // This bitmap was encoded when written, but we are unable to decode, possibly due to |
|
scroggo
2013/04/29 18:50:41
100 chars
|
| + // not having a decoder. Use a placeholder bitmap. |
| + SkErrorInternals::SetError(kParseError_SkError, |
| + "Could not decode bitmap. Resulting bitmap will be red."); |
|
scroggo
2013/04/29 18:50:41
100 chars
|
| + 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 { |
| + bitmap->unflatten(*this); |
| + } |
| + } |
| + } else { |
| + 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 |
|
scroggo
2013/04/29 18:50:41
100 chars
|
| + // 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."); |
| } |
| - // This bitmap was encoded when written, but we are unable to decode, possibly due to |
| - // not having a decoder. |
| - SkErrorInternals::SetError(kParseError_SkError, |
| - "Could not decode bitmap. Resulting bitmap will be red."); |
| } else { |
| - // A size of zero means the SkBitmap was simply flattened. |
| - bitmap->unflatten(*this); |
| - return; |
| + // 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 |
|
scroggo
2013/04/29 18:50:41
100 chars
|
| + // not having a decoder. |
| + SkErrorInternals::SetError(kParseError_SkError, |
| + "Could not decode bitmap. Resulting bitmap will be red."); |
|
scroggo
2013/04/29 18:50:41
100 chars
|
| + } 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); |
| } |
| - // 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() { |