aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkPictureData.cpp
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2016-08-11 03:55:15 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-08-11 03:55:15 -0700
commita9ca05ca5e604b9ee18e9cce19b059085ca0e22c (patch)
treeb8b28257068935dc55c956c41ff2e3d899e031c7 /src/core/SkPictureData.cpp
parent286a8657da0364006e95cb0988477cc3a5f0e112 (diff)
Deserialize pictures with custom image-deserializer
Diffstat (limited to 'src/core/SkPictureData.cpp')
-rw-r--r--src/core/SkPictureData.cpp42
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
}
}