Chromium Code Reviews| 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); |
| } |
| /////////////////////////////////////////////////////////////////////////////// |