Index: src/pathops/SkPathOpsWinding.cpp |
diff --git a/src/pathops/SkPathOpsWinding.cpp b/src/pathops/SkPathOpsWinding.cpp |
index 584ebd457a8dba8ffb94aac5f796214cd4721fdf..4c6c636e2be55fe2b829a11d436b31323be257c2 100644 |
--- a/src/pathops/SkPathOpsWinding.cpp |
+++ b/src/pathops/SkPathOpsWinding.cpp |
@@ -192,7 +192,7 @@ SkOpSpan* SkOpSegment::windingSpanAtT(double tHit) { |
next = span->next(); |
if (approximately_equal(tHit, next->t())) { |
return nullptr; |
- } |
+ } |
if (tHit < next->t()) { |
return span; |
} |
@@ -243,6 +243,10 @@ bool SkOpSpan::sortableTop(SkOpContour* contourHead) { |
} |
SkOpRayHit* hitHead = &hitBase; |
dir = static_cast<SkOpRayDir>(static_cast<int>(dir) + dirOffset); |
+ if (hitBase.fSpan && hitBase.fSpan->segment()->verb() > SkPath::kLine_Verb |
+ && !pt_yx(hitBase.fSlope.asSkVector(), dir)) { |
+ return false; |
+ } |
SkOpContour* contour = contourHead; |
do { |
contour->rayCheck(hitBase, dir, &hitHead, &allocator); |
@@ -256,11 +260,11 @@ bool SkOpSpan::sortableTop(SkOpContour* contourHead) { |
} |
int count = sorted.count(); |
SkTQSort(sorted.begin(), sorted.end() - 1, xy_index(dir) |
- ? less_than(dir) ? hit_compare_y : reverse_hit_compare_y |
+ ? less_than(dir) ? hit_compare_y : reverse_hit_compare_y |
: less_than(dir) ? hit_compare_x : reverse_hit_compare_x); |
// verify windings |
#if DEBUG_WINDING |
- SkDebugf("%s dir=%s seg=%d t=%1.9g pt=(%1.9g,%1.9g)\n", __FUNCTION__, |
+ SkDebugf("%s dir=%s seg=%d t=%1.9g pt=(%1.9g,%1.9g)\n", __FUNCTION__, |
gDebugRayDirName[static_cast<int>(dir)], hitBase.fSpan->segment()->debugID(), |
hitBase.fT, hitBase.fPt.fX, hitBase.fPt.fY); |
for (int index = 0; index < count; ++index) { |
@@ -378,15 +382,20 @@ SkOpSpan* SkOpSegment::findSortableTop(SkOpContour* contourHead) { |
SkOpSpan* SkOpContour::findSortableTop(SkOpContour* contourHead) { |
SkOpSegment* testSegment = &fHead; |
+ bool allDone = true; |
do { |
if (testSegment->done()) { |
continue; |
} |
+ allDone = false; |
SkOpSpan* result = testSegment->findSortableTop(contourHead); |
if (result) { |
return result; |
} |
} while ((testSegment = testSegment->next())); |
+ if (allDone) { |
+ fDone = true; |
+ } |
return nullptr; |
} |