Index: src/core/SkWriteBuffer.cpp |
diff --git a/src/core/SkWriteBuffer.cpp b/src/core/SkWriteBuffer.cpp |
index d2eb8c5d8d234c7aaaf7b491b7e8a78d93c8628e..82e031e461b4f1b4e6b81d6229d1ba6d661e5fa7 100644 |
--- a/src/core/SkWriteBuffer.cpp |
+++ b/src/core/SkWriteBuffer.cpp |
@@ -218,6 +218,35 @@ void SkWriteBuffer::writeBitmap(const SkBitmap& bitmap) { |
SkBitmap::WriteRawPixels(this, bitmap); |
} |
+static bool try_write_encoded(SkWriteBuffer* buffer, SkData* encoded, SkIPoint origin) { |
+ SkPixelSerializer* ps = buffer->getPixelSerializer(); |
+ // Assumes that if the client did not set a serializer, they are |
+ // happy to get the encoded data. |
+ if (!ps || ps->useEncodedData(encoded->data(), encoded->size())) { |
+ write_encoded_bitmap(buffer, encoded, origin); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+void SkWriteBuffer::writeImage(const SkImage* image) { |
+ this->writeInt(image->width()); |
+ this->writeInt(image->height()); |
+ |
+ SkIPoint origin; |
+ SkAutoTUnref<SkData> encoded(image->refEncodedData(&origin)); |
+ if (encoded && try_write_encoded(this, encoded, origin)) { |
+ return; |
+ } |
+ |
+ encoded.reset(image->encode(SkImageEncoder::kPNG_Type, 100)); |
+ if (encoded && try_write_encoded(this, encoded, SkIPoint::Make(0, 0))) { |
+ return; |
+ } |
+ |
+ this->writeUInt(0); // signal no pixels |
+} |
+ |
void SkWriteBuffer::writeTypeface(SkTypeface* obj) { |
if (NULL == obj || NULL == fTFSet) { |
fWriter.write32(0); |