| Index: src/pathops/SkDLineIntersection.cpp
 | 
| diff --git a/src/pathops/SkDLineIntersection.cpp b/src/pathops/SkDLineIntersection.cpp
 | 
| index 89695395e639633b66aa6f1231093c08dd97fe39..9ae0107173926e923b1936fd883d1953377ebd18 100644
 | 
| --- a/src/pathops/SkDLineIntersection.cpp
 | 
| +++ b/src/pathops/SkDLineIntersection.cpp
 | 
| @@ -154,15 +154,52 @@ int SkIntersections::intersect(const SkDLine& a, const SkDLine& b) {
 | 
|              computePoints(a, 1);
 | 
|          }
 | 
|      }
 | 
| +/* Allow tracking that both sets of end points are near each other -- the lines are entirely 
 | 
| +   coincident -- even when the end points are not exactly the same.
 | 
| +   Mark this as a 'wild card' for the end points, so that either point is considered totally
 | 
| +   coincident. Then, avoid folding the lines over each other, but allow either end to mate 
 | 
| +   to the next set of lines.
 | 
| + */
 | 
|      if (fAllowNear || !unparallel) {
 | 
| -        for (int iA = 0; iA < 2; ++iA) {
 | 
| -            if ((t = b.nearPoint(a[iA])) >= 0) {
 | 
| -                insert(iA, t, a[iA]);
 | 
| -            }
 | 
| +        double aNearB[2];
 | 
| +        double bNearA[2];
 | 
| +        bool aNotB[2] = {false, false};
 | 
| +        bool bNotA[2] = {false, false};
 | 
| +        int nearCount = 0;
 | 
| +        for (int index = 0; index < 2; ++index) {
 | 
| +            aNearB[index] = t = b.nearPoint(a[index], &aNotB[index]);
 | 
| +            nearCount += t >= 0;
 | 
| +            bNearA[index] = t = a.nearPoint(b[index], &bNotA[index]);
 | 
| +            nearCount += t >= 0;
 | 
|          }
 | 
| -        for (int iB = 0; iB < 2; ++iB) {
 | 
| -            if ((t = a.nearPoint(b[iB])) >= 0) {
 | 
| -                insert(t, iB, b[iB]);
 | 
| +        if (nearCount > 0) {
 | 
| +            for (int iA = 0; iA < 2; ++iA) {
 | 
| +                if (!aNotB[iA]) {
 | 
| +                    continue;
 | 
| +                }
 | 
| +                int nearer = aNearB[iA] > 0.5;
 | 
| +                if (!bNotA[nearer]) {
 | 
| +                    continue;
 | 
| +                }
 | 
| +                SkASSERT(a[iA] != b[nearer]);
 | 
| +                SkASSERT(iA == (bNearA[nearer] > 0.5));
 | 
| +                fNearlySame[iA] = true;
 | 
| +                insertNear(iA, nearer, a[iA], b[nearer]);
 | 
| +                aNearB[iA] = -1;
 | 
| +                bNearA[nearer] = -1;
 | 
| +                nearCount -= 2;
 | 
| +            }
 | 
| +            if (nearCount > 0) {
 | 
| +                for (int iA = 0; iA < 2; ++iA) {
 | 
| +                    if (aNearB[iA] >= 0) {
 | 
| +                        insert(iA, aNearB[iA], a[iA]);
 | 
| +                    }
 | 
| +                }
 | 
| +                for (int iB = 0; iB < 2; ++iB) {
 | 
| +                    if (bNearA[iB] >= 0) {
 | 
| +                        insert(bNearA[iB], iB, b[iB]);
 | 
| +                    }
 | 
| +                }
 | 
|              }
 | 
|          }
 | 
|      }
 | 
| @@ -240,12 +277,12 @@ int SkIntersections::horizontal(const SkDLine& line, double left, double right,
 | 
|          }
 | 
|      }
 | 
|      if (fAllowNear || result == 2) {
 | 
| -        if ((t = line.nearPoint(leftPt)) >= 0) {
 | 
| +        if ((t = line.nearPoint(leftPt, NULL)) >= 0) {
 | 
|              insert(t, (double) flipped, leftPt);
 | 
|          }
 | 
|          if (left != right) {
 | 
|              const SkDPoint rightPt = { right, y };
 | 
| -            if ((t = line.nearPoint(rightPt)) >= 0) {
 | 
| +            if ((t = line.nearPoint(rightPt, NULL)) >= 0) {
 | 
|                  insert(t, (double) !flipped, rightPt);
 | 
|              }
 | 
|              for (int index = 0; index < 2; ++index) {
 | 
| @@ -328,12 +365,12 @@ int SkIntersections::vertical(const SkDLine& line, double top, double bottom,
 | 
|          }
 | 
|      }
 | 
|      if (fAllowNear || result == 2) {
 | 
| -        if ((t = line.nearPoint(topPt)) >= 0) {
 | 
| +        if ((t = line.nearPoint(topPt, NULL)) >= 0) {
 | 
|              insert(t, (double) flipped, topPt);
 | 
|          }
 | 
|          if (top != bottom) {
 | 
|              SkDPoint bottomPt = { x, bottom };
 | 
| -            if ((t = line.nearPoint(bottomPt)) >= 0) {
 | 
| +            if ((t = line.nearPoint(bottomPt, NULL)) >= 0) {
 | 
|                  insert(t, (double) !flipped, bottomPt);
 | 
|              }
 | 
|              for (int index = 0; index < 2; ++index) {
 | 
| 
 |