| 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(); | 
|  |