Index: src/pathops/SkPathOpsCommon.cpp |
diff --git a/src/pathops/SkPathOpsCommon.cpp b/src/pathops/SkPathOpsCommon.cpp |
index 28cf59cdd37f491fd260340fb032c2ef98e1851d..7dd13a7fe8dd6958788c006d35c605f9e153da68 100644 |
--- a/src/pathops/SkPathOpsCommon.cpp |
+++ b/src/pathops/SkPathOpsCommon.cpp |
@@ -250,6 +250,9 @@ static SkOpSegment* findSortableTop(const SkTArray<SkOpContour*, true>& contourL |
*topLeft = bestXY; |
result = topStart->findTop(index, endIndex, unsortable, onlySortable); |
} while (!result); |
+ if (result) { |
+ *unsortable = false; |
+ } |
return result; |
} |
@@ -288,9 +291,9 @@ static void skipVertical(const SkTArray<SkOpContour*, true>& contourList, |
} |
} |
-SkOpSegment* FindSortableTop(const SkTArray<SkOpContour*, true>& contourList, bool* firstContour, |
- int* indexPtr, int* endIndexPtr, SkPoint* topLeft, bool* unsortable, |
- bool* done, bool binary) { |
+SkOpSegment* FindSortableTop(const SkTArray<SkOpContour*, true>& contourList, |
+ SkOpAngle::IncludeType angleIncludeType, bool* firstContour, int* indexPtr, |
+ int* endIndexPtr, SkPoint* topLeft, bool* unsortable, bool* done) { |
SkOpSegment* current = findSortableTop(contourList, indexPtr, endIndexPtr, topLeft, unsortable, |
done, true); |
if (!current) { |
@@ -308,8 +311,11 @@ SkOpSegment* FindSortableTop(const SkTArray<SkOpContour*, true>& contourList, bo |
if (sumWinding != SK_MinS32) { |
return current; |
} |
- sumWinding = current->computeSum(index, endIndex, binary); |
- if (sumWinding != SK_MinS32) { |
+ SkASSERT(current->windSum(SkMin32(index, endIndex)) == SK_MinS32); |
+ SkSTArray<SkOpAngle::kStackBasedCount, SkOpAngle, true> angles; |
+ SkSTArray<SkOpAngle::kStackBasedCount, SkOpAngle*, true> sorted; |
+ sumWinding = current->computeSum(index, endIndex, angleIncludeType, &angles, &sorted); |
+ if (sumWinding != SK_MinS32 && sumWinding != SK_NaN32) { |
return current; |
} |
int contourWinding; |
@@ -333,7 +339,7 @@ SkOpSegment* FindSortableTop(const SkTArray<SkOpContour*, true>& contourList, bo |
if (tryAgain) { |
continue; |
} |
- if (!binary) { |
+ if (angleIncludeType < SkOpAngle::kBinarySingle) { |
break; |
} |
oppContourWinding = rightAngleWinding(contourList, ¤t, indexPtr, endIndexPtr, &tHit, |
@@ -354,6 +360,15 @@ void CheckEnds(SkTArray<SkOpContour*, true>* contourList) { |
} |
} |
+// A tiny interval may indicate an undiscovered coincidence. Find and fix. |
+void CheckTiny(SkTArray<SkOpContour*, true>* contourList) { |
+ int contourCount = (*contourList).count(); |
+ for (int cTest = 0; cTest < contourCount; ++cTest) { |
+ SkOpContour* contour = (*contourList)[cTest]; |
+ contour->checkTiny(); |
+ } |
+} |
+ |
void FixOtherTIndex(SkTArray<SkOpContour*, true>* contourList) { |
int contourCount = (*contourList).count(); |
for (int cTest = 0; cTest < contourCount; ++cTest) { |