Index: src/core/SkPicturePlayback.cpp |
=================================================================== |
--- src/core/SkPicturePlayback.cpp (revision 14323) |
+++ src/core/SkPicturePlayback.cpp (working copy) |
@@ -23,14 +23,18 @@ |
*/ |
#define SPEW_CLIP_SKIPPINGx |
-SkPicturePlayback::SkPicturePlayback(const SkPictInfo& info) : fInfo(info) { |
+SkPicturePlayback::SkPicturePlayback(const SkPicture* picture, const SkPictInfo& info) |
+ : fPicture(picture) |
+ , fInfo(info) { |
this->init(); |
} |
-SkPicturePlayback::SkPicturePlayback(const SkPictureRecord& record, |
+SkPicturePlayback::SkPicturePlayback(const SkPicture* picture, |
+ const SkPictureRecord& record, |
const SkPictInfo& info, |
bool deepCopy) |
- : fInfo(info) { |
+ : fPicture(picture) |
+ , fInfo(info) { |
#ifdef SK_DEBUG_SIZE |
size_t overallBytes, bitmapBytes, matricesBytes, |
paintBytes, pathBytes, pictureBytes, regionBytes; |
@@ -95,14 +99,8 @@ |
fPaints = record.fPaints.unflattenToArray(); |
fBitmapHeap.reset(SkSafeRef(record.fBitmapHeap)); |
- fPathHeap.reset(SkSafeRef(record.fPathHeap)); |
- // ensure that the paths bounds are pre-computed |
- if (fPathHeap.get()) { |
- for (int i = 0; i < fPathHeap->count(); i++) { |
- (*fPathHeap)[i].updateBoundsCache(); |
- } |
- } |
+ picture->initForPlayback(); |
const SkTDArray<SkPicture* >& pictures = record.getPictureRefs(); |
fPictureCount = pictures.count(); |
@@ -160,12 +158,13 @@ |
paint.getImageFilter(); |
} |
-SkPicturePlayback::SkPicturePlayback(const SkPicturePlayback& src, SkPictCopyInfo* deepCopyInfo) |
- : fInfo(src.fInfo) { |
+SkPicturePlayback::SkPicturePlayback(const SkPicture* picture, const SkPicturePlayback& src, |
+ SkPictCopyInfo* deepCopyInfo) |
+ : fPicture(picture) |
+ , fInfo(src.fInfo) { |
this->init(); |
fBitmapHeap.reset(SkSafeRef(src.fBitmapHeap.get())); |
- fPathHeap.reset(SkSafeRef(src.fPathHeap.get())); |
fOpData = SkSafeRef(src.fOpData); |
@@ -286,11 +285,11 @@ |
} |
void SkPicturePlayback::dumpSize() const { |
- SkDebugf("--- picture size: ops=%d bitmaps=%d [%d] paints=%d [%d] paths=%d\n", |
+ SkDebugf("--- picture size: ops=%d bitmaps=%d [%d] paints=%d [%d]\n", |
fOpData->size(), |
SafeCount(fBitmaps), SafeCount(fBitmaps) * sizeof(SkBitmap), |
- SafeCount(fPaints), SafeCount(fPaints) * sizeof(SkPaint), |
- SafeCount(fPathHeap.get())); |
+ SafeCount(fPaints), SafeCount(fPaints) * sizeof(SkPaint)); |
+ fPicture->dumpSize(); |
} |
bool SkPicturePlayback::containsBitmaps() const { |
@@ -310,16 +309,6 @@ |
#include "SkStream.h" |
-static void write_tag_size(SkWriteBuffer& buffer, uint32_t tag, size_t size) { |
- buffer.writeUInt(tag); |
- buffer.writeUInt(SkToU32(size)); |
-} |
- |
-static void write_tag_size(SkWStream* stream, uint32_t tag, size_t size) { |
- stream->write32(tag); |
- stream->write32(SkToU32(size)); |
-} |
- |
static size_t compute_chunk_size(SkFlattenable::Factory* array, int count) { |
size_t size = 4; // for 'count' |
@@ -337,7 +326,7 @@ |
return size; |
} |
-static void write_factories(SkWStream* stream, const SkFactorySet& rec) { |
+void SkPicturePlayback::WriteFactories(SkWStream* stream, const SkFactorySet& rec) { |
int count = rec.count(); |
SkAutoSTMalloc<16, SkFlattenable::Factory> storage(count); |
@@ -347,7 +336,7 @@ |
size_t size = compute_chunk_size(array, count); |
// TODO: write_tag_size should really take a size_t |
- write_tag_size(stream, SK_PICT_FACTORY_TAG, (uint32_t) size); |
+ SkPicture::WriteTagSize(stream, SK_PICT_FACTORY_TAG, (uint32_t) size); |
SkDEBUGCODE(size_t start = stream->bytesWritten()); |
stream->write32(count); |
@@ -366,10 +355,10 @@ |
SkASSERT(size == (stream->bytesWritten() - start)); |
} |
-static void write_typefaces(SkWStream* stream, const SkRefCntSet& rec) { |
+void SkPicturePlayback::WriteTypefaces(SkWStream* stream, const SkRefCntSet& rec) { |
int count = rec.count(); |
- write_tag_size(stream, SK_PICT_TYPEFACE_TAG, count); |
+ SkPicture::WriteTagSize(stream, SK_PICT_TYPEFACE_TAG, count); |
SkAutoSTMalloc<16, SkTypeface*> storage(count); |
SkTypeface** array = (SkTypeface**)storage.get(); |
@@ -384,32 +373,29 @@ |
int i, n; |
if ((n = SafeCount(fBitmaps)) > 0) { |
- write_tag_size(buffer, SK_PICT_BITMAP_BUFFER_TAG, n); |
+ SkPicture::WriteTagSize(buffer, SK_PICT_BITMAP_BUFFER_TAG, n); |
for (i = 0; i < n; i++) { |
buffer.writeBitmap((*fBitmaps)[i]); |
} |
} |
if ((n = SafeCount(fPaints)) > 0) { |
- write_tag_size(buffer, SK_PICT_PAINT_BUFFER_TAG, n); |
+ SkPicture::WriteTagSize(buffer, SK_PICT_PAINT_BUFFER_TAG, n); |
for (i = 0; i < n; i++) { |
buffer.writePaint((*fPaints)[i]); |
} |
} |
- if ((n = SafeCount(fPathHeap.get())) > 0) { |
- write_tag_size(buffer, SK_PICT_PATH_BUFFER_TAG, n); |
- fPathHeap->flatten(buffer); |
- } |
+ fPicture->flattenToBuffer(buffer); |
} |
void SkPicturePlayback::serialize(SkWStream* stream, |
SkPicture::EncodeBitmap encoder) const { |
- write_tag_size(stream, SK_PICT_READER_TAG, fOpData->size()); |
+ SkPicture::WriteTagSize(stream, SK_PICT_READER_TAG, fOpData->size()); |
stream->write(fOpData->bytes(), fOpData->size()); |
if (fPictureCount > 0) { |
- write_tag_size(stream, SK_PICT_PICTURE_TAG, fPictureCount); |
+ SkPicture::WriteTagSize(stream, SK_PICT_PICTURE_TAG, fPictureCount); |
for (int i = 0; i < fPictureCount; i++) { |
fPictureRefs[i]->serialize(stream, encoder); |
} |
@@ -431,10 +417,10 @@ |
// We have to write these two sets into the stream *before* we write |
// the buffer, since parsing that buffer will require that we already |
// have these sets available to use. |
- write_factories(stream, factSet); |
- write_typefaces(stream, typefaceSet); |
+ WriteFactories(stream, factSet); |
+ WriteTypefaces(stream, typefaceSet); |
- write_tag_size(stream, SK_PICT_BUFFER_SIZE_TAG, buffer.bytesWritten()); |
+ SkPicture::WriteTagSize(stream, SK_PICT_BUFFER_SIZE_TAG, buffer.bytesWritten()); |
buffer.writeToStream(stream); |
} |
@@ -442,11 +428,11 @@ |
} |
void SkPicturePlayback::flatten(SkWriteBuffer& buffer) const { |
- write_tag_size(buffer, SK_PICT_READER_TAG, fOpData->size()); |
+ SkPicture::WriteTagSize(buffer, SK_PICT_READER_TAG, fOpData->size()); |
buffer.writeByteArray(fOpData->bytes(), fOpData->size()); |
if (fPictureCount > 0) { |
- write_tag_size(buffer, SK_PICT_PICTURE_TAG, fPictureCount); |
+ SkPicture::WriteTagSize(buffer, SK_PICT_PICTURE_TAG, fPictureCount); |
for (int i = 0; i < fPictureCount; i++) { |
fPictureRefs[i]->flatten(buffer); |
} |
@@ -482,7 +468,8 @@ |
return rbMask; |
} |
-bool SkPicturePlayback::parseStreamTag(SkStream* stream, |
+bool SkPicturePlayback::parseStreamTag(SkPicture* picture, |
+ SkStream* stream, |
uint32_t tag, |
uint32_t size, |
SkPicture::InstallPixelRefProc proc) { |
@@ -584,7 +571,7 @@ |
while (!buffer.eof()) { |
tag = buffer.readUInt(); |
size = buffer.readUInt(); |
- if (!this->parseBufferTag(buffer, tag, size)) { |
+ if (!this->parseBufferTag(picture, buffer, tag, size)) { |
return false; |
} |
} |
@@ -594,7 +581,8 @@ |
return true; // success |
} |
-bool SkPicturePlayback::parseBufferTag(SkReadBuffer& buffer, |
+bool SkPicturePlayback::parseBufferTag(SkPicture* picture, |
+ SkReadBuffer& buffer, |
uint32_t tag, uint32_t size) { |
switch (tag) { |
case SK_PICT_BITMAP_BUFFER_TAG: { |
@@ -614,9 +602,7 @@ |
} |
} break; |
case SK_PICT_PATH_BUFFER_TAG: |
- if (size > 0) { |
- fPathHeap.reset(SkNEW_ARGS(SkPathHeap, (buffer))); |
- } |
+ picture->parseBufferTag(buffer, tag, size); |
break; |
case SK_PICT_READER_TAG: { |
SkAutoMalloc storage(size); |
@@ -660,29 +646,32 @@ |
return true; // success |
} |
-SkPicturePlayback* SkPicturePlayback::CreateFromStream(SkStream* stream, |
+SkPicturePlayback* SkPicturePlayback::CreateFromStream(SkPicture* picture, |
+ SkStream* stream, |
const SkPictInfo& info, |
SkPicture::InstallPixelRefProc proc) { |
- SkAutoTDelete<SkPicturePlayback> playback(SkNEW_ARGS(SkPicturePlayback, (info))); |
+ SkAutoTDelete<SkPicturePlayback> playback(SkNEW_ARGS(SkPicturePlayback, (picture, info))); |
- if (!playback->parseStream(stream, proc)) { |
+ if (!playback->parseStream(picture, stream, proc)) { |
return NULL; |
} |
return playback.detach(); |
} |
-SkPicturePlayback* SkPicturePlayback::CreateFromBuffer(SkReadBuffer& buffer, |
+SkPicturePlayback* SkPicturePlayback::CreateFromBuffer(SkPicture* picture, |
+ SkReadBuffer& buffer, |
const SkPictInfo& info) { |
- SkAutoTDelete<SkPicturePlayback> playback(SkNEW_ARGS(SkPicturePlayback, (info))); |
+ SkAutoTDelete<SkPicturePlayback> playback(SkNEW_ARGS(SkPicturePlayback, (picture, info))); |
buffer.setPictureVersion(info.fVersion); |
- if (!playback->parseBuffer(buffer)) { |
+ if (!playback->parseBuffer(picture, buffer)) { |
return NULL; |
} |
return playback.detach(); |
} |
-bool SkPicturePlayback::parseStream(SkStream* stream, |
+bool SkPicturePlayback::parseStream(SkPicture* picture, |
+ SkStream* stream, |
SkPicture::InstallPixelRefProc proc) { |
for (;;) { |
uint32_t tag = stream->readU32(); |
@@ -691,14 +680,14 @@ |
} |
uint32_t size = stream->readU32(); |
- if (!this->parseStreamTag(stream, tag, size, proc)) { |
+ if (!this->parseStreamTag(picture, stream, tag, size, proc)) { |
return false; // we're invalid |
} |
} |
return true; |
} |
-bool SkPicturePlayback::parseBuffer(SkReadBuffer& buffer) { |
+bool SkPicturePlayback::parseBuffer(SkPicture* picture, SkReadBuffer& buffer) { |
for (;;) { |
uint32_t tag = buffer.readUInt(); |
if (SK_PICT_EOF_TAG == tag) { |
@@ -706,7 +695,7 @@ |
} |
uint32_t size = buffer.readUInt(); |
- if (!this->parseBufferTag(buffer, tag, size)) { |
+ if (!this->parseBufferTag(picture, buffer, tag, size)) { |
return false; // we're invalid |
} |
} |