| Index: src/pathops/SkOpContour.h
|
| diff --git a/src/pathops/SkOpContour.h b/src/pathops/SkOpContour.h
|
| index 456e6c0068bc2c7e1ffec342fa680c5b3337c6ef..a5635fe3d2b59b083dcb5801df931fa71de103ac 100644
|
| --- a/src/pathops/SkOpContour.h
|
| +++ b/src/pathops/SkOpContour.h
|
| @@ -15,7 +15,7 @@ class SkOpContour;
|
| class SkPathWriter;
|
|
|
| struct SkCoincidence {
|
| - SkOpContour* fContours[2];
|
| + SkOpContour* fOther;
|
| int fSegments[2];
|
| double fTs[2][2];
|
| SkPoint fPts[2];
|
| @@ -25,8 +25,8 @@ class SkOpContour {
|
| public:
|
| SkOpContour() {
|
| reset();
|
| -#if DEBUG_DUMP
|
| - fID = ++gContourID;
|
| +#ifdef SK_DEBUG
|
| + fID = ++SkPathOpsDebug::gContourID;
|
| #endif
|
| }
|
|
|
| @@ -63,15 +63,19 @@ public:
|
| fSegments[segIndex].addOtherT(tIndex, otherT, otherIndex);
|
| }
|
|
|
| + void addPartialCoincident(int index, SkOpContour* other, int otherIndex,
|
| + const SkIntersections& ts, int ptIndex, bool swap);
|
| +
|
| int addQuad(const SkPoint pts[3]) {
|
| fSegments.push_back().addQuad(pts, fOperand, fXor);
|
| fContainsCurves = true;
|
| return fSegments.count();
|
| }
|
|
|
| - int addT(int segIndex, SkOpContour* other, int otherIndex, const SkPoint& pt, double newT) {
|
| + int addT(int segIndex, SkOpContour* other, int otherIndex, const SkPoint& pt, double newT,
|
| + bool isNear) {
|
| setContainsIntercepts();
|
| - return fSegments[segIndex].addT(&other->fSegments[otherIndex], pt, newT);
|
| + return fSegments[segIndex].addT(&other->fSegments[otherIndex], pt, newT, isNear);
|
| }
|
|
|
| int addSelfT(int segIndex, SkOpContour* other, int otherIndex, const SkPoint& pt, double newT) {
|
| @@ -79,16 +83,12 @@ public:
|
| return fSegments[segIndex].addSelfT(&other->fSegments[otherIndex], pt, newT);
|
| }
|
|
|
| - int addUnsortableT(int segIndex, SkOpContour* other, int otherIndex, bool start,
|
| - const SkPoint& pt, double newT) {
|
| - return fSegments[segIndex].addUnsortableT(&other->fSegments[otherIndex], start, pt, newT);
|
| - }
|
| -
|
| const SkPathOpsBounds& bounds() const {
|
| return fBounds;
|
| }
|
|
|
| void calcCoincidentWinding();
|
| + void calcPartialCoincidentWinding();
|
|
|
| void checkEnds() {
|
| if (!fContainsCurves) {
|
| @@ -100,7 +100,18 @@ public:
|
| if (segment->verb() == SkPath::kLine_Verb) {
|
| continue;
|
| }
|
| - fSegments[sIndex].checkEnds();
|
| + segment->checkEnds();
|
| + }
|
| + }
|
| +
|
| + // if same point has different T values, choose a common T
|
| + void checkTiny() {
|
| + int segmentCount = fSegments.count();
|
| + if (segmentCount <= 2) {
|
| + return;
|
| + }
|
| + for (int sIndex = 0; sIndex < segmentCount; ++sIndex) {
|
| + fSegments[sIndex].checkTiny();
|
| }
|
| }
|
|
|
| @@ -131,13 +142,6 @@ public:
|
| return segment.pts()[SkPathOpsVerbToPoints(segment.verb())];
|
| }
|
|
|
| - void findTooCloseToCall() {
|
| - int segmentCount = fSegments.count();
|
| - for (int sIndex = 0; sIndex < segmentCount; ++sIndex) {
|
| - fSegments[sIndex].findTooCloseToCall();
|
| - }
|
| - }
|
| -
|
| void fixOtherTIndex() {
|
| int segmentCount = fSegments.count();
|
| for (int sIndex = 0; sIndex < segmentCount; ++sIndex) {
|
| @@ -232,12 +236,14 @@ public:
|
| #endif
|
|
|
| private:
|
| + void calcCommonCoincidentWinding(const SkCoincidence& coincidence);
|
| void setBounds();
|
|
|
| SkTArray<SkOpSegment> fSegments;
|
| SkTArray<SkOpSegment*, true> fSortedSegments;
|
| int fFirstSorted;
|
| SkTArray<SkCoincidence, true> fCoincidences;
|
| + SkTArray<SkCoincidence, true> fPartialCoincidences;
|
| SkTArray<const SkOpContour*, true> fCrosses;
|
| SkPathOpsBounds fBounds;
|
| bool fContainsIntercepts; // FIXME: is this used by anybody?
|
| @@ -247,7 +253,7 @@ private:
|
| bool fOperand; // true for the second argument to a binary operator
|
| bool fXor;
|
| bool fOppXor;
|
| -#if DEBUG_DUMP
|
| +#ifdef SK_DEBUG
|
| int fID;
|
| #endif
|
| };
|
|
|