From 22b2af1dc42c0b95fe93b9a951313efe438e54cd Mon Sep 17 00:00:00 2001 From: reed Date: Mon, 29 Aug 2016 07:52:13 -0700 Subject: [PATCH] dedup images/blobs/pictures by ID in old serialization format BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2289783002 Review-Url: https://codereview.chromium.org/2289783002 --- include/private/SkTDArray.h | 12 ++++++++++++ src/core/SkPictureRecord.cpp | 35 ++++++++++++++++------------------- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/include/private/SkTDArray.h b/include/private/SkTDArray.h index d6ef3a3..f71d357 100644 --- a/include/private/SkTDArray.h +++ b/include/private/SkTDArray.h @@ -217,6 +217,18 @@ public: } } + template 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 d771699..8eab630 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 int find_or_append_uniqueID(SkTDArray& 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 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); } /////////////////////////////////////////////////////////////////////////////// -- 2.7.4