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