Chromium Code Reviews| Index: src/core/SkPictureData.cpp |
| diff --git a/src/core/SkPictureData.cpp b/src/core/SkPictureData.cpp |
| index 5089e5d8d6240f7d3542a933ddef3d7c9e688373..9d497f676aba19faf14579eb2e42f05a4c679a6d 100644 |
| --- a/src/core/SkPictureData.cpp |
| +++ b/src/core/SkPictureData.cpp |
| @@ -5,6 +5,7 @@ |
| * found in the LICENSE file. |
| */ |
| #include <new> |
| +#include "SkImageGenerator.h" |
| #include "SkPictureData.h" |
| #include "SkPictureRecord.h" |
| #include "SkReadBuffer.h" |
| @@ -433,6 +434,20 @@ bool SkPictureData::parseStreamTag(SkStream* stream, |
| return true; // success |
| } |
| +namespace { |
| + |
| +// This generator intentionally should always fail on all attempts to get its pixels, |
|
scroggo
2015/09/04 18:48:20
FWIW, we used to show deserialize such failed enco
|
| +// simulating a bad or empty codec stream. |
| +class EmptyImageGenerator final : public SkImageGenerator { |
| +public: |
| + EmptyImageGenerator(const SkImageInfo& info) : INHERITED(info) { } |
| + |
| +private: |
| + typedef SkImageGenerator INHERITED; |
| +}; |
| + |
| +} // anonymous namespace |
| + |
| static const SkImage* create_image_from_buffer(SkReadBuffer& buffer) { |
| int width = buffer.read32(); |
| int height = buffer.read32(); |
| @@ -442,9 +457,15 @@ static const SkImage* create_image_from_buffer(SkReadBuffer& buffer) { |
| } |
| SkAutoTUnref<SkData> encoded(buffer.readByteArrayAsData()); |
| + if (encoded->size() == 0) { |
| + // The image could not be encoded at serialization time - return an empty placeholder. |
| + return SkImage::NewFromGenerator( |
| + new EmptyImageGenerator(SkImageInfo::MakeN32Premul(width, height))); |
| + } |
| + |
| int originX = buffer.read32(); |
| int originY = buffer.read32(); |
| - if (0 == encoded->size() || originX < 0 || originY < 0) { |
| + if (originX < 0 || originY < 0) { |
| buffer.validate(false); |
| return nullptr; |
| } |