diff options
Diffstat (limited to 'src/pathops/SkOpContour.h')
-rw-r--r-- | src/pathops/SkOpContour.h | 54 |
1 files changed, 49 insertions, 5 deletions
diff --git a/src/pathops/SkOpContour.h b/src/pathops/SkOpContour.h index 8cedab4cb1..5b92a4b071 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 }; |