| Index: src/pathops/SkPathOpsSimplify.cpp
|
| diff --git a/src/pathops/SkPathOpsSimplify.cpp b/src/pathops/SkPathOpsSimplify.cpp
|
| index 548f83e6605b678637469772613e8e00d10c115a..66a6c40268eb71779389303a20d261dbd314c769 100644
|
| --- a/src/pathops/SkPathOpsSimplify.cpp
|
| +++ b/src/pathops/SkPathOpsSimplify.cpp
|
| @@ -33,9 +33,6 @@ static bool bridgeWinding(SkTArray<SkOpContour*, true>& contourList, SkPathWrite
|
| if (current->activeWinding(index, endIndex)) {
|
| do {
|
| if (!unsortable && current->done()) {
|
| - #if DEBUG_ACTIVE_SPANS
|
| - DebugShowActiveSpans(contourList);
|
| - #endif
|
| if (simple->isEmpty()) {
|
| simple->init();
|
| break;
|
| @@ -77,11 +74,15 @@ static bool bridgeWinding(SkTArray<SkOpContour*, true>& contourList, SkPathWrite
|
| simple->close();
|
| } else {
|
| SkOpSpan* last = current->markAndChaseDoneUnary(index, endIndex);
|
| - if (last && !last->fLoop) {
|
| + if (last && !last->fChased && !last->fLoop) {
|
| + last->fChased = true;
|
| + SkASSERT(!SkPathOpsDebug::ChaseContains(chaseArray, last));
|
| + // assert that last isn't already in array
|
| *chaseArray.append() = last;
|
| }
|
| }
|
| - current = FindChase(chaseArray, index, endIndex);
|
| + SkTDArray<SkOpSpan *>* chaseArrayPtr = &chaseArray;
|
| + current = FindChase(chaseArrayPtr, &index, &endIndex);
|
| #if DEBUG_ACTIVE_SPANS
|
| DebugShowActiveSpans(contourList);
|
| #endif
|
| @@ -182,7 +183,9 @@ bool Simplify(const SkPath& path, SkPath* result) {
|
| next = *nextPtr++;
|
| } while (AddIntersectTs(current, next) && nextPtr != listEnd);
|
| } while (currentPtr != listEnd);
|
| - HandleCoincidence(&contourList, 0);
|
| + if (!HandleCoincidence(&contourList, 0)) {
|
| + return false;
|
| + }
|
| // construct closed contours
|
| SkPathWriter simple(*result);
|
| if (builder.xorMask() == kWinding_PathOpsMask ? bridgeWinding(contourList, &simple)
|
|
|