Index: src/core/SkPathRef.cpp |
diff --git a/src/core/SkPathRef.cpp b/src/core/SkPathRef.cpp |
index 44838f924637ff144a83aa86ac3aaf90f89d76fa..38b4e71cba1d4479eba42c7846ba833f533d0965 100644 |
--- a/src/core/SkPathRef.cpp |
+++ b/src/core/SkPathRef.cpp |
@@ -23,12 +23,27 @@ SkPathRef::Editor::Editor(SkAutoTUnref<SkPathRef>* pathRef, |
pathRef->reset(copy); |
} |
fPathRef = *pathRef; |
+ fPathRef->callGenIDChangeListeners(); |
fPathRef->fGenerationID = 0; |
SkDEBUGCODE(sk_atomic_inc(&fPathRef->fEditorsAttached);) |
} |
////////////////////////////////////////////////////////////////////////////// |
+SkPathRef::~SkPathRef() { |
+ this->callGenIDChangeListeners(); |
+ SkDEBUGCODE(this->validate();) |
+ sk_free(fPoints); |
+ |
+ SkDEBUGCODE(fPoints = NULL;) |
+ SkDEBUGCODE(fVerbs = NULL;) |
+ SkDEBUGCODE(fVerbCnt = 0x9999999;) |
+ SkDEBUGCODE(fPointCnt = 0xAAAAAAA;) |
+ SkDEBUGCODE(fPointCnt = 0xBBBBBBB;) |
+ SkDEBUGCODE(fGenerationID = 0xEEEEEEEE;) |
+ SkDEBUGCODE(fEditorsAttached = 0x7777777;) |
+} |
+ |
// As a template argument, this must have external linkage. |
SkPathRef* sk_create_empty_pathref() { |
SkPathRef* empty = SkNEW(SkPathRef); |
@@ -154,6 +169,7 @@ SkPathRef* SkPathRef::CreateFromBuffer(SkRBuffer* buffer) { |
void SkPathRef::Rewind(SkAutoTUnref<SkPathRef>* pathRef) { |
if ((*pathRef)->unique()) { |
SkDEBUGCODE((*pathRef)->validate();) |
+ (*pathRef)->callGenIDChangeListeners(); |
(*pathRef)->fBoundsIsDirty = true; // this also invalidates fIsFinite |
(*pathRef)->fVerbCnt = 0; |
(*pathRef)->fPointCnt = 0; |
@@ -215,13 +231,6 @@ bool SkPathRef::operator== (const SkPathRef& ref) const { |
SkASSERT(!genIDMatch); |
return false; |
} |
- // We've done the work to determine that these are equal. If either has a zero genID, copy |
- // the other's. If both are 0 then genID() will compute the next ID. |
- if (0 == fGenerationID) { |
- fGenerationID = ref.genID(); |
- } else if (0 == ref.fGenerationID) { |
- ref.fGenerationID = this->genID(); |
- } |
return true; |
} |
@@ -269,9 +278,6 @@ void SkPathRef::copy(const SkPathRef& ref, |
memcpy(this->verbsMemWritable(), ref.verbsMemBegin(), ref.fVerbCnt * sizeof(uint8_t)); |
memcpy(this->fPoints, ref.fPoints, ref.fPointCnt * sizeof(SkPoint)); |
fConicWeights = ref.fConicWeights; |
- // We could call genID() here to force a real ID (instead of 0). However, if we're making |
- // a copy then presumably we intend to make a modification immediately afterwards. |
- fGenerationID = ref.fGenerationID; |
fBoundsIsDirty = ref.fBoundsIsDirty; |
if (!fBoundsIsDirty) { |
fBounds = ref.fBounds; |
@@ -436,6 +442,24 @@ uint32_t SkPathRef::genID() const { |
return fGenerationID; |
} |
+void SkPathRef::addGenIDChangeListener(GenIDChangeListener* listener) { |
+ if (NULL == listener || this == empty.get()) { |
+ SkDELETE(listener); |
+ return; |
+ } |
+ *fGenIDChangeListeners.append() = listener; |
+} |
+ |
+// we need to be called *before* the genID gets changed or zerod |
+void SkPathRef::callGenIDChangeListeners() { |
+ for (int i = 0; i < fGenIDChangeListeners.count(); i++) { |
+ fGenIDChangeListeners[i]->onChange(); |
+ } |
+ |
+ // Listeners get at most one shot, so whether these triggered or not, blow them away. |
+ fGenIDChangeListeners.deleteAll(); |
+} |
+ |
#ifdef SK_DEBUG |
void SkPathRef::validate() const { |
this->INHERITED::validate(); |