Index: src/core/SkPicturePlayback.cpp |
diff --git a/src/core/SkPicturePlayback.cpp b/src/core/SkPicturePlayback.cpp |
index 27f0c58c6de9cf4d5ec6edc0c53bbb1b39769e79..eecaf6450294c3e05c082df903be27bd6551bf3d 100644 |
--- a/src/core/SkPicturePlayback.cpp |
+++ b/src/core/SkPicturePlayback.cpp |
@@ -334,7 +334,7 @@ bool SkPicturePlayback::containsBitmaps() const { |
#include "SkStream.h" |
-static void writeTagSize(SkOrderedWriteBuffer& buffer, uint32_t tag, |
+static void writeTagSize(SkFlattenableWriteBuffer& buffer, uint32_t tag, |
uint32_t size) { |
buffer.writeUInt(tag); |
buffer.writeUInt(size); |
@@ -382,7 +382,7 @@ static void writeTypefaces(SkWStream* stream, const SkRefCntSet& rec) { |
} |
} |
-void SkPicturePlayback::flattenToBuffer(SkOrderedWriteBuffer& buffer) const { |
+void SkPicturePlayback::flattenToBuffer(SkFlattenableWriteBuffer& buffer) const { |
int i, n; |
if ((n = SafeCount(fBitmaps)) > 0) { |
@@ -459,6 +459,22 @@ void SkPicturePlayback::serialize(SkWStream* stream, |
stream->write32(PICT_EOF_TAG); |
} |
+void SkPicturePlayback::flatten(SkFlattenableWriteBuffer& buffer) const { |
+ writeTagSize(buffer, PICT_READER_TAG, fOpData->size()); |
+ buffer.writeByteArray(fOpData->bytes(), fOpData->size()); |
+ |
+ if (fPictureCount > 0) { |
+ writeTagSize(buffer, PICT_PICTURE_TAG, fPictureCount); |
+ for (int i = 0; i < fPictureCount; i++) { |
+ fPictureRefs[i]->flatten(buffer); |
+ } |
+ } |
+ |
+ // Write some of our data into a writebuffer |
+ this->flattenToBuffer(buffer); |
+ buffer.write32(PICT_EOF_TAG); |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
/** |
@@ -581,7 +597,7 @@ bool SkPicturePlayback::parseStreamTag(SkStream* stream, const SkPictInfo& info, |
return true; // success |
} |
-bool SkPicturePlayback::parseBufferTag(SkOrderedReadBuffer& buffer, |
+bool SkPicturePlayback::parseBufferTag(SkFlattenableReadBuffer& buffer, |
uint32_t tag, size_t size) { |
switch (tag) { |
case PICT_BITMAP_BUFFER_TAG: { |
@@ -633,6 +649,15 @@ SkPicturePlayback* SkPicturePlayback::CreateFromStream(SkStream* stream, |
return playback.detach(); |
} |
+SkPicturePlayback* SkPicturePlayback::CreateFromBuffer(SkFlattenableReadBuffer& buffer) { |
+ SkAutoTDelete<SkPicturePlayback> playback(SkNEW(SkPicturePlayback)); |
+ |
+ if (!playback->parseBuffer(buffer)) { |
+ return NULL; |
+ } |
+ return playback.detach(); |
+} |
+ |
bool SkPicturePlayback::parseStream(SkStream* stream, const SkPictInfo& info, |
SkPicture::InstallPixelRefProc proc) { |
for (;;) { |
@@ -649,6 +674,21 @@ bool SkPicturePlayback::parseStream(SkStream* stream, const SkPictInfo& info, |
return true; |
} |
+bool SkPicturePlayback::parseBuffer(SkFlattenableReadBuffer& buffer) { |
+ for (;;) { |
+ uint32_t tag = buffer.readUInt(); |
+ if (PICT_EOF_TAG == tag) { |
+ break; |
+ } |
+ |
+ uint32_t size = buffer.readUInt(); |
+ if (!this->parseBufferTag(buffer, tag, size)) { |
+ return false; // we're invalid |
+ } |
+ } |
+ return true; |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////// |
/////////////////////////////////////////////////////////////////////////////// |