| Index: src/pathops/SkPathOpsTSect.h
|
| diff --git a/src/pathops/SkPathOpsTSect.h b/src/pathops/SkPathOpsTSect.h
|
| index 51ea44a26c273302a622f3e6398563df50f75ab5..fbfb8c138fcd9e8cf47bac075b5b3a458fc06178 100644
|
| --- a/src/pathops/SkPathOpsTSect.h
|
| +++ b/src/pathops/SkPathOpsTSect.h
|
| @@ -315,6 +315,12 @@ private:
|
| bool removeSpan(SkTSpan<TCurve, OppCurve>* span);
|
| void removeSpanRange(SkTSpan<TCurve, OppCurve>* first, SkTSpan<TCurve, OppCurve>* last);
|
| void removeSpans(SkTSpan<TCurve, OppCurve>* span, SkTSect<OppCurve, TCurve>* opp);
|
| + void removedEndCheck(SkTSpan<TCurve, OppCurve>* span);
|
| +
|
| + void resetRemovedEnds() {
|
| + fRemovedStartT = fRemovedEndT = false;
|
| + }
|
| +
|
| SkTSpan<TCurve, OppCurve>* spanAtT(double t, SkTSpan<TCurve, OppCurve>** priorSpan);
|
| SkTSpan<TCurve, OppCurve>* tail();
|
| bool trim(SkTSpan<TCurve, OppCurve>* span, SkTSect<OppCurve, TCurve>* opp);
|
| @@ -865,7 +871,8 @@ SkTSect<TCurve, OppCurve>::SkTSect(const TCurve& c
|
| PATH_OPS_DEBUG_T_SECT_PARAMS(fDebugCount(0))
|
| PATH_OPS_DEBUG_T_SECT_PARAMS(fDebugAllocatedCount(0))
|
| {
|
| - fHead = addOne();
|
| + this->resetRemovedEnds();
|
| + fHead = this->addOne();
|
| SkDEBUGCODE(fHead->debugSetGlobalState(debugGlobalState));
|
| fHead->init(c);
|
| }
|
| @@ -1360,7 +1367,9 @@ int SkTSect<TCurve, OppCurve>::intersects(SkTSpan<TCurve, OppCurve>* span,
|
| if (!sects) {
|
| return -1;
|
| }
|
| + this->removedEndCheck(span);
|
| span->fStartT = span->fEndT = i[0][0];
|
| + opp->removedEndCheck(oppSpan);
|
| oppSpan->fStartT = oppSpan->fEndT = i[1][0];
|
| return *oppResult = 2;
|
| }
|
| @@ -1735,13 +1744,18 @@ void SkTSect<TCurve, OppCurve>::removeCoincident(SkTSpan<TCurve, OppCurve>* span
|
| }
|
|
|
| template<typename TCurve, typename OppCurve>
|
| -bool SkTSect<TCurve, OppCurve>::removeSpan(SkTSpan<TCurve, OppCurve>* span) {
|
| +void SkTSect<TCurve, OppCurve>::removedEndCheck(SkTSpan<TCurve, OppCurve>* span) {
|
| if (!span->fStartT) {
|
| fRemovedStartT = true;
|
| }
|
| if (1 == span->fEndT) {
|
| fRemovedEndT = true;
|
| }
|
| +}
|
| +
|
| +template<typename TCurve, typename OppCurve>
|
| +bool SkTSect<TCurve, OppCurve>::removeSpan(SkTSpan<TCurve, OppCurve>* span) {\
|
| + this->removedEndCheck(span);
|
| this->unlinkSpan(span);
|
| return this->markSpanGone(span);
|
| }
|
| @@ -2141,14 +2155,14 @@ void SkTSect<TCurve, OppCurve>::BinarySearch(SkTSect<TCurve, OppCurve>* sect1,
|
| break;
|
| }
|
| SkTSpan<OppCurve, TCurve>* largest2 = sect2->boundsMax();
|
| - sect1->fRemovedStartT = sect1->fRemovedEndT = false;
|
| - sect2->fRemovedStartT = sect2->fRemovedEndT = false;
|
| // split it
|
| if (!largest2 || (largest1 && (largest1->fBoundsMax > largest2->fBoundsMax
|
| || (!largest1->fCollapsed && largest2->fCollapsed)))) {
|
| if (largest1->fCollapsed) {
|
| break;
|
| }
|
| + sect1->resetRemovedEnds();
|
| + sect2->resetRemovedEnds();
|
| // trim parts that don't intersect the opposite
|
| SkTSpan<TCurve, OppCurve>* half1 = sect1->addOne();
|
| SkDEBUGCODE(half1->debugSetGlobalState(sect1->globalState()));
|
| @@ -2167,6 +2181,8 @@ void SkTSect<TCurve, OppCurve>::BinarySearch(SkTSect<TCurve, OppCurve>* sect1,
|
| if (largest2->fCollapsed) {
|
| break;
|
| }
|
| + sect1->resetRemovedEnds();
|
| + sect2->resetRemovedEnds();
|
| // trim parts that don't intersect the opposite
|
| SkTSpan<OppCurve, TCurve>* half2 = sect2->addOne();
|
| SkDEBUGCODE(half2->debugSetGlobalState(sect2->globalState()));
|
| @@ -2262,7 +2278,7 @@ void SkTSect<TCurve, OppCurve>::BinarySearch(SkTSect<TCurve, OppCurve>* sect1,
|
| } while ((coincident = coincident->fNext));
|
| }
|
| int zeroOneSet = EndsEqual(sect1, sect2, intersections);
|
| - if (!sect1->fHead || !sect2->fHead) {
|
| +// if (!sect1->fHead || !sect2->fHead) {
|
| // if the final iteration contains an end (0 or 1),
|
| if (sect1->fRemovedStartT && !(zeroOneSet & kZeroS1Set)) {
|
| SkTCoincident<TCurve, OppCurve> perp; // intersect perpendicular with opposite curve
|
| @@ -2292,6 +2308,8 @@ void SkTSect<TCurve, OppCurve>::BinarySearch(SkTSect<TCurve, OppCurve>* sect1,
|
| intersections->insert(perp.perpT(), 1, perp.perpPt());
|
| }
|
| }
|
| +// }
|
| + if (!sect1->fHead || !sect2->fHead) {
|
| return;
|
| }
|
| sect1->recoverCollapsed();
|
|
|