| Index: src/core/SkPicturePlayback.cpp
|
| diff --git a/src/core/SkPicturePlayback.cpp b/src/core/SkPicturePlayback.cpp
|
| index aa2b021928a7ea3828eb3098e11282f6b95725f7..75801fb960fa50885240d94eca72ad0b90e1df78 100644
|
| --- a/src/core/SkPicturePlayback.cpp
|
| +++ b/src/core/SkPicturePlayback.cpp
|
| @@ -50,18 +50,24 @@ void SkPicturePlayback::PlaybackReplacements::validate() const {
|
| }
|
| #endif
|
|
|
| -SkPicturePlayback::SkPicturePlayback(const SkPicture* picture, const SkPictInfo& info)
|
| - : fPicture(picture)
|
| - , fInfo(info) {
|
| +SkPicturePlayback::SkPicturePlayback(const SkPictInfo& info)
|
| + : fInfo(info) {
|
| this->init();
|
| }
|
|
|
| -SkPicturePlayback::SkPicturePlayback(const SkPicture* picture,
|
| - const SkPictureRecord& record,
|
| +void SkPicturePlayback::initForPlayback() const {
|
| + // ensure that the paths bounds are pre-computed
|
| + if (NULL != fPathHeap.get()) {
|
| + for (int i = 0; i < fPathHeap->count(); i++) {
|
| + (*fPathHeap.get())[i].updateBoundsCache();
|
| + }
|
| + }
|
| +}
|
| +
|
| +SkPicturePlayback::SkPicturePlayback(const SkPictureRecord& record,
|
| const SkPictInfo& info,
|
| bool deepCopyOps)
|
| - : fPicture(picture)
|
| - , fInfo(info) {
|
| + : fInfo(info) {
|
| #ifdef SK_DEBUG_SIZE
|
| size_t overallBytes, bitmapBytes, matricesBytes,
|
| paintBytes, pathBytes, pictureBytes, regionBytes;
|
| @@ -121,8 +127,9 @@ SkPicturePlayback::SkPicturePlayback(const SkPicture* picture,
|
| fPaints = record.fPaints.unflattenToArray();
|
|
|
| fBitmapHeap.reset(SkSafeRef(record.fBitmapHeap));
|
| + fPathHeap.reset(SkSafeRef(record.pathHeap()));
|
|
|
| - picture->initForPlayback();
|
| + this->initForPlayback();
|
|
|
| const SkTDArray<const SkPicture* >& pictures = record.getPictureRefs();
|
| fPictureCount = pictures.count();
|
| @@ -156,14 +163,12 @@ SkPicturePlayback::SkPicturePlayback(const SkPicture* picture,
|
| #endif
|
| }
|
|
|
| -SkPicturePlayback::SkPicturePlayback(const SkPicture* picture,
|
| - const SkPicturePlayback& src,
|
| - SkPictCopyInfo* deepCopyInfo)
|
| - : fPicture(picture)
|
| - , fInfo(src.fInfo) {
|
| +SkPicturePlayback::SkPicturePlayback(const SkPicturePlayback& src, SkPictCopyInfo* deepCopyInfo)
|
| + : fInfo(src.fInfo) {
|
| this->init();
|
|
|
| fBitmapHeap.reset(SkSafeRef(src.fBitmapHeap.get()));
|
| + fPathHeap.reset(SkSafeRef(src.fPathHeap.get()));
|
|
|
| fOpData = SkSafeRef(src.fOpData);
|
|
|
| @@ -254,7 +259,8 @@ void SkPicturePlayback::dumpSize() const {
|
| fOpData->size(),
|
| SafeCount(fBitmaps), SafeCount(fBitmaps) * sizeof(SkBitmap),
|
| SafeCount(fPaints), SafeCount(fPaints) * sizeof(SkPaint));
|
| - fPicture->dumpSize();
|
| + SkDebugf("--- picture size: paths=%d\n",
|
| + SafeCount(fPathHeap.get()));
|
| }
|
|
|
| bool SkPicturePlayback::containsBitmaps() const {
|
| @@ -351,7 +357,10 @@ void SkPicturePlayback::flattenToBuffer(SkWriteBuffer& buffer) const {
|
| }
|
| }
|
|
|
| - fPicture->flattenToBuffer(buffer);
|
| + if ((n = SafeCount(fPathHeap.get())) > 0) {
|
| + SkPicture::WriteTagSize(buffer, SK_PICT_PATH_BUFFER_TAG, n);
|
| + fPathHeap->flatten(buffer);
|
| + }
|
| }
|
|
|
| void SkPicturePlayback::serialize(SkWStream* stream,
|
| @@ -433,8 +442,7 @@ static uint32_t pictInfoFlagsToReadBufferFlags(uint32_t pictInfoFlags) {
|
| return rbMask;
|
| }
|
|
|
| -bool SkPicturePlayback::parseStreamTag(SkPicture* picture,
|
| - SkStream* stream,
|
| +bool SkPicturePlayback::parseStreamTag(SkStream* stream,
|
| uint32_t tag,
|
| uint32_t size,
|
| SkPicture::InstallPixelRefProc proc) {
|
| @@ -536,7 +544,7 @@ bool SkPicturePlayback::parseStreamTag(SkPicture* picture,
|
| while (!buffer.eof()) {
|
| tag = buffer.readUInt();
|
| size = buffer.readUInt();
|
| - if (!this->parseBufferTag(picture, buffer, tag, size)) {
|
| + if (!this->parseBufferTag(buffer, tag, size)) {
|
| return false;
|
| }
|
| }
|
| @@ -546,8 +554,7 @@ bool SkPicturePlayback::parseStreamTag(SkPicture* picture,
|
| return true; // success
|
| }
|
|
|
| -bool SkPicturePlayback::parseBufferTag(SkPicture* picture,
|
| - SkReadBuffer& buffer,
|
| +bool SkPicturePlayback::parseBufferTag(SkReadBuffer& buffer,
|
| uint32_t tag, uint32_t size) {
|
| switch (tag) {
|
| case SK_PICT_BITMAP_BUFFER_TAG: {
|
| @@ -567,7 +574,9 @@ bool SkPicturePlayback::parseBufferTag(SkPicture* picture,
|
| }
|
| } break;
|
| case SK_PICT_PATH_BUFFER_TAG:
|
| - picture->parseBufferTag(buffer, tag, size);
|
| + if (size > 0) {
|
| + fPathHeap.reset(SkNEW_ARGS(SkPathHeap, (buffer)));
|
| + }
|
| break;
|
| case SK_PICT_READER_TAG: {
|
| SkAutoMalloc storage(size);
|
| @@ -611,32 +620,29 @@ bool SkPicturePlayback::parseBufferTag(SkPicture* picture,
|
| return true; // success
|
| }
|
|
|
| -SkPicturePlayback* SkPicturePlayback::CreateFromStream(SkPicture* picture,
|
| - SkStream* stream,
|
| +SkPicturePlayback* SkPicturePlayback::CreateFromStream(SkStream* stream,
|
| const SkPictInfo& info,
|
| SkPicture::InstallPixelRefProc proc) {
|
| - SkAutoTDelete<SkPicturePlayback> playback(SkNEW_ARGS(SkPicturePlayback, (picture, info)));
|
| + SkAutoTDelete<SkPicturePlayback> playback(SkNEW_ARGS(SkPicturePlayback, (info)));
|
|
|
| - if (!playback->parseStream(picture, stream, proc)) {
|
| + if (!playback->parseStream(stream, proc)) {
|
| return NULL;
|
| }
|
| return playback.detach();
|
| }
|
|
|
| -SkPicturePlayback* SkPicturePlayback::CreateFromBuffer(SkPicture* picture,
|
| - SkReadBuffer& buffer,
|
| +SkPicturePlayback* SkPicturePlayback::CreateFromBuffer(SkReadBuffer& buffer,
|
| const SkPictInfo& info) {
|
| - SkAutoTDelete<SkPicturePlayback> playback(SkNEW_ARGS(SkPicturePlayback, (picture, info)));
|
| + SkAutoTDelete<SkPicturePlayback> playback(SkNEW_ARGS(SkPicturePlayback, (info)));
|
| buffer.setVersion(info.fVersion);
|
|
|
| - if (!playback->parseBuffer(picture, buffer)) {
|
| + if (!playback->parseBuffer(buffer)) {
|
| return NULL;
|
| }
|
| return playback.detach();
|
| }
|
|
|
| -bool SkPicturePlayback::parseStream(SkPicture* picture,
|
| - SkStream* stream,
|
| +bool SkPicturePlayback::parseStream(SkStream* stream,
|
| SkPicture::InstallPixelRefProc proc) {
|
| for (;;) {
|
| uint32_t tag = stream->readU32();
|
| @@ -645,14 +651,14 @@ bool SkPicturePlayback::parseStream(SkPicture* picture,
|
| }
|
|
|
| uint32_t size = stream->readU32();
|
| - if (!this->parseStreamTag(picture, stream, tag, size, proc)) {
|
| + if (!this->parseStreamTag(stream, tag, size, proc)) {
|
| return false; // we're invalid
|
| }
|
| }
|
| return true;
|
| }
|
|
|
| -bool SkPicturePlayback::parseBuffer(SkPicture* picture, SkReadBuffer& buffer) {
|
| +bool SkPicturePlayback::parseBuffer(SkReadBuffer& buffer) {
|
| for (;;) {
|
| uint32_t tag = buffer.readUInt();
|
| if (SK_PICT_EOF_TAG == tag) {
|
| @@ -660,7 +666,7 @@ bool SkPicturePlayback::parseBuffer(SkPicture* picture, SkReadBuffer& buffer) {
|
| }
|
|
|
| uint32_t size = buffer.readUInt();
|
| - if (!this->parseBufferTag(picture, buffer, tag, size)) {
|
| + if (!this->parseBufferTag(buffer, tag, size)) {
|
| return false; // we're invalid
|
| }
|
| }
|
|
|