diff options
author | reed <reed@google.com> | 2016-08-11 03:55:15 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-08-11 03:55:15 -0700 |
commit | a9ca05ca5e604b9ee18e9cce19b059085ca0e22c (patch) | |
tree | b8b28257068935dc55c956c41ff2e3d899e031c7 /src/core/SkPictureData.cpp | |
parent | 286a8657da0364006e95cb0988477cc3a5f0e112 (diff) |
Deserialize pictures with custom image-deserializer
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2187613002
Review-Url: https://codereview.chromium.org/2187613002
Diffstat (limited to 'src/core/SkPictureData.cpp')
-rw-r--r-- | src/core/SkPictureData.cpp | 42 |
1 files changed, 18 insertions, 24 deletions
diff --git a/src/core/SkPictureData.cpp b/src/core/SkPictureData.cpp index 1e946aaa97..8c641097dc 100644 --- a/src/core/SkPictureData.cpp +++ b/src/core/SkPictureData.cpp @@ -43,7 +43,6 @@ SkPictureData::SkPictureData(const SkPictureRecord& record, fContentInfo.set(record.fContentInfo); - fBitmaps.reset(); // we never make bitmaps (anymore) during recording fPaints = record.fPaints; fPaths.reset(record.fPaths.count()); @@ -135,7 +134,7 @@ SkPictureData::~SkPictureData() { } bool SkPictureData::containsBitmaps() const { - if (fBitmaps.count() > 0 || fImageCount > 0) { + if (fBitmapImageCount > 0 || fImageCount > 0) { return true; } for (int i = 0; i < fPictureCount; ++i) { @@ -223,9 +222,6 @@ void SkPictureData::WriteTypefaces(SkWStream* stream, const SkRefCntSet& rec) { void SkPictureData::flattenToBuffer(SkWriteBuffer& buffer) const { int i, n; - // we never record bitmaps anymore, only images - SkASSERT(fBitmaps.count() == 0); - if ((n = fPaints.count()) > 0) { write_tag_size(buffer, SK_PICT_PAINT_BUFFER_TAG, n); for (i = 0; i < n; i++) { @@ -361,7 +357,7 @@ static uint32_t pictInfoFlagsToReadBufferFlags(uint32_t pictInfoFlags) { bool SkPictureData::parseStreamTag(SkStream* stream, uint32_t tag, uint32_t size, - SkPicture::InstallPixelRefProc proc, + SkImageDeserializer* factory, SkTypefacePlayback* topLevelTFPlayback) { /* * By the time we encounter BUFFER_SIZE_TAG, we need to have already seen @@ -414,7 +410,7 @@ bool SkPictureData::parseStreamTag(SkStream* stream, fPictureCount = 0; fPictureRefs = new const SkPicture* [size]; for (uint32_t i = 0; i < size; i++) { - fPictureRefs[i] = SkPicture::MakeFromStream(stream, proc, topLevelTFPlayback).release(); + fPictureRefs[i] = SkPicture::MakeFromStream(stream, factory, topLevelTFPlayback).release(); if (!fPictureRefs[i]) { return false; } @@ -436,7 +432,7 @@ bool SkPictureData::parseStreamTag(SkStream* stream, return false; } fFactoryPlayback->setupBuffer(buffer); - buffer.setBitmapDecoder(proc); + buffer.setImageDeserializer(factory); if (fTFPlayback.count() > 0) { // .skp files <= v43 have typefaces serialized with each sub picture. @@ -463,7 +459,11 @@ bool SkPictureData::parseStreamTag(SkStream* stream, } static const SkImage* create_image_from_buffer(SkReadBuffer& buffer) { - return buffer.readImage(); + return buffer.readImage().release(); +} + +static const SkImage* create_bitmap_image_from_buffer(SkReadBuffer& buffer) { + return buffer.readBitmapAsImage().release(); } // Need a shallow wrapper to return const SkPicture* to match the other factories, @@ -512,18 +512,12 @@ bool new_array_from_buffer(SkReadBuffer& buffer, uint32_t inCount, bool SkPictureData::parseBufferTag(SkReadBuffer& buffer, uint32_t tag, uint32_t size) { switch (tag) { - case SK_PICT_BITMAP_BUFFER_TAG: { - const int count = SkToInt(size); - fBitmaps.reset(count); - for (int i = 0; i < count; ++i) { - SkBitmap* bm = &fBitmaps[i]; - if (buffer.readBitmap(bm)) { - bm->setImmutable(); - } else { - return false; - } + case SK_PICT_BITMAP_BUFFER_TAG: + if (!new_array_from_buffer(buffer, size, &fBitmapImageRefs, &fBitmapImageCount, + create_bitmap_image_from_buffer)) { + return false; } - } break; + break; case SK_PICT_PAINT_BUFFER_TAG: { const int count = SkToInt(size); fPaints.reset(count); @@ -581,14 +575,14 @@ bool SkPictureData::parseBufferTag(SkReadBuffer& buffer, uint32_t tag, uint32_t SkPictureData* SkPictureData::CreateFromStream(SkStream* stream, const SkPictInfo& info, - SkPicture::InstallPixelRefProc proc, + SkImageDeserializer* factory, SkTypefacePlayback* topLevelTFPlayback) { SkAutoTDelete<SkPictureData> data(new SkPictureData(info)); if (!topLevelTFPlayback) { topLevelTFPlayback = &data->fTFPlayback; } - if (!data->parseStream(stream, proc, topLevelTFPlayback)) { + if (!data->parseStream(stream, factory, topLevelTFPlayback)) { return nullptr; } return data.release(); @@ -606,7 +600,7 @@ SkPictureData* SkPictureData::CreateFromBuffer(SkReadBuffer& buffer, } bool SkPictureData::parseStream(SkStream* stream, - SkPicture::InstallPixelRefProc proc, + SkImageDeserializer* factory, SkTypefacePlayback* topLevelTFPlayback) { for (;;) { uint32_t tag = stream->readU32(); @@ -615,7 +609,7 @@ bool SkPictureData::parseStream(SkStream* stream, } uint32_t size = stream->readU32(); - if (!this->parseStreamTag(stream, tag, size, proc, topLevelTFPlayback)) { + if (!this->parseStreamTag(stream, tag, size, factory, topLevelTFPlayback)) { return false; // we're invalid } } |