Index: src/pathops/SkDLineIntersection.cpp |
diff --git a/src/pathops/SkDLineIntersection.cpp b/src/pathops/SkDLineIntersection.cpp |
index b209474066bde4865da3e2fa27e1c6a004c265c2..8fc673f2fb80e36558df1ae889a82863e6e05975 100644 |
--- a/src/pathops/SkDLineIntersection.cpp |
+++ b/src/pathops/SkDLineIntersection.cpp |
@@ -26,19 +26,24 @@ SkDPoint SkIntersections::Line(const SkDLine& a, const SkDLine& b) { |
return p; |
} |
-void SkIntersections::cleanUpCoincidence() { |
- SkASSERT(fUsed == 2); |
- // both t values are good |
- bool startMatch = fT[0][0] == 0 && (fT[1][0] == 0 || fT[1][0] == 1); |
- bool endMatch = fT[0][1] == 1 && (fT[1][1] == 0 || fT[1][1] == 1); |
- if (startMatch || endMatch) { |
- removeOne(startMatch); |
- return; |
- } |
- // either t value is good |
- bool pStartMatch = fT[0][0] == 0 || fT[1][0] == 0 || fT[1][0] == 1; |
- bool pEndMatch = fT[0][1] == 1 || fT[1][1] == 0 || fT[1][1] == 1; |
- removeOne(pStartMatch || !pEndMatch); |
+int SkIntersections::cleanUpCoincidence() { |
+ do { |
+ int last = fUsed - 1; |
+ for (int index = 0; index < last; ++index) { |
+ if (fT[0][index] == fT[0][index + 1]) { |
+ removeOne(index + (int) (fT[1][index] == 0 || fT[1][index] == 1)); |
+ goto tryAgain; |
+ } |
+ } |
+ for (int index = 0; index < last; ++index) { |
+ if (fT[1][index] == fT[1][index + 1]) { |
+ removeOne(index + (int) (fT[0][index] == 0 || fT[0][index] == 1)); |
+ goto tryAgain; |
+ } |
+ } |
+ return fUsed; |
+tryAgain: ; |
+ } while (true); |
} |
void SkIntersections::cleanUpParallelLines(bool parallel) { |