Index: src/core/SkPictureData.cpp |
diff --git a/src/core/SkPictureData.cpp b/src/core/SkPictureData.cpp |
index 1e946aaa9749d3cfccd98a5d0b6a6ad211c86084..8c641097dcac2b580dad60376996ccfde6db7679 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 |
} |
} |