Index: src/core/SkPicture.cpp |
diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp |
index d57de97d78c5f67a3c3da1c9a0087b9497e7a052..0b7a1dbcc592702ec3cf9185f3bfcded0b32bf79 100644 |
--- a/src/core/SkPicture.cpp |
+++ b/src/core/SkPicture.cpp |
@@ -144,7 +144,9 @@ static SkPicture* backport(const SkRecord& src, int width, int height) { |
} |
// fRecord OK |
-SkPicture::~SkPicture() {} |
+SkPicture::~SkPicture() { |
+ this->callDeletionListeners(); |
+} |
#ifdef SK_SUPPORT_LEGACY_PICTURE_CLONE |
// fRecord TODO, fix by deleting this method |
@@ -492,3 +494,21 @@ SkPicture::SkPicture(int width, int height, SkRecord* record) |
, fRecordWillPlayBackBitmaps(SkRecordWillPlaybackBitmaps(*record)) { |
this->needsNewGenID(); |
} |
+ |
+// Note that we are assuming that this entry point will only be called from |
+// one thread. Currently the only client of this method is |
+// SkGpuDevice::EXPERIMENTAL_optimize which should be only called from a single |
+// thread. |
+void SkPicture::addDeletionListener(DeletionListener* listener) const { |
+ SkASSERT(NULL != listener); |
+ |
+ *fDeletionListeners.append() = SkRef(listener); |
+} |
+ |
+void SkPicture::callDeletionListeners() { |
+ for (int i = 0; i < fDeletionListeners.count(); ++i) { |
+ fDeletionListeners[i]->onDeletion(this->uniqueID()); |
+ } |
+ |
+ fDeletionListeners.unrefAll(); |
+} |