Index: src/pathops/SkDCubicIntersection.cpp |
diff --git a/src/pathops/SkDCubicIntersection.cpp b/src/pathops/SkDCubicIntersection.cpp |
index 9d83242eda6085171615d47af598bcd65fb019dd..2fb35e182794dcec2bb86cb654a0d7d22a3b0af0 100644 |
--- a/src/pathops/SkDCubicIntersection.cpp |
+++ b/src/pathops/SkDCubicIntersection.cpp |
@@ -109,12 +109,14 @@ static void intersect(const SkDCubic& cubic1, double t1s, double t1e, const SkDC |
__FUNCTION__, t1Start, t1, t2Start, t2); |
SkIntersections xlocals; |
xlocals.allowNear(false); |
+ xlocals.allowFlatMeasure(true); |
intersectWithOrder(s1.fQuad, o1, s2.fQuad, o2, xlocals); |
SkDebugf(" xlocals.fUsed=%d\n", xlocals.used()); |
} |
#endif |
SkIntersections locals; |
locals.allowNear(false); |
+ locals.allowFlatMeasure(true); |
intersectWithOrder(s1.fQuad, o1, s2.fQuad, o2, locals); |
int tCount = locals.used(); |
for (int tIdx = 0; tIdx < tCount; ++tIdx) { |
@@ -296,6 +298,7 @@ bool SkIntersections::cubicExactEnd(const SkDCubic& cubic1, bool start, const Sk |
tmpLine[1].fY -= cubic2[2 - start].fX - cubic2[t1Index].fX; |
SkIntersections impTs; |
impTs.allowNear(false); |
+ impTs.allowFlatMeasure(true); |
impTs.intersectRay(cubic1, tmpLine); |
for (int index = 0; index < impTs.used(); ++index) { |
SkDPoint realPt = impTs.pt(index); |
@@ -556,6 +559,7 @@ int SkIntersections::intersect(const SkDCubic& c1, const SkDCubic& c2) { |
} |
SkIntersections i; |
i.fAllowNear = false; |
+ i.fFlatMeasure = true; |
i.fMax = 9; |
::intersect(c1, 0, 1, c2, 0, 1, 1, i); |
int compCount = i.used(); |
@@ -662,7 +666,7 @@ int SkIntersections::intersect(const SkDCubic& c1, const SkDCubic& c2) { |
// OPTIMIZATION If this is a common use case, optimize by duplicating |
// the intersect 3 loop to avoid the promotion / demotion code |
int SkIntersections::intersect(const SkDCubic& cubic, const SkDQuad& quad) { |
- fMax = 6; |
+ fMax = 7; |
SkDCubic up = quad.toCubic(); |
(void) intersect(cubic, up); |
return used(); |
@@ -684,7 +688,9 @@ int SkIntersections::intersect(const SkDCubic& c) { |
// OPTIMIZATION: could quick reject if neither end point tangent ray intersected the line |
// segment formed by the opposite end point to the control point |
(void) intersect(c, c); |
- if (used() > 0) { |
+ if (used() > 1) { |
+ fUsed = 0; |
+ } else if (used() > 0) { |
if (approximately_equal_double(fT[0][0], fT[1][0])) { |
fUsed = 0; |
} else { |