aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2016-08-29 07:52:13 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-08-29 07:52:13 -0700
commit22b2af1dc42c0b95fe93b9a951313efe438e54cd (patch)
tree03be47113372671bb64c88bfff51b7dd02ac70a2
parent57879455e56d978464b38c7deebdf41585d2c293 (diff)
dedup images/blobs/pictures by ID in old serialization format
-rw-r--r--include/private/SkTDArray.h12
-rw-r--r--src/core/SkPictureRecord.cpp35
2 files changed, 28 insertions, 19 deletions
diff --git a/include/private/SkTDArray.h b/include/private/SkTDArray.h
index d6ef3a3834..f71d357005 100644
--- a/include/private/SkTDArray.h
+++ b/include/private/SkTDArray.h
@@ -217,6 +217,18 @@ public:
}
}
+ template <typename S> int select(S&& selector) const {
+ const T* iter = fArray;
+ const T* stop = fArray + fCount;
+
+ for (; iter < stop; iter++) {
+ if (selector(*iter)) {
+ return SkToInt(iter - fArray);
+ }
+ }
+ return -1;
+ }
+
int find(const T& elem) const {
const T* iter = fArray;
const T* stop = fArray + fCount;
diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp
index d771699880..8eab63016b 100644
--- a/src/core/SkPictureRecord.cpp
+++ b/src/core/SkPictureRecord.cpp
@@ -867,18 +867,24 @@ void SkPictureRecord::onDrawAnnotation(const SkRect& rect, const char key[], SkD
///////////////////////////////////////////////////////////////////////////////
+template <typename T> int find_or_append_uniqueID(SkTDArray<const T*>& array, const T* obj) {
+ int index = array.select([&](const T* elem) {
+ return elem->uniqueID() == obj->uniqueID();
+ });
+ if (index < 0) {
+ index = array.count();
+ *array.append() = SkRef(obj);
+ }
+ return index;
+}
+
sk_sp<SkSurface> SkPictureRecord::onNewSurface(const SkImageInfo& info, const SkSurfaceProps&) {
return nullptr;
}
void SkPictureRecord::addImage(const SkImage* image) {
- int index = fImageRefs.find(image);
- if (index >= 0) {
- this->addInt(index);
- } else {
- *fImageRefs.append() = SkRef(image);
- this->addInt(fImageRefs.count()-1);
- }
+ // convention for images is 0-based index
+ this->addInt(find_or_append_uniqueID(fImageRefs, image));
}
void SkPictureRecord::addMatrix(const SkMatrix& matrix) {
@@ -914,14 +920,8 @@ void SkPictureRecord::addPatch(const SkPoint cubics[12]) {
}
void SkPictureRecord::addPicture(const SkPicture* picture) {
- int index = fPictureRefs.find(picture);
- if (index < 0) { // not found
- index = fPictureRefs.count();
- *fPictureRefs.append() = picture;
- picture->ref();
- }
// follow the convention of recording a 1-based index
- this->addInt(index + 1);
+ this->addInt(find_or_append_uniqueID(fPictureRefs, picture) + 1);
}
void SkPictureRecord::addDrawable(SkDrawable* drawable) {
@@ -982,12 +982,9 @@ void SkPictureRecord::addText(const void* text, size_t byteLength) {
fWriter.writePad(text, byteLength);
}
-void SkPictureRecord::addTextBlob(const SkTextBlob *blob) {
- int index = fTextBlobRefs.count();
- *fTextBlobRefs.append() = blob;
- blob->ref();
+void SkPictureRecord::addTextBlob(const SkTextBlob* blob) {
// follow the convention of recording a 1-based index
- this->addInt(index + 1);
+ this->addInt(find_or_append_uniqueID(fTextBlobRefs, blob) + 1);
}
///////////////////////////////////////////////////////////////////////////////