| Index: src/pathops/SkOpCoincidence.cpp
|
| diff --git a/src/pathops/SkOpCoincidence.cpp b/src/pathops/SkOpCoincidence.cpp
|
| index 45eee0a38ecc77e2986a21f3af4f3ade1956b0ce..f5804476eaaff0ace4c17831421a4d0ec27f24ce 100755
|
| --- a/src/pathops/SkOpCoincidence.cpp
|
| +++ b/src/pathops/SkOpCoincidence.cpp
|
| @@ -22,7 +22,7 @@ void SkOpCoincidence::add(SkOpPtT* coinPtTStart, SkOpPtT* coinPtTEnd, SkOpPtT* o
|
| this->fHead = coinRec;
|
| }
|
|
|
| -static void tRange(const SkOpPtT* overS, const SkOpPtT* overE, double tStart, double tEnd,
|
| +static void t_range(const SkOpPtT* overS, const SkOpPtT* overE, double tStart, double tEnd,
|
| const SkOpPtT* coinPtTStart, const SkOpPtT* coinPtTEnd, double* coinTs, double* coinTe) {
|
| double denom = overE->fT - overS->fT;
|
| double start = 0 < denom ? tStart : tEnd;
|
| @@ -38,8 +38,8 @@ bool SkOpCoincidence::addIfMissing(const SkOpPtT* over1s, const SkOpPtT* over1e,
|
| SkOpPtT* coinPtTStart, const SkOpPtT* coinPtTEnd,
|
| SkOpPtT* oppPtTStart, const SkOpPtT* oppPtTEnd, SkChunkAlloc* allocator) {
|
| double coinTs, coinTe, oppTs, oppTe;
|
| - tRange(over1s, over1e, tStart, tEnd, coinPtTStart, coinPtTEnd, &coinTs, &coinTe);
|
| - tRange(over2s, over2e, tStart, tEnd, oppPtTStart, oppPtTEnd, &oppTs, &oppTe);
|
| + t_range(over1s, over1e, tStart, tEnd, coinPtTStart, coinPtTEnd, &coinTs, &coinTe);
|
| + t_range(over2s, over2e, tStart, tEnd, oppPtTStart, oppPtTEnd, &oppTs, &oppTe);
|
| SkOpSegment* coinSeg = coinPtTStart->segment();
|
| SkOpSegment* oppSeg = oppPtTStart->segment();
|
| SkASSERT(coinSeg != oppSeg);
|
| @@ -103,7 +103,7 @@ bool SkOpCoincidence::addMissing(SkChunkAlloc* allocator) {
|
| double overS, overE;
|
| if (this->overlap(outer->fCoinPtTStart, outer->fCoinPtTEnd,
|
| inner->fCoinPtTStart, inner->fCoinPtTEnd, &overS, &overE)) {
|
| - if (!addIfMissing(outer->fCoinPtTStart, outer->fCoinPtTEnd,
|
| + if (!this->addIfMissing(outer->fCoinPtTStart, outer->fCoinPtTEnd,
|
| inner->fCoinPtTStart, inner->fCoinPtTEnd, overS, overE,
|
| outer->fOppPtTStart, outer->fOppPtTEnd,
|
| inner->fOppPtTStart, inner->fOppPtTEnd, allocator)) {
|
| @@ -111,7 +111,7 @@ bool SkOpCoincidence::addMissing(SkChunkAlloc* allocator) {
|
| }
|
| } else if (this->overlap(outer->fCoinPtTStart, outer->fCoinPtTEnd,
|
| inner->fOppPtTStart, inner->fOppPtTEnd, &overS, &overE)) {
|
| - if (!addIfMissing(outer->fCoinPtTStart, outer->fCoinPtTEnd,
|
| + if (!this->addIfMissing(outer->fCoinPtTStart, outer->fCoinPtTEnd,
|
| inner->fOppPtTStart, inner->fOppPtTEnd, overS, overE,
|
| outer->fOppPtTStart, outer->fOppPtTEnd,
|
| inner->fCoinPtTStart, inner->fCoinPtTEnd, allocator)) {
|
| @@ -119,7 +119,7 @@ bool SkOpCoincidence::addMissing(SkChunkAlloc* allocator) {
|
| }
|
| } else if (this->overlap(outer->fOppPtTStart, outer->fOppPtTEnd,
|
| inner->fCoinPtTStart, inner->fCoinPtTEnd, &overS, &overE)) {
|
| - if (!addIfMissing(outer->fOppPtTStart, outer->fOppPtTEnd,
|
| + if (!this->addIfMissing(outer->fOppPtTStart, outer->fOppPtTEnd,
|
| inner->fCoinPtTStart, inner->fCoinPtTEnd, overS, overE,
|
| outer->fCoinPtTStart, outer->fCoinPtTEnd,
|
| inner->fOppPtTStart, inner->fOppPtTEnd, allocator)) {
|
| @@ -127,7 +127,7 @@ bool SkOpCoincidence::addMissing(SkChunkAlloc* allocator) {
|
| }
|
| } else if (this->overlap(outer->fOppPtTStart, outer->fOppPtTEnd,
|
| inner->fOppPtTStart, inner->fOppPtTEnd, &overS, &overE)) {
|
| - if (!addIfMissing(outer->fOppPtTStart, outer->fOppPtTEnd,
|
| + if (!this->addIfMissing(outer->fOppPtTStart, outer->fOppPtTEnd,
|
| inner->fOppPtTStart, inner->fOppPtTEnd, overS, overE,
|
| outer->fCoinPtTStart, outer->fCoinPtTEnd,
|
| inner->fCoinPtTStart, inner->fCoinPtTEnd, allocator)) {
|
| @@ -140,7 +140,6 @@ bool SkOpCoincidence::addMissing(SkChunkAlloc* allocator) {
|
| return true;
|
| }
|
|
|
| -
|
| bool SkOpCoincidence::contains(SkOpPtT* coinPtTStart, SkOpPtT* coinPtTEnd, SkOpPtT* oppPtTStart,
|
| SkOpPtT* oppPtTEnd, bool flipped) {
|
| SkCoincidentSpans* coin = fHead;
|
| @@ -245,11 +244,9 @@ bool SkOpCoincidence::apply() {
|
| break;
|
| }
|
| start = next->upCast();
|
| - if (!oNext) {
|
| - return false;
|
| - }
|
| - if (!oNext->upCastable()) {
|
| - return false;
|
| + // if the opposite ran out too soon, just reuse the last span
|
| + if (!oNext || !oNext->upCastable()) {
|
| + oNext = oStart;
|
| }
|
| oStart = oNext->upCast();
|
| } while (true);
|
|
|