Index: src/pathops/SkPathOpsTSect.h |
diff --git a/src/pathops/SkPathOpsTSect.h b/src/pathops/SkPathOpsTSect.h |
index 48aa540945ddffc3d9950480800985b61d694923..9032af83eb6ef71c060fec16db4babf41fea4ddd 100644 |
--- a/src/pathops/SkPathOpsTSect.h |
+++ b/src/pathops/SkPathOpsTSect.h |
@@ -250,7 +250,7 @@ private: |
SkTSpan<TCurve, OppCurve>* addFollowing(SkTSpan<TCurve, OppCurve>* prior); |
void addForPerp(SkTSpan<OppCurve, TCurve>* span, double t); |
SkTSpan<TCurve, OppCurve>* addOne(); |
- |
+ |
SkTSpan<TCurve, OppCurve>* addSplitAt(SkTSpan<TCurve, OppCurve>* span, double t) { |
SkTSpan<TCurve, OppCurve>* result = this->addOne(); |
result->splitAt(span, t, &fHeap); |
@@ -343,7 +343,7 @@ void SkTCoincident<TCurve, OppCurve>::setPerp(const TCurve& c1, double t, |
if (used == 0 || used == 3) { |
this->init(); |
return; |
- } |
+ } |
fPerpT = i[0][0]; |
fPerpPt = i.pt(0); |
SkASSERT(used <= 2); |
@@ -858,7 +858,7 @@ SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::addOne() { |
result->reset(); |
result->fHasPerp = false; |
result->fDeleted = false; |
- ++fActiveCount; |
+ ++fActiveCount; |
PATH_OPS_DEBUG_T_SECT_CODE(result->fID = fDebugCount++ * 2 + fID); |
SkDEBUGCODE(result->fDebugSect = this); |
#ifdef SK_DEBUG |
@@ -969,6 +969,9 @@ void SkTSect<TCurve, OppCurve>::coincidentCheck(SkTSect<OppCurve, TCurve>* sect2 |
do { |
coinStart = this->extractCoincident(sect2, coinStart, last); |
} while (coinStart && !last->fDeleted); |
+ if (!fHead || !sect2->fHead) { |
+ break; |
+ } |
} while ((first = next)); |
} |
@@ -1208,7 +1211,7 @@ SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::extractCoincident( |
} |
this->validate(); |
sect2->validate(); |
- return last && !last->fDeleted ? last : nullptr; |
+ return last && !last->fDeleted && fHead && sect2->fHead ? last : nullptr; |
} |
template<typename TCurve, typename OppCurve> |
@@ -1511,7 +1514,7 @@ template<typename TCurve, typename OppCurve> |
void SkTSect<TCurve, OppCurve>::matchedDirCheck(double t, const SkTSect<OppCurve, TCurve>* sect2, |
double t2, bool* calcMatched, bool* oppMatched) const { |
if (*calcMatched) { |
- SkASSERT(*oppMatched == this->matchedDirection(t, sect2, t2)); |
+ SkASSERT(*oppMatched == this->matchedDirection(t, sect2, t2)); |
} else { |
*oppMatched = this->matchedDirection(t, sect2, t2); |
*calcMatched = true; |
@@ -1584,7 +1587,7 @@ SkTSpan<TCurve, OppCurve>* SkTSect<TCurve, OppCurve>::prev( |
test = test->fNext; |
SkASSERT(test); |
} |
- return result; |
+ return result; |
} |
template<typename TCurve, typename OppCurve> |
@@ -1939,7 +1942,7 @@ struct SkClosestRecord { |
fC1Index = mate.fC1Index; |
fC2Index = mate.fC2Index; |
} |
- |
+ |
void reset() { |
fClosest = FLT_MAX; |
SkDEBUGCODE(fC1Span = nullptr); |
@@ -2099,7 +2102,7 @@ void SkTSect<TCurve, OppCurve>::BinarySearch(SkTSect<TCurve, OppCurve>* sect1, |
gets stuck in a loop. It adds an extension to allow a coincident end |
perpendicular to track its intersection in the opposite curve. However, |
the bounding box of the extension does not intersect the original curve, |
- so the extension is discarded, only to be added again the next time around. */ |
+ so the extension is discarded, only to be added again the next time around. */ |
sect1->coincidentForce(sect2, start1s, start1e); |
sect1->validate(); |
sect2->validate(); |