diff options
-rw-r--r-- | src/core/SkPictureData.cpp | 8 | ||||
-rw-r--r-- | src/core/SkPictureRecord.cpp | 14 | ||||
-rw-r--r-- | src/core/SkPictureRecord.h | 7 |
3 files changed, 22 insertions, 7 deletions
diff --git a/src/core/SkPictureData.cpp b/src/core/SkPictureData.cpp index 9ed98cf4ff..4391be4acf 100644 --- a/src/core/SkPictureData.cpp +++ b/src/core/SkPictureData.cpp @@ -46,7 +46,13 @@ SkPictureData::SkPictureData(const SkPictureRecord& record, fBitmaps = record.fBitmaps; fPaints = record.fPaints; - fPaths = record.fPaths; + + fPaths.reset(record.fPaths.count()); + record.fPaths.foreach([this](const SkPath& path, int n) { + // These indices are logically 1-based, but we need to serialize them + // 0-based to keep the deserializing SkPictureData::getPath() working. + fPaths[n-1] = path; + }); this->initForPlayback(); diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp index 28561c7e3f..2b56b74dad 100644 --- a/src/core/SkPictureRecord.cpp +++ b/src/core/SkPictureRecord.cpp @@ -587,7 +587,7 @@ void SkPictureRecord::onDrawImageRect(const SkImage* image, const SkRect* src, c size += sizeof(*src); // + rect } size += sizeof(dst); // + rect - + size_t initialOffset = this->addDraw(DRAW_IMAGE_RECT, &size); SkASSERT(initialOffset+get_paint_offset(DRAW_IMAGE_RECT, size) == fWriter.bytesWritten()); @@ -603,7 +603,7 @@ void SkPictureRecord::onDrawImageNine(const SkImage* img, const SkIRect& center, const SkPaint* paint) { // id + paint_index + image_index + center + dst size_t size = 3 * kUInt32Size + sizeof(SkIRect) + sizeof(SkRect); - + size_t initialOffset = this->addDraw(DRAW_IMAGE_NINE, &size); SkASSERT(initialOffset+get_paint_offset(DRAW_IMAGE_NINE, size) == fWriter.bytesWritten()); this->addPaintPtr(paint); @@ -863,7 +863,7 @@ void SkPictureRecord::onDrawAtlas(const SkImage* atlas, const SkRSXform xform[], flags |= DRAW_ATLAS_HAS_CULL; size += sizeof(SkRect); } - + size_t initialOffset = this->addDraw(DRAW_ATLAS, &size); SkASSERT(initialOffset+get_paint_offset(DRAW_ATLAS, size) == fWriter.bytesWritten()); this->addPaintPtr(paint); @@ -987,8 +987,12 @@ void SkPictureRecord::addPaintPtr(const SkPaint* paint) { } int SkPictureRecord::addPathToHeap(const SkPath& path) { - fPaths.push_back(path); - return fPaths.count(); + if (int* n = fPaths.find(path)) { + return *n; + } + int n = fPaths.count() + 1; // 0 is reserved for null / error. + fPaths.set(path, n); + return n; } void SkPictureRecord::addPath(const SkPath& path) { diff --git a/src/core/SkPictureRecord.h b/src/core/SkPictureRecord.h index c305f101d7..7e21fab112 100644 --- a/src/core/SkPictureRecord.h +++ b/src/core/SkPictureRecord.h @@ -14,6 +14,7 @@ #include "SkPictureData.h" #include "SkTArray.h" #include "SkTDArray.h" +#include "SkTHash.h" #include "SkWriter32.h" // These macros help with packing and unpacking a single byte value and @@ -226,7 +227,11 @@ private: SkTArray<SkBitmap> fBitmaps; SkTArray<SkPaint> fPaints; - SkTArray<SkPath> fPaths; + + struct PathHash { + uint32_t operator()(const SkPath& p) { return p.getGenerationID(); } + }; + SkTHashMap<SkPath, int, PathHash> fPaths; SkWriter32 fWriter; |