| Index: src/pathops/SkDCubicLineIntersection.cpp | 
| diff --git a/src/pathops/SkDCubicLineIntersection.cpp b/src/pathops/SkDCubicLineIntersection.cpp | 
| index 11876f8d7356debebc8da391fa8c4ea8a2fd2f18..418e107e4170ffe9ad8e78b50d8435821bdbc223 100644 | 
| --- a/src/pathops/SkDCubicLineIntersection.cpp | 
| +++ b/src/pathops/SkDCubicLineIntersection.cpp | 
| @@ -105,6 +105,11 @@ int intersect() { | 
| double lineT = findLineT(cubicT); | 
| if (pinTs(&cubicT, &lineT)) { | 
| SkDPoint pt = line.xyAtT(lineT); | 
| +#if ONE_OFF_DEBUG | 
| +            SkDPoint cPt = cubic.xyAtT(cubicT); | 
| +            SkDebugf("%s pt=(%1.9g,%1.9g) cPt=(%1.9g,%1.9g)\n", __FUNCTION__, pt.fX, pt.fY, | 
| +                    cPt.fX, cPt.fY); | 
| +#endif | 
| intersections.insert(cubicT, lineT, pt); | 
| } | 
| } | 
| @@ -165,11 +170,34 @@ protected: | 
|  | 
| void addEndPoints() { | 
| for (int cIndex = 0; cIndex < 4; cIndex += 3) { | 
| +        bool foundEnd = false; | 
| for (int lIndex = 0; lIndex < 2; lIndex++) { | 
| if (cubic[cIndex] == line[lIndex]) { | 
| intersections.insert(cIndex >> 1, lIndex, line[lIndex]); | 
| +                foundEnd = true; | 
| } | 
| } | 
| +        // for the test case this was written for, the dist / error ratio was 170.6667 | 
| +        // it looks like the cubic stops short of touching the line, but this fixed it. | 
| +        if (foundEnd) { | 
| +            continue; | 
| +        } | 
| +        // See if the cubic end touches the line. | 
| +        double dist = line.isLeft(cubic[cIndex]); // this distance isn't cartesian | 
| +        SkDVector lineLen = line[1] - line[0]; // the x/y magnitudes of the line | 
| +        // compute the ULPS of the larger of the x/y deltas | 
| +        double larger = SkTMax(SkTAbs(lineLen.fX), SkTAbs(lineLen.fY)); | 
| +        if (!RoughlyEqualUlps(larger, larger + dist)) { // is the dist within ULPS tolerance? | 
| +            continue; | 
| +        } | 
| +        double lineT = findLineT(cIndex >> 1); | 
| +        if (!between(0, lineT, 1)) { | 
| +            continue; | 
| +        } | 
| +        SkDPoint linePt = line.xyAtT(lineT); | 
| +        if (linePt.approximatelyEqual(cubic[cIndex])) { | 
| +            intersections.insert(cIndex >> 1, lineT, cubic[cIndex]); | 
| +        } | 
| } | 
| } | 
|  | 
|  |