Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Unified Diff: src/core/SkPictureRecord.cpp

Issue 2289783002: dedup images/blobs/pictures by ID in old serialization format (Closed)
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« include/private/SkTDArray.h ('K') | « include/private/SkTDArray.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkPictureRecord.cpp
diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp
index d7716998802a914f00a8c89f6dfed562018b9af9..8eab63016b82998365c8a12ea3ef376046bad1b4 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();
mtklein 2016/08/29 14:34:46 Seems like we could return count instead of -1, so
reed1 2016/08/29 14:41:26 That would make this site a tiny bit simpler, but
+ *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);
}
///////////////////////////////////////////////////////////////////////////////
« include/private/SkTDArray.h ('K') | « include/private/SkTDArray.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698