Index: src/pathops/SkOpSegment.cpp |
diff --git a/src/pathops/SkOpSegment.cpp b/src/pathops/SkOpSegment.cpp |
index 5ee775c3c6727c994a12d32b100e982389be6b3c..76032aaf0c6c2faf5d7f7c10028f253d60be0533 100644 |
--- a/src/pathops/SkOpSegment.cpp |
+++ b/src/pathops/SkOpSegment.cpp |
@@ -433,25 +433,6 @@ void SkOpSegment::calcAngles(SkChunkAlloc* allocator) { |
} |
} |
-void SkOpSegment::checkAngleCoin(SkOpCoincidence* coincidences, SkChunkAlloc* allocator) { |
- SkOpSpanBase* base = &fHead; |
- SkOpSpan* span; |
- do { |
- SkOpAngle* angle = base->fromAngle(); |
- if (angle && angle->fCheckCoincidence) { |
- angle->checkNearCoincidence(); |
- } |
- if (base->final()) { |
- break; |
- } |
- span = base->upCast(); |
- angle = span->toAngle(); |
- if (angle && angle->fCheckCoincidence) { |
- angle->checkNearCoincidence(); |
- } |
- } while ((base = span->next())); |
-} |
- |
bool SkOpSegment::collapsed() const { |
return fVerb == SkPath::kLine_Verb && fHead.pt() == fTail.pt(); |
} |
@@ -593,14 +574,14 @@ void SkOpSegment::detach(const SkOpSpan* span) { |
SkASSERT(fCount >= fDoneCount); |
} |
-double SkOpSegment::distSq(double t, SkOpAngle* oppAngle) { |
+double SkOpSegment::distSq(double t, const SkOpAngle* oppAngle) const { |
SkDPoint testPt = this->dPtAtT(t); |
SkDLine testPerp = {{ testPt, testPt }}; |
SkDVector slope = this->dSlopeAtT(t); |
testPerp[1].fX += slope.fY; |
testPerp[1].fY -= slope.fX; |
SkIntersections i; |
- SkOpSegment* oppSegment = oppAngle->segment(); |
+ const SkOpSegment* oppSegment = oppAngle->segment(); |
(*CurveIntersectRay[oppSegment->verb()])(oppSegment->pts(), oppSegment->weight(), testPerp, &i); |
double closestDistSq = SK_ScalarInfinity; |
for (int index = 0; index < i.used(); ++index) { |
@@ -1220,9 +1201,9 @@ bool SkOpSegment::missingCoincidence(SkOpCoincidence* coincidences, SkChunkAlloc |
continue; |
} |
SkOpSegment* opp = ptT->span()->segment(); |
- if (opp->verb() == SkPath::kLine_Verb) { |
- continue; |
- } |
+// if (opp->verb() == SkPath::kLine_Verb) { |
+// continue; |
+// } |
if (opp->done()) { |
continue; |
} |
@@ -1239,6 +1220,9 @@ bool SkOpSegment::missingCoincidence(SkOpCoincidence* coincidences, SkChunkAlloc |
if (span && span->containsCoincidence(opp)) { |
continue; |
} |
+ if (spanBase->segment() == opp) { |
+ continue; |
+ } |
if (spanBase->containsCoinEnd(opp)) { |
continue; |
} |
@@ -1264,6 +1248,9 @@ bool SkOpSegment::missingCoincidence(SkOpCoincidence* coincidences, SkChunkAlloc |
if (!priorOpp) { |
continue; |
} |
+ if (priorPtT == ptT) { |
+ continue; |
+ } |
SkOpPtT* oppStart = prior->ptT(); |
SkOpPtT* oppEnd = spanBase->ptT(); |
bool swapped = priorPtT->fT > ptT->fT; |
@@ -1272,11 +1259,19 @@ bool SkOpSegment::missingCoincidence(SkOpCoincidence* coincidences, SkChunkAlloc |
SkTSwap(oppStart, oppEnd); |
} |
bool flipped = oppStart->fT > oppEnd->fT; |
- bool coincident; |
+ bool coincident = false; |
if (coincidences->contains(priorPtT, ptT, oppStart, oppEnd, flipped)) { |
goto swapBack; |
} |
- coincident = testForCoincidence(priorPtT, ptT, prior, spanBase, opp, 5000); |
+ if (opp->verb() == SkPath::kLine_Verb) { |
+ coincident = (SkDPoint::ApproximatelyEqual(priorPtT->fPt, oppStart->fPt) || |
+ SkDPoint::ApproximatelyEqual(priorPtT->fPt, oppEnd->fPt)) && |
+ (SkDPoint::ApproximatelyEqual(ptT->fPt, oppStart->fPt) || |
+ SkDPoint::ApproximatelyEqual(ptT->fPt, oppEnd->fPt)); |
+ } |
+ if (!coincident) { |
+ coincident = testForCoincidence(priorPtT, ptT, prior, spanBase, opp, 5000); |
+ } |
if (coincident) { |
// mark coincidence |
if (!coincidences->extend(priorPtT, ptT, oppStart, oppEnd) |