aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/SkPictureData.cpp8
-rw-r--r--src/core/SkPictureRecord.cpp14
-rw-r--r--src/core/SkPictureRecord.h7
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;