Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(999)

Unified Diff: src/core/SkPicturePlayback.cpp

Issue 138063005: Serialization of SkPictureImageFilter (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
+}
+
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

Powered by Google App Engine
This is Rietveld 408576698