| Index: src/pathops/SkOpCoincidence.cpp
|
| diff --git a/src/pathops/SkOpCoincidence.cpp b/src/pathops/SkOpCoincidence.cpp
|
| index 84c4003968030da5f7d2145c417aa7f5cb1160d1..7717d06a8085190ebbf5e14c00fb911bf30bd328 100755
|
| --- a/src/pathops/SkOpCoincidence.cpp
|
| +++ b/src/pathops/SkOpCoincidence.cpp
|
| @@ -8,12 +8,6 @@
|
| #include "SkOpSegment.h"
|
| #include "SkPathOpsTSect.h"
|
|
|
| -#if DEBUG_COINCIDENCE
|
| -#define FAIL_IF(cond) SkASSERT(!(cond))
|
| -#else
|
| -#define FAIL_IF(cond) do { if (cond) return false; } while (false)
|
| -#endif
|
| -
|
| // returns true if coincident span's start and end are the same
|
| bool SkCoincidentSpans::collapsed(const SkOpPtT* test) const {
|
| return (fCoinPtTStart == test && fCoinPtTEnd->contains(test))
|
| @@ -330,7 +324,8 @@ bool SkOpCoincidence::addEndMovedSpans(const SkOpSpan* base, const SkOpSpanBase*
|
| SkTSwap(coinTs, coinTe);
|
| SkTSwap(oppTs, oppTe);
|
| }
|
| - if (!this->addOrOverlap(coinSeg, oppSeg, coinTs, coinTe, oppTs, oppTe)) {
|
| + if (!this->addOrOverlap(coinSeg, oppSeg, coinTs, coinTe, oppTs, oppTe
|
| + SkDEBUGPARAMS(true) /* do assert if addOrOverlap fails */ )) {
|
| return false;
|
| }
|
| }
|
| @@ -340,14 +335,10 @@ bool SkOpCoincidence::addEndMovedSpans(const SkOpSpan* base, const SkOpSpanBase*
|
|
|
| // description below
|
| bool SkOpCoincidence::addEndMovedSpans(const SkOpPtT* ptT) {
|
| - if (!ptT->span()->upCastable()) {
|
| - return false;
|
| - }
|
| + FAIL_IF(!ptT->span()->upCastable());
|
| const SkOpSpan* base = ptT->span()->upCast();
|
| const SkOpSpan* prev = base->prev();
|
| - if (!prev) {
|
| - return false;
|
| - }
|
| + FAIL_IF(!prev);
|
| if (!prev->isCanceled()) {
|
| if (!this->addEndMovedSpans(base, base->prev())) {
|
| return false;
|
| @@ -379,9 +370,7 @@ bool SkOpCoincidence::addEndMovedSpans() {
|
| fHead = nullptr;
|
| do {
|
| if (span->coinPtTStart()->fPt != span->oppPtTStart()->fPt) {
|
| - if (1 == span->coinPtTStart()->fT) {
|
| - return false;
|
| - }
|
| + FAIL_IF(1 == span->coinPtTStart()->fT);
|
| bool onEnd = span->coinPtTStart()->fT == 0;
|
| bool oOnEnd = zero_or_one(span->oppPtTStart()->fT);
|
| if (onEnd) {
|
| @@ -608,16 +597,18 @@ bool SkOpCoincidence::addIfMissing(const SkOpPtT* over1s, const SkOpPtT* over1e,
|
| if (coinSeg == oppSeg) {
|
| return false;
|
| }
|
| - return this->addOrOverlap(coinSeg, oppSeg, coinTs, coinTe, oppTs, oppTe);
|
| + return this->addOrOverlap(coinSeg, oppSeg, coinTs, coinTe, oppTs, oppTe
|
| + SkDEBUGPARAMS(false) /* don't assert if addOrOverlap fails */ );
|
| }
|
|
|
| /* Please keep this in sync with debugAddOrOverlap() */
|
| +// If this is called by addEndMovedSpans(), a returned false propogates out to an abort.
|
| +// If this is called by AddIfMissing(), a returned false indicates there was nothing to add
|
| bool SkOpCoincidence::addOrOverlap(SkOpSegment* coinSeg, SkOpSegment* oppSeg,
|
| - double coinTs, double coinTe, double oppTs, double oppTe) {
|
| + double coinTs, double coinTe, double oppTs, double oppTe
|
| + SkDEBUGPARAMS(bool callerAborts)) {
|
| SkTDArray<SkCoincidentSpans*> overlaps;
|
| - if (!fTop) {
|
| - return false;
|
| - }
|
| + RETURN_FALSE_IF(callerAborts, !fTop);
|
| if (!this->checkOverlap(fTop, coinSeg, oppSeg, coinTs, coinTe, oppTs, oppTe, &overlaps)) {
|
| return false;
|
| }
|
| @@ -650,43 +641,29 @@ bool SkOpCoincidence::addOrOverlap(SkOpSegment* coinSeg, SkOpSegment* oppSeg,
|
| }
|
| const SkOpPtT* cs = coinSeg->existing(coinTs, oppSeg);
|
| const SkOpPtT* ce = coinSeg->existing(coinTe, oppSeg);
|
| - if (overlap && cs && ce && overlap->contains(cs, ce)) {
|
| - return false;
|
| - }
|
| - if (cs == ce && cs) {
|
| - return false;
|
| - }
|
| + RETURN_FALSE_IF(callerAborts, overlap && cs && ce && overlap->contains(cs, ce));
|
| + RETURN_FALSE_IF(callerAborts, cs == ce && cs);
|
| const SkOpPtT* os = oppSeg->existing(oppTs, coinSeg);
|
| const SkOpPtT* oe = oppSeg->existing(oppTe, coinSeg);
|
| - if (overlap && os && oe && overlap->contains(os, oe)) {
|
| - return false;
|
| - }
|
| + RETURN_FALSE_IF(callerAborts, overlap && os && oe && overlap->contains(os, oe));
|
| SkASSERT(!cs || !cs->deleted());
|
| SkASSERT(!os || !os->deleted());
|
| SkASSERT(!ce || !ce->deleted());
|
| SkASSERT(!oe || !oe->deleted());
|
| const SkOpPtT* csExisting = !cs ? coinSeg->existing(coinTs, nullptr) : nullptr;
|
| const SkOpPtT* ceExisting = !ce ? coinSeg->existing(coinTe, nullptr) : nullptr;
|
| - if (csExisting && csExisting == ceExisting) {
|
| - return false;
|
| - }
|
| - if (csExisting && (csExisting == ce || csExisting->contains(ceExisting ? ceExisting : ce))) {
|
| - return false;
|
| - }
|
| - if (ceExisting && (ceExisting == cs || ceExisting->contains(csExisting ? csExisting : cs))) {
|
| - return false;
|
| - }
|
| + RETURN_FALSE_IF(callerAborts, csExisting && csExisting == ceExisting);
|
| + RETURN_FALSE_IF(callerAborts, csExisting && (csExisting == ce ||
|
| + csExisting->contains(ceExisting ? ceExisting : ce)));
|
| + RETURN_FALSE_IF(callerAborts, ceExisting && (ceExisting == cs ||
|
| + ceExisting->contains(csExisting ? csExisting : cs)));
|
| const SkOpPtT* osExisting = !os ? oppSeg->existing(oppTs, nullptr) : nullptr;
|
| const SkOpPtT* oeExisting = !oe ? oppSeg->existing(oppTe, nullptr) : nullptr;
|
| - if (osExisting && osExisting == oeExisting) {
|
| - return false;
|
| - }
|
| - if (osExisting && (osExisting == oe || osExisting->contains(oeExisting ? oeExisting : oe))) {
|
| - return false;
|
| - }
|
| - if (oeExisting && (oeExisting == os || oeExisting->contains(osExisting ? osExisting : os))) {
|
| - return false;
|
| - }
|
| + RETURN_FALSE_IF(callerAborts, osExisting && osExisting == oeExisting);
|
| + RETURN_FALSE_IF(callerAborts, osExisting && (osExisting == oe ||
|
| + osExisting->contains(oeExisting ? oeExisting : oe)));
|
| + RETURN_FALSE_IF(callerAborts, oeExisting && (oeExisting == os ||
|
| + oeExisting->contains(osExisting ? osExisting : os)));
|
| // extra line in debug code
|
| this->debugValidate();
|
| if (!cs || !os) {
|
| @@ -694,15 +671,11 @@ bool SkOpCoincidence::addOrOverlap(SkOpSegment* coinSeg, SkOpSegment* oppSeg,
|
| : coinSeg->addT(coinTs, nullptr);
|
| SkOpPtT* osWritable = os ? const_cast<SkOpPtT*>(os)
|
| : oppSeg->addT(oppTs, nullptr);
|
| - if (!csWritable || !osWritable) {
|
| - return false;
|
| - }
|
| + RETURN_FALSE_IF(callerAborts, !csWritable || !osWritable);
|
| csWritable->span()->addOppAndMerge(osWritable->span());
|
| cs = csWritable;
|
| os = osWritable;
|
| - if ((ce && ce->deleted()) || (oe && oe->deleted())) {
|
| - return false;
|
| - }
|
| + RETURN_FALSE_IF(callerAborts, (ce && ce->deleted()) || (oe && oe->deleted()));
|
| }
|
| if (!ce || !oe) {
|
| SkOpPtT* ceWritable = ce ? const_cast<SkOpPtT*>(ce)
|
| @@ -714,12 +687,11 @@ bool SkOpCoincidence::addOrOverlap(SkOpSegment* coinSeg, SkOpSegment* oppSeg,
|
| oe = oeWritable;
|
| }
|
| this->debugValidate();
|
| - if (cs->deleted() || os->deleted() || ce->deleted() || oe->deleted()) {
|
| - return false;
|
| - }
|
| - if (cs->contains(ce) || os->contains(oe)) {
|
| - return false;
|
| - }
|
| + RETURN_FALSE_IF(callerAborts, cs->deleted());
|
| + RETURN_FALSE_IF(callerAborts, os->deleted());
|
| + RETURN_FALSE_IF(callerAborts, ce->deleted());
|
| + RETURN_FALSE_IF(callerAborts, oe->deleted());
|
| + RETURN_FALSE_IF(callerAborts, cs->contains(ce) || os->contains(oe));
|
| bool result = true;
|
| if (overlap) {
|
| if (overlap->coinPtTStart()->segment() == coinSeg) {
|
|
|