| 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;
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|