Index: src/pathops/SkOpContour.h |
diff --git a/src/pathops/SkOpContour.h b/src/pathops/SkOpContour.h |
index 8cedab4cb1ebb0b5e35be9bcf4223c8b1183dea1..5b92a4b071b999d9adfad3d8f89a8ad025b75f38 100644 |
--- a/src/pathops/SkOpContour.h |
+++ b/src/pathops/SkOpContour.h |
@@ -25,7 +25,7 @@ class SkOpContour { |
public: |
SkOpContour() { |
reset(); |
-#ifdef SK_DEBUG |
+#if defined(SK_DEBUG) || !FORCE_RELEASE |
fID = ++SkPathOpsDebug::gContourID; |
#endif |
} |
@@ -77,18 +77,29 @@ public: |
return fSegments[segIndex].addT(&other->fSegments[otherIndex], pt, newT); |
} |
- int addSelfT(int segIndex, SkOpContour* other, int otherIndex, const SkPoint& pt, double newT) { |
+ int addSelfT(int segIndex, const SkPoint& pt, double newT) { |
setContainsIntercepts(); |
- return fSegments[segIndex].addSelfT(&other->fSegments[otherIndex], pt, newT); |
+ return fSegments[segIndex].addSelfT(pt, newT); |
} |
const SkPathOpsBounds& bounds() const { |
return fBounds; |
} |
+ bool calcAngles(); |
void calcCoincidentWinding(); |
void calcPartialCoincidentWinding(); |
+ void checkDuplicates() { |
+ int segmentCount = fSegments.count(); |
+ for (int sIndex = 0; sIndex < segmentCount; ++sIndex) { |
+ SkOpSegment& segment = fSegments[sIndex]; |
+ if (segment.count() > 2) { |
+ segment.checkDuplicates(); |
+ } |
+ } |
+ } |
+ |
void checkEnds() { |
if (!fContainsCurves) { |
return; |
@@ -106,6 +117,26 @@ public: |
} |
} |
+ void checkMultiples() { |
+ int segmentCount = fSegments.count(); |
+ for (int sIndex = 0; sIndex < segmentCount; ++sIndex) { |
+ SkOpSegment& segment = fSegments[sIndex]; |
+ if (segment.count() > 2) { |
+ segment.checkMultiples(); |
+ } |
+ } |
+ } |
+ |
+ void checkSmall() { |
+ int segmentCount = fSegments.count(); |
+ for (int sIndex = 0; sIndex < segmentCount; ++sIndex) { |
+ SkOpSegment& segment = fSegments[sIndex]; |
+ if (segment.hasSmall()) { |
+ segment.checkSmall(); |
+ } |
+ } |
+ } |
+ |
// if same point has different T values, choose a common T |
void checkTiny() { |
int segmentCount = fSegments.count(); |
@@ -113,7 +144,10 @@ public: |
return; |
} |
for (int sIndex = 0; sIndex < segmentCount; ++sIndex) { |
- fSegments[sIndex].checkTiny(); |
+ SkOpSegment& segment = fSegments[sIndex]; |
+ if (segment.hasTiny()) { |
+ segment.checkTiny(); |
+ } |
} |
} |
@@ -192,6 +226,7 @@ public: |
fXor = isXor; |
} |
+ void sortAngles(); |
void sortSegments(); |
const SkPoint& start() const { |
@@ -242,6 +277,12 @@ public: |
static void debugShowWindingValues(const SkTArray<SkOpContour*, true>& contourList); |
#endif |
+ // available to test routines only |
+ void dump() const; |
+ void dumpAngles() const; |
+ void dumpPts() const; |
+ void dumpSpans() const; |
+ |
private: |
void calcCommonCoincidentWinding(const SkCoincidence& ); |
void joinCoincidence(const SkTArray<SkCoincidence, true>& , bool partial); |
@@ -261,8 +302,11 @@ private: |
bool fOperand; // true for the second argument to a binary operator |
bool fXor; |
bool fOppXor; |
-#ifdef SK_DEBUG |
+#if defined(SK_DEBUG) || !FORCE_RELEASE |
+ int debugID() const { return fID; } |
int fID; |
+#else |
+ int debugID() const { return -1; } |
#endif |
}; |