| Index: src/pathops/SkOpSegment.cpp
|
| diff --git a/src/pathops/SkOpSegment.cpp b/src/pathops/SkOpSegment.cpp
|
| index 2dda11a3836e57e4c1919823bc71da2fa557e64c..95046e2fd2d3da7b8b1aafc085392c5a26f16707 100644
|
| --- a/src/pathops/SkOpSegment.cpp
|
| +++ b/src/pathops/SkOpSegment.cpp
|
| @@ -1211,7 +1211,7 @@ void SkOpSegment::bumpCoincidentBlind(bool binary, int index, int endIndex) {
|
| } while (++index < endIndex);
|
| }
|
|
|
| -void SkOpSegment::bumpCoincidentThis(const SkOpSpan& oTest, bool binary, int* indexPtr,
|
| +bool SkOpSegment::bumpCoincidentThis(const SkOpSpan& oTest, bool binary, int* indexPtr,
|
| SkTArray<SkPoint, true>* outsideTs) {
|
| int index = *indexPtr;
|
| int oWindValue = oTest.fWindValue;
|
| @@ -1223,12 +1223,16 @@ void SkOpSegment::bumpCoincidentThis(const SkOpSpan& oTest, bool binary, int* in
|
| SkOpSpan* end = test;
|
| const SkPoint& oStartPt = oTest.fPt;
|
| do {
|
| + if (end->fDone && !end->fTiny && !end->fSmall) { // extremely large paths trigger this
|
| + return false;
|
| + }
|
| if (bumpSpan(end, oWindValue, oOppValue)) {
|
| TrackOutside(outsideTs, oStartPt);
|
| }
|
| end = &fTs[++index];
|
| } while ((end->fPt == test->fPt || precisely_equal(end->fT, test->fT)) && end->fT < 1);
|
| *indexPtr = index;
|
| + return true;
|
| }
|
|
|
| void SkOpSegment::bumpCoincidentOBlind(int index, int endIndex) {
|
| @@ -1329,10 +1333,14 @@ bool SkOpSegment::addTCoincident(const SkPoint& startPt, const SkPoint& endPt, d
|
| } while (*oTestPt == other->fTs[oIndex].fPt);
|
| } else {
|
| if (!binary || test->fWindValue + oTest->fOppValue >= 0) {
|
| - bumpCoincidentThis(*oTest, binary, &index, &outsidePts);
|
| + if (!bumpCoincidentThis(*oTest, binary, &index, &outsidePts)) {
|
| + return false;
|
| + }
|
| other->bumpCoincidentOther(*test, &oIndex, &oOutsidePts);
|
| } else {
|
| - other->bumpCoincidentThis(*test, binary, &oIndex, &oOutsidePts);
|
| + if (!other->bumpCoincidentThis(*test, binary, &oIndex, &oOutsidePts)) {
|
| + return false;
|
| + }
|
| bumpCoincidentOther(*oTest, &index, &outsidePts);
|
| }
|
| }
|
| @@ -1396,7 +1404,9 @@ bool SkOpSegment::addTCoincident(const SkPoint& startPt, const SkPoint& endPt, d
|
| if (!binary || test->fWindValue + oTest->fOppValue >= 0) {
|
| other->bumpCoincidentOther(*test, &oIndex, &oOutsidePts);
|
| } else {
|
| - other->bumpCoincidentThis(*test, binary, &oIndex, &oOutsidePts);
|
| + if (!other->bumpCoincidentThis(*test, binary, &oIndex, &oOutsidePts)) {
|
| + return false;
|
| + }
|
| }
|
| oTest = &other->fTs[oIndex];
|
| oTestPt = &oTest->fPt;
|
|
|