Index: src/pathops/SkOpSegment.cpp |
diff --git a/src/pathops/SkOpSegment.cpp b/src/pathops/SkOpSegment.cpp |
index 5b2074995734ecccc454b77f6ecb9bb09fb486fa..7e69bb835b478d27e630a738811f84d840760428 100644 |
--- a/src/pathops/SkOpSegment.cpp |
+++ b/src/pathops/SkOpSegment.cpp |
@@ -1082,9 +1082,7 @@ bool SkOpSegment::bumpSpan(SkOpSpan* span, int windDelta, int oppDelta) { |
// look to see if the curve end intersects an intermediary that intersects the other |
void SkOpSegment::checkEnds() { |
-#if 1 |
- return; // FIXME: suspect we will need the code below to make intersections consistent |
-#else |
+ debugValidate(); |
SkTDArray<SkOpSpan> missingSpans; |
int count = fTs.count(); |
for (int index = 0; index < count; ++index) { |
@@ -1150,14 +1148,20 @@ nextPeeker: |
; |
} |
int missingCount = missingSpans.count(); |
+ if (missingCount == 0) { |
+ return; |
+ } |
+ debugValidate(); |
for (int index = 0; index < missingCount; ++index) { |
const SkOpSpan& missing = missingSpans[index]; |
addTPair(missing.fT, missing.fOther, missing.fOtherT, false, missing.fPt); |
} |
- if (missingCount > 0) { |
- fixOtherTIndex(); |
+ fixOtherTIndex(); |
+ for (int index = 0; index < missingCount; ++index) { |
+ const SkOpSpan& missing = missingSpans[index]; |
+ missing.fOther->fixOtherTIndex(); |
} |
-#endif |
+ debugValidate(); |
} |
bool SkOpSegment::equalPoints(int greaterTIndex, int lesserTIndex) { |
@@ -1792,13 +1796,16 @@ void SkOpSegment::fixOtherTIndex() { |
double oT = iSpan.fOtherT; |
SkOpSegment* other = iSpan.fOther; |
int oCount = other->fTs.count(); |
+ SkDEBUGCODE(iSpan.fOtherIndex = -1); |
for (int o = 0; o < oCount; ++o) { |
SkOpSpan& oSpan = other->fTs[o]; |
if (oT == oSpan.fT && this == oSpan.fOther && oSpan.fOtherT == iSpan.fT) { |
iSpan.fOtherIndex = o; |
+ oSpan.fOtherIndex = i; |
break; |
} |
} |
+ SkASSERT(iSpan.fOtherIndex >= 0); |
} |
} |
@@ -2755,6 +2762,7 @@ void SkOpSegment::debugShowTs() const { |
#if DEBUG_ACTIVE_SPANS || DEBUG_ACTIVE_SPANS_FIRST_ONLY |
void SkOpSegment::debugShowActiveSpans() const { |
+ debugValidate(); |
if (done()) { |
return; |
} |
@@ -2763,8 +2771,6 @@ void SkOpSegment::debugShowActiveSpans() const { |
double lastT = -1; |
#endif |
for (int i = 0; i < fTs.count(); ++i) { |
- SkASSERT(&fTs[i] == &fTs[i].fOther->fTs[fTs[i].fOtherIndex].fOther-> |
- fTs[fTs[i].fOther->fTs[fTs[i].fOtherIndex].fOtherIndex]); |
if (fTs[i].fDone) { |
continue; |
} |
@@ -2995,3 +3001,27 @@ int SkOpSegment::debugShowWindingValues(int slotCount, int ofInterest) const { |
return sum; |
} |
#endif |
+ |
+void SkOpSegment::debugValidate() const { |
+#if DEBUG_VALIDATE |
+ int count = fTs.count(); |
+ SkASSERT(count >= 2); |
+ SkASSERT(fTs[0].fT == 0); |
+ SkASSERT(fTs[count - 1].fT == 1); |
+ int done = 0; |
+ double t = -1; |
+ for (int i = 0; i < count; ++i) { |
+ const SkOpSpan& span = fTs[i]; |
+ SkASSERT(t <= span.fT); |
+ t = span.fT; |
+ int otherIndex = span.fOtherIndex; |
+ const SkOpSegment* other = span.fOther; |
+ const SkOpSpan& otherSpan = other->fTs[otherIndex]; |
+ SkASSERT(otherSpan.fPt == span.fPt); |
+ SkASSERT(otherSpan.fOtherT == t); |
+ SkASSERT(&fTs[i] == &otherSpan.fOther->fTs[otherSpan.fOtherIndex]); |
+ done += span.fDone; |
+ } |
+ SkASSERT(done == fDoneSpans); |
+#endif |
+} |