| Index: src/core/SkPictureData.cpp
|
| diff --git a/src/core/SkPictureData.cpp b/src/core/SkPictureData.cpp
|
| index 873c0c4a1d913c9e78205273bde25ef14aad721e..f86fa816776237f82cf05d2a071fb12c684c7863 100644
|
| --- a/src/core/SkPictureData.cpp
|
| +++ b/src/core/SkPictureData.cpp
|
| @@ -365,7 +365,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
|
| @@ -418,7 +418,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;
|
| }
|
| @@ -440,7 +440,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.
|
| @@ -467,7 +467,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,
|
| @@ -517,16 +521,23 @@ 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: {
|
| +#if 0
|
| const int count = SkToInt(size);
|
| fBitmaps.reset(count);
|
| for (int i = 0; i < count; ++i) {
|
| SkBitmap* bm = &fBitmaps[i];
|
| - if (buffer.readBitmap(bm)) {
|
| + if (buffer.legacy_readBitmap(bm)) {
|
| bm->setImmutable();
|
| } else {
|
| return false;
|
| }
|
| }
|
| +#else
|
| + if (!new_array_from_buffer(buffer, size, &fBitmapImageRefs, &fBitmapImageCount,
|
| + create_bitmap_image_from_buffer)) {
|
| + return false;
|
| + }
|
| +#endif
|
| } break;
|
| case SK_PICT_PAINT_BUFFER_TAG: {
|
| const int count = SkToInt(size);
|
| @@ -585,14 +596,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();
|
| @@ -610,7 +621,7 @@ SkPictureData* SkPictureData::CreateFromBuffer(SkReadBuffer& buffer,
|
| }
|
|
|
| bool SkPictureData::parseStream(SkStream* stream,
|
| - SkPicture::InstallPixelRefProc proc,
|
| + SkImageDeserializer* factory,
|
| SkTypefacePlayback* topLevelTFPlayback) {
|
| for (;;) {
|
| uint32_t tag = stream->readU32();
|
| @@ -619,7 +630,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
|
| }
|
| }
|
|
|