| Index: src/pathops/SkOpSegment.cpp
|
| diff --git a/src/pathops/SkOpSegment.cpp b/src/pathops/SkOpSegment.cpp
|
| index 8bd4cc275ad619492fd0cb891939aa2f33e2e463..5b2074995734ecccc454b77f6ecb9bb09fb486fa 100644
|
| --- a/src/pathops/SkOpSegment.cpp
|
| +++ b/src/pathops/SkOpSegment.cpp
|
| @@ -209,7 +209,7 @@ bool SkOpSegment::activeWinding(int index, int endIndex, int* maxWinding, int* s
|
| void SkOpSegment::addAngle(SkTArray<SkOpAngle, true>* anglesPtr, int start, int end) const {
|
| SkASSERT(start != end);
|
| SkOpAngle& angle = anglesPtr->push_back();
|
| -#if DEBUG_ANGLE
|
| +#if 0 && DEBUG_ANGLE // computed pt and actual pt may differ by more than approx eq
|
| SkTArray<SkOpAngle, true>& angles = *anglesPtr;
|
| if (angles.count() > 1) {
|
| const SkOpSegment* aSeg = angles[0].segment();
|
| @@ -1080,6 +1080,86 @@ bool SkOpSegment::bumpSpan(SkOpSpan* span, int windDelta, int oppDelta) {
|
| return false;
|
| }
|
|
|
| +// look to see if the curve end intersects an intermediary that intersects the other
|
| +void SkOpSegment::checkEnds() {
|
| +#if 1
|
| + return; // FIXME: suspect we will need the code below to make intersections consistent
|
| +#else
|
| + SkTDArray<SkOpSpan> missingSpans;
|
| + int count = fTs.count();
|
| + for (int index = 0; index < count; ++index) {
|
| + const SkOpSpan& span = fTs[index];
|
| + const SkOpSegment* other = span.fOther;
|
| + const SkOpSpan* otherSpan = &other->fTs[span.fOtherIndex];
|
| + double otherT = otherSpan->fT;
|
| + if (otherT != 0 && otherT != 1) {
|
| + continue;
|
| + }
|
| + int peekStart = span.fOtherIndex;
|
| + while (peekStart > 0) {
|
| + const SkOpSpan* peeker = &other->fTs[peekStart - 1];
|
| + if (peeker->fT != otherT) {
|
| + break;
|
| + }
|
| + --peekStart;
|
| + }
|
| + int otherLast = other->fTs.count() - 1;
|
| + int peekLast = span.fOtherIndex;
|
| + while (peekLast < otherLast) {
|
| + const SkOpSpan* peeker = &other->fTs[peekLast + 1];
|
| + if (peeker->fT != otherT) {
|
| + break;
|
| + }
|
| + ++peekLast;
|
| + }
|
| + if (peekStart == peekLast) {
|
| + continue;
|
| + }
|
| + double t = span.fT;
|
| + int tStart = index;
|
| + while (tStart > 0 && t == fTs[tStart - 1].fT) {
|
| + --tStart;
|
| + }
|
| + int tLast = index;
|
| + int last = count - 1;
|
| + while (tLast < last && t == fTs[tLast + 1].fT) {
|
| + ++tLast;
|
| + }
|
| + for (int peekIndex = peekStart; peekIndex <= peekLast; ++peekIndex) {
|
| + if (peekIndex == span.fOtherIndex) {
|
| + continue;
|
| + }
|
| + const SkOpSpan& peekSpan = other->fTs[peekIndex];
|
| + SkOpSegment* match = peekSpan.fOther;
|
| + const double matchT = peekSpan.fOtherT;
|
| + for (int tIndex = tStart; tIndex <= tLast; ++tIndex) {
|
| + const SkOpSpan& tSpan = fTs[tIndex];
|
| + if (tSpan.fOther == match && tSpan.fOtherT == matchT) {
|
| + goto nextPeeker;
|
| + }
|
| + }
|
| + // this segment is missing a entry that the other contains
|
| + // remember so we can add the missing one and recompute the indices
|
| + SkOpSpan* missing = missingSpans.append();
|
| + missing->fT = t;
|
| + missing->fOther = match;
|
| + missing->fOtherT = matchT;
|
| + missing->fPt = peekSpan.fPt;
|
| + }
|
| +nextPeeker:
|
| + ;
|
| + }
|
| + int missingCount = missingSpans.count();
|
| + for (int index = 0; index < missingCount; ++index) {
|
| + const SkOpSpan& missing = missingSpans[index];
|
| + addTPair(missing.fT, missing.fOther, missing.fOtherT, false, missing.fPt);
|
| + }
|
| + if (missingCount > 0) {
|
| + fixOtherTIndex();
|
| + }
|
| +#endif
|
| +}
|
| +
|
| bool SkOpSegment::equalPoints(int greaterTIndex, int lesserTIndex) {
|
| SkASSERT(greaterTIndex >= lesserTIndex);
|
| double greaterT = fTs[greaterTIndex].fT;
|
|
|