}
}
+ 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;
///////////////////////////////////////////////////////////////////////////////
+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) {
}
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) {
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);
}
///////////////////////////////////////////////////////////////////////////////