| Index: src/pathops/SkPathOpsOp.cpp
 | 
| diff --git a/src/pathops/SkPathOpsOp.cpp b/src/pathops/SkPathOpsOp.cpp
 | 
| index f9a4fa3ca6993027dbddabbb28555e5b5d9606eb..9c09eaf8f3fcbcfbee8af15a01f9beadda62c2a7 100644
 | 
| --- a/src/pathops/SkPathOpsOp.cpp
 | 
| +++ b/src/pathops/SkPathOpsOp.cpp
 | 
| @@ -18,14 +18,9 @@ static SkOpSegment* findChaseOp(SkTDArray<SkOpSpanBase*>& chase, SkOpSpanBase**
 | 
|          // OPTIMIZE: prev makes this compatible with old code -- but is it necessary?
 | 
|          *startPtr = span->ptT()->prev()->span();
 | 
|          SkOpSegment* segment = (*startPtr)->segment();
 | 
| -        bool sortable = true;
 | 
|          bool done = true;
 | 
|          *endPtr = NULL;
 | 
| -        if (SkOpAngle* last = segment->activeAngle(*startPtr, startPtr, endPtr, &done,
 | 
| -                &sortable)) {
 | 
| -            if (last->unorderable()) {
 | 
| -                continue;
 | 
| -            }
 | 
| +        if (SkOpAngle* last = segment->activeAngle(*startPtr, startPtr, endPtr, &done)) {
 | 
|              *startPtr = last->start();
 | 
|              *endPtr = last->end();
 | 
|     #if TRY_ROTATE
 | 
| @@ -38,52 +33,43 @@ static SkOpSegment* findChaseOp(SkTDArray<SkOpSpanBase*>& chase, SkOpSpanBase**
 | 
|          if (done) {
 | 
|              continue;
 | 
|          }
 | 
| -        if (!sortable) {
 | 
| -            continue;
 | 
| -        }
 | 
| -        // find first angle, initialize winding to computed fWindSum
 | 
| -        const SkOpAngle* angle = segment->spanToAngle(*startPtr, *endPtr);
 | 
| -        if (!angle) {
 | 
| -            continue;
 | 
| -        }
 | 
| -        const SkOpAngle* firstAngle = angle;
 | 
| -        bool loop = false;
 | 
| -        int winding = SK_MinS32;
 | 
| -        do {
 | 
| -            angle = angle->next();
 | 
| -            if (angle == firstAngle && loop) {
 | 
| -                break;    // if we get here, there's no winding, loop is unorderable
 | 
| -            }
 | 
| -            loop |= angle == firstAngle;
 | 
| -            segment = angle->segment();
 | 
| -            winding = segment->windSum(angle);
 | 
| -        } while (winding == SK_MinS32);
 | 
| +        int winding;
 | 
| +        bool sortable;
 | 
| +        const SkOpAngle* angle = AngleWinding(*startPtr, *endPtr, &winding, &sortable);
 | 
|          if (winding == SK_MinS32) {
 | 
|              continue;
 | 
|          }
 | 
| -        int sumMiWinding = segment->updateWindingReverse(angle);
 | 
| -        int sumSuWinding = segment->updateOppWindingReverse(angle);
 | 
| -        if (segment->operand()) {
 | 
| -            SkTSwap<int>(sumMiWinding, sumSuWinding);
 | 
| +        int sumMiWinding, sumSuWinding;
 | 
| +        if (sortable) {
 | 
| +            segment = angle->segment();
 | 
| +            sumMiWinding = segment->updateWindingReverse(angle);
 | 
| +            sumSuWinding = segment->updateOppWindingReverse(angle);
 | 
| +            if (segment->operand()) {
 | 
| +                SkTSwap<int>(sumMiWinding, sumSuWinding);
 | 
| +            }
 | 
|          }
 | 
|          SkOpSegment* first = NULL;
 | 
| -        firstAngle = angle;
 | 
| +        const SkOpAngle* firstAngle = angle;
 | 
|          while ((angle = angle->next()) != firstAngle) {
 | 
|              segment = angle->segment();
 | 
|              SkOpSpanBase* start = angle->start();
 | 
|              SkOpSpanBase* end = angle->end();
 | 
|              int maxWinding, sumWinding, oppMaxWinding, oppSumWinding;
 | 
| -            segment->setUpWindings(start, end, &sumMiWinding, &sumSuWinding,
 | 
| -                    &maxWinding, &sumWinding, &oppMaxWinding, &oppSumWinding);
 | 
| +            if (sortable) {
 | 
| +                segment->setUpWindings(start, end, &sumMiWinding, &sumSuWinding,
 | 
| +                        &maxWinding, &sumWinding, &oppMaxWinding, &oppSumWinding);
 | 
| +            }
 | 
|              if (!segment->done(angle)) {
 | 
| -                if (!first) {
 | 
| +                if (!first && (sortable || start->starter(end)->windSum() != SK_MinS32)) {
 | 
|                      first = segment;
 | 
|                      *startPtr = start;
 | 
|                      *endPtr = end;
 | 
|                  }
 | 
|                  // OPTIMIZATION: should this also add to the chase?
 | 
| -                (void) segment->markAngle(maxWinding, sumWinding, oppMaxWinding,
 | 
| -                    oppSumWinding, angle);
 | 
| +                if (sortable) {
 | 
| +                    (void) segment->markAngle(maxWinding, sumWinding, oppMaxWinding,
 | 
| +                        oppSumWinding, angle);
 | 
| +                }
 | 
|              }
 | 
|          }
 | 
|          if (first) {
 | 
| 
 |