| Index: src/pathops/SkPathOpsTSect.h
|
| diff --git a/src/pathops/SkPathOpsTSect.h b/src/pathops/SkPathOpsTSect.h
|
| index f22322bbe16248ec44aa4454f98e260ea7a5e9a4..51ea44a26c273302a622f3e6398563df50f75ab5 100644
|
| --- a/src/pathops/SkPathOpsTSect.h
|
| +++ b/src/pathops/SkPathOpsTSect.h
|
| @@ -137,7 +137,7 @@ public:
|
|
|
| int hullsIntersect(SkTSpan<OppCurve, TCurve>* span, bool* start, bool* oppStart);
|
| void init(const TCurve& );
|
| - void initBounds(const TCurve& );
|
| + bool initBounds(const TCurve& );
|
|
|
| bool isBounded() const {
|
| return fBounded != nullptr;
|
| @@ -317,7 +317,7 @@ private:
|
| void removeSpans(SkTSpan<TCurve, OppCurve>* span, SkTSect<OppCurve, TCurve>* opp);
|
| SkTSpan<TCurve, OppCurve>* spanAtT(double t, SkTSpan<TCurve, OppCurve>** priorSpan);
|
| SkTSpan<TCurve, OppCurve>* tail();
|
| - void trim(SkTSpan<TCurve, OppCurve>* span, SkTSect<OppCurve, TCurve>* opp);
|
| + bool trim(SkTSpan<TCurve, OppCurve>* span, SkTSect<OppCurve, TCurve>* opp);
|
| void unlinkSpan(SkTSpan<TCurve, OppCurve>* span);
|
| bool updateBounded(SkTSpan<TCurve, OppCurve>* first, SkTSpan<TCurve, OppCurve>* last,
|
| SkTSpan<OppCurve, TCurve>* oppFirst);
|
| @@ -351,7 +351,7 @@ void SkTCoincident<TCurve, OppCurve>::setPerp(const TCurve& c1, double t,
|
| const SkDPoint& cPt, const OppCurve& c2) {
|
| SkDVector dxdy = c1.dxdyAtT(t);
|
| SkDLine perp = {{ cPt, {cPt.fX + dxdy.fY, cPt.fY - dxdy.fX} }};
|
| - SkIntersections i;
|
| + SkIntersections i SkDEBUGCODE((c1.globalState()));
|
| int used = i.intersectRay(c2, perp);
|
| // only keep closest
|
| if (used == 0 || used == 3) {
|
| @@ -565,7 +565,7 @@ void SkTSpan<TCurve, OppCurve>::init(const TCurve& c) {
|
| }
|
|
|
| template<typename TCurve, typename OppCurve>
|
| -void SkTSpan<TCurve, OppCurve>::initBounds(const TCurve& c) {
|
| +bool SkTSpan<TCurve, OppCurve>::initBounds(const TCurve& c) {
|
| fPart = c.subDivide(fStartT, fEndT);
|
| fBounds.setBounds(fPart);
|
| fCoinStart.init();
|
| @@ -579,6 +579,7 @@ void SkTSpan<TCurve, OppCurve>::initBounds(const TCurve& c) {
|
| SkDebugf(""); // for convenient breakpoints
|
| }
|
| #endif
|
| + return fBounds.valid();
|
| }
|
|
|
| template<typename TCurve, typename OppCurve>
|
| @@ -1206,6 +1207,7 @@ bool SkTSect<TCurve, OppCurve>::extractCoincident(
|
| }
|
| } else {
|
| SkDEBUGCODE(coinStart = first->fStartT);
|
| + FAIL_IF(!oppFirst);
|
| SkDEBUGCODE(oppStartT = oppMatched ? oppFirst->fStartT : oppFirst->fEndT);
|
| }
|
| // FIXME: incomplete : if we're not at the end, find end of coin
|
| @@ -1286,7 +1288,7 @@ SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::findCoincidentRun(
|
| work->validatePerpT(work->fCoinStart.perpT());
|
| work->validatePerpPt(work->fCoinStart.perpT(), work->fCoinStart.perpPt());
|
| #endif
|
| - SkASSERT(work->hasOppT(work->fCoinStart.perpT()));
|
| + SkOPASSERT(work->hasOppT(work->fCoinStart.perpT()));
|
| if (!work->fCoinEnd.isMatch()) {
|
| break;
|
| }
|
| @@ -1400,7 +1402,8 @@ template<typename TCurve, typename OppCurve>
|
| int SkTSect<TCurve, OppCurve>::linesIntersect(SkTSpan<TCurve, OppCurve>* span,
|
| SkTSect<OppCurve, TCurve>* opp,
|
| SkTSpan<OppCurve, TCurve>* oppSpan, SkIntersections* i) {
|
| - SkIntersections thisRayI, oppRayI;
|
| + SkIntersections thisRayI SkDEBUGCODE((span->fDebugGlobalState));
|
| + SkIntersections oppRayI SkDEBUGCODE((span->fDebugGlobalState));
|
| SkDLine thisLine = {{ span->fPart[0], span->fPart[TCurve::kPointLast] }};
|
| SkDLine oppLine = {{ oppSpan->fPart[0], oppSpan->fPart[OppCurve::kPointLast] }};
|
| int loopCount = 0;
|
| @@ -1810,9 +1813,9 @@ SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::tail() {
|
| /* Each span has a range of opposite spans it intersects. After the span is split in two,
|
| adjust the range to its new size */
|
| template<typename TCurve, typename OppCurve>
|
| -void SkTSect<TCurve, OppCurve>::trim(SkTSpan<TCurve, OppCurve>* span,
|
| +bool SkTSect<TCurve, OppCurve>::trim(SkTSpan<TCurve, OppCurve>* span,
|
| SkTSect<OppCurve, TCurve>* opp) {
|
| - span->initBounds(fCurve);
|
| + FAIL_IF(!span->initBounds(fCurve));
|
| const SkTSpanBounded<OppCurve, TCurve>* testBounded = span->fBounded;
|
| while (testBounded) {
|
| SkTSpan<OppCurve, TCurve>* test = testBounded->fBounded;
|
| @@ -1826,7 +1829,7 @@ void SkTSect<TCurve, OppCurve>::trim(SkTSpan<TCurve, OppCurve>* span,
|
| if (sects == 2) {
|
| span->initBounds(fCurve);
|
| this->removeAllBut(test, span, opp);
|
| - return;
|
| + return true;
|
| }
|
| } else {
|
| if (span->removeBounded(test)) {
|
| @@ -1838,6 +1841,7 @@ void SkTSect<TCurve, OppCurve>::trim(SkTSpan<TCurve, OppCurve>* span,
|
| }
|
| testBounded = next;
|
| }
|
| + return true;
|
| }
|
|
|
| template<typename TCurve, typename OppCurve>
|
| @@ -2112,7 +2116,7 @@ void SkTSect<TCurve, OppCurve>::BinarySearch(SkTSect<TCurve, OppCurve>* sect1,
|
| SkDEBUGCODE(sect1->fOppSect = sect2);
|
| SkDEBUGCODE(sect2->fOppSect = sect1);
|
| intersections->reset();
|
| - intersections->setMax(TCurve::kMaxIntersections + 3); // give extra for slop
|
| + intersections->setMax(TCurve::kMaxIntersections + 4); // give extra for slop
|
| SkTSpan<TCurve, OppCurve>* span1 = sect1->fHead;
|
| SkTSpan<OppCurve, TCurve>* span2 = sect2->fHead;
|
| int oppSect, sect = sect1->intersects(span1, sect2, span2, &oppSect);
|
| @@ -2151,8 +2155,14 @@ void SkTSect<TCurve, OppCurve>::BinarySearch(SkTSect<TCurve, OppCurve>* sect1,
|
| if (!half1->split(largest1, §1->fHeap)) {
|
| break;
|
| }
|
| - sect1->trim(largest1, sect2);
|
| - sect1->trim(half1, sect2);
|
| + if (!sect1->trim(largest1, sect2)) {
|
| + SkOPOBJASSERT(intersections, 0);
|
| + return;
|
| + }
|
| + if (!sect1->trim(half1, sect2)) {
|
| + SkOPOBJASSERT(intersections, 0);
|
| + return;
|
| + }
|
| } else {
|
| if (largest2->fCollapsed) {
|
| break;
|
| @@ -2163,8 +2173,14 @@ void SkTSect<TCurve, OppCurve>::BinarySearch(SkTSect<TCurve, OppCurve>* sect1,
|
| if (!half2->split(largest2, §2->fHeap)) {
|
| break;
|
| }
|
| - sect2->trim(largest2, sect1);
|
| - sect2->trim(half2, sect1);
|
| + if (!sect2->trim(largest2, sect1)) {
|
| + SkOPOBJASSERT(intersections, 0);
|
| + return;
|
| + }
|
| + if (!sect2->trim(half2, sect1)) {
|
| + SkOPOBJASSERT(intersections, 0);
|
| + return;
|
| + }
|
| }
|
| sect1->validate();
|
| sect2->validate();
|
| @@ -2250,28 +2266,28 @@ void SkTSect<TCurve, OppCurve>::BinarySearch(SkTSect<TCurve, OppCurve>* sect1,
|
| // if the final iteration contains an end (0 or 1),
|
| if (sect1->fRemovedStartT && !(zeroOneSet & kZeroS1Set)) {
|
| SkTCoincident<TCurve, OppCurve> perp; // intersect perpendicular with opposite curve
|
| - perp.setPerp(sect1->fCurve, 0, sect1->fCurve.fPts[0], sect2->fCurve);
|
| + perp.setPerp(sect1->fCurve, 0, sect1->fCurve[0], sect2->fCurve);
|
| if (perp.isMatch()) {
|
| intersections->insert(0, perp.perpT(), perp.perpPt());
|
| }
|
| }
|
| if (sect1->fRemovedEndT && !(zeroOneSet & kOneS1Set)) {
|
| SkTCoincident<TCurve, OppCurve> perp;
|
| - perp.setPerp(sect1->fCurve, 1, sect1->fCurve.fPts[TCurve::kPointLast], sect2->fCurve);
|
| + perp.setPerp(sect1->fCurve, 1, sect1->fCurve[TCurve::kPointLast], sect2->fCurve);
|
| if (perp.isMatch()) {
|
| intersections->insert(1, perp.perpT(), perp.perpPt());
|
| }
|
| }
|
| if (sect2->fRemovedStartT && !(zeroOneSet & kZeroS2Set)) {
|
| SkTCoincident<OppCurve, TCurve> perp;
|
| - perp.setPerp(sect2->fCurve, 0, sect2->fCurve.fPts[0], sect1->fCurve);
|
| + perp.setPerp(sect2->fCurve, 0, sect2->fCurve[0], sect1->fCurve);
|
| if (perp.isMatch()) {
|
| intersections->insert(perp.perpT(), 0, perp.perpPt());
|
| }
|
| }
|
| if (sect2->fRemovedEndT && !(zeroOneSet & kOneS2Set)) {
|
| SkTCoincident<OppCurve, TCurve> perp;
|
| - perp.setPerp(sect2->fCurve, 1, sect2->fCurve.fPts[OppCurve::kPointLast], sect1->fCurve);
|
| + perp.setPerp(sect2->fCurve, 1, sect2->fCurve[OppCurve::kPointLast], sect1->fCurve);
|
| if (perp.isMatch()) {
|
| intersections->insert(perp.perpT(), 1, perp.perpPt());
|
| }
|
| @@ -2365,7 +2381,7 @@ void SkTSect<TCurve, OppCurve>::BinarySearch(SkTSect<TCurve, OppCurve>* sect1,
|
| }
|
| intersections->setCoincident(index);
|
| }
|
| - SkASSERT(intersections->used() <= TCurve::kMaxIntersections);
|
| + SkOPOBJASSERT(intersections, intersections->used() <= TCurve::kMaxIntersections);
|
| }
|
|
|
| #endif
|
|
|