Index: src/pathops/SkOpSegment.h |
diff --git a/src/pathops/SkOpSegment.h b/src/pathops/SkOpSegment.h |
index bfaf4ed9de88d5ac46e5e5a7c0489da082e2a41e..acb114dfc7562281e09c95ee8403e1003b8f4915 100644 |
--- a/src/pathops/SkOpSegment.h |
+++ b/src/pathops/SkOpSegment.h |
@@ -19,8 +19,8 @@ class SkPathWriter; |
class SkOpSegment { |
public: |
SkOpSegment() { |
-#if DEBUG_DUMP |
- fID = ++gSegmentID; |
+#ifdef SK_DEBUG |
+ fID = ++SkPathOpsDebug::gSegmentID; |
#endif |
} |
@@ -59,6 +59,11 @@ public: |
return done(SkMin32(angle->start(), angle->end())); |
} |
+ // used only by partial coincidence detection |
+ SkDPoint dPtAtT(double mid) const { |
+ return (*CurveDPointAtT[SkPathOpsVerbToPoints(fVerb)])(fPts, mid); |
+ } |
+ |
SkVector dxdy(int index) const { |
return (*CurveSlopeAtT[SkPathOpsVerbToPoints(fVerb)])(fPts, fTs[index].fT); |
} |
@@ -234,28 +239,23 @@ public: |
bool activeAngle(int index, int* done, SkTArray<SkOpAngle, true>* angles); |
SkPoint activeLeftTop(bool onlySortable, int* firstT) const; |
bool activeOp(int index, int endIndex, int xorMiMask, int xorSuMask, SkPathOp op); |
- bool activeOp(int xorMiMask, int xorSuMask, int index, int endIndex, SkPathOp op, |
- int* sumMiWinding, int* sumSuWinding, int* maxWinding, int* sumWinding, |
- int* oppMaxWinding, int* oppSumWinding); |
bool activeWinding(int index, int endIndex); |
- bool activeWinding(int index, int endIndex, int* maxWinding, int* sumWinding); |
void addCubic(const SkPoint pts[4], bool operand, bool evenOdd); |
void addCurveTo(int start, int end, SkPathWriter* path, bool active) const; |
void addLine(const SkPoint pts[2], bool operand, bool evenOdd); |
void addOtherT(int index, double otherT, int otherIndex); |
void addQuad(const SkPoint pts[3], bool operand, bool evenOdd); |
int addSelfT(SkOpSegment* other, const SkPoint& pt, double newT); |
- int addT(SkOpSegment* other, const SkPoint& pt, double newT); |
- void addTCancel(double startT, double endT, SkOpSegment* other, double oStartT, double oEndT); |
- void addTCoincident(double startT, double endT, SkOpSegment* other, double oStartT, |
- double oEndT); |
+ int addT(SkOpSegment* other, const SkPoint& pt, double newT, bool isNear); |
+ void addTCancel(const SkPoint& startPt, const SkPoint& endPt, SkOpSegment* other); |
+ void addTCoincident(const SkPoint& startPt, const SkPoint& endPt, SkOpSegment* other); |
void addTPair(double t, SkOpSegment* other, double otherT, bool borrowWind, const SkPoint& pt); |
- void addTPair(double t, SkOpSegment* other, double otherT, bool borrowWind, const SkPoint& pt, |
- const SkPoint& oPt); |
- int addUnsortableT(SkOpSegment* other, bool start, const SkPoint& pt, double newT); |
bool betweenTs(int lesser, double testT, int greater) const; |
void checkEnds(); |
- int computeSum(int startIndex, int endIndex, bool binary); |
+ bool checkSmall(int index) const; |
+ void checkTiny(); |
+ int computeSum(int startIndex, int endIndex, SkOpAngle::IncludeType includeType, |
+ SkTArray<SkOpAngle, true>* angles, SkTArray<SkOpAngle*, true>* sorted); |
int crossedSpanY(const SkPoint& basePt, SkScalar* bestY, double* hitT, bool* hitSomething, |
double mid, bool opp, bool current) const; |
SkOpSegment* findNextOp(SkTDArray<SkOpSpan*>* chase, int* nextStart, int* nextEnd, |
@@ -264,17 +264,13 @@ public: |
SkOpSegment* findNextWinding(SkTDArray<SkOpSpan*>* chase, int* nextStart, int* nextEnd, |
bool* unsortable); |
SkOpSegment* findNextXor(int* nextStart, int* nextEnd, bool* unsortable); |
- void findTooCloseToCall(); |
SkOpSegment* findTop(int* tIndex, int* endIndex, bool* unsortable, bool onlySortable); |
void fixOtherTIndex(); |
void initWinding(int start, int end); |
void initWinding(int start, int end, double tHit, int winding, SkScalar hitDx, int oppWind, |
- SkScalar hitOppDx); |
- bool isLinear(int start, int end) const; |
+ SkScalar hitOppDx); |
bool isMissing(double startT) const; |
- bool isSimple(int end) const; |
bool isTiny(const SkOpAngle* angle) const; |
- bool isTiny(int index) const; |
SkOpSpan* markAndChaseDoneBinary(int index, int endIndex); |
SkOpSpan* markAndChaseDoneUnary(int index, int endIndex); |
SkOpSpan* markAndChaseWinding(const SkOpAngle* angle, int winding, int oppWinding); |
@@ -283,12 +279,7 @@ public: |
void markDone(int index, int winding); |
void markDoneBinary(int index); |
void markDoneUnary(int index); |
- SkOpSpan* markOneWinding(const char* funName, int tIndex, int winding); |
- SkOpSpan* markOneWinding(const char* funName, int tIndex, int winding, int oppWinding); |
- void markWinding(int index, int winding); |
- void markWinding(int index, int winding, int oppWinding); |
bool nextCandidate(int* start, int* end) const; |
- int nextExactSpan(int from, int step) const; |
int nextSpan(int from, int step) const; |
void setUpWindings(int index, int endIndex, int* sumMiWinding, int* sumSuWinding, |
int* maxWinding, int* sumWinding, int* oppMaxWinding, int* oppSumWinding); |
@@ -296,9 +287,11 @@ public: |
kMustBeOrdered_SortAngleKind, // required for winding calc |
kMayBeUnordered_SortAngleKind // ok for find top |
}; |
- static bool SortAngles(const SkTArray<SkOpAngle, true>& angles, |
- SkTArray<SkOpAngle*, true>* angleList, |
+ static bool SortAngles(const SkTArray<SkOpAngle, true>& angles, // FIXME: replace with |
+ SkTArray<SkOpAngle*, true>* angleList, // Sort Angles 2 |
SortAngleKind ); |
+ static bool SortAngles2(const SkTArray<SkOpAngle, true>& angles, |
+ SkTArray<SkOpAngle*, true>* angleList); |
bool subDivide(int start, int end, SkPoint edge[4]) const; |
bool subDivide(int start, int end, SkDCubic* result) const; |
void undoneSpan(int* start, int* end); |
@@ -307,9 +300,8 @@ public: |
static bool UseInnerWinding(int outerWinding, int innerWinding); |
int windingAtT(double tHit, int tIndex, bool crossOpp, SkScalar* dx) const; |
int windSum(const SkOpAngle* angle) const; |
- int windValue(const SkOpAngle* angle) const; |
-#if DEBUG_DUMP |
+#ifdef SK_DEBUG |
int debugID() const { |
return fID; |
} |
@@ -331,26 +323,61 @@ public: |
#endif |
private: |
+ struct MissingSpan { |
+ enum Command { |
+ kNoAction, |
+ kAddMissing, |
+ kRemoveNear, |
+ kZeroSpan, |
+ } fCommand; |
+ double fT; |
+ double fEndT; |
+ SkOpSegment* fSegment; |
+ SkOpSegment* fOther; |
+ double fOtherT; |
+ SkPoint fPt; |
+ }; |
+ |
bool activeAngleOther(int index, int* done, SkTArray<SkOpAngle, true>* angles); |
bool activeAngleInner(int index, int* done, SkTArray<SkOpAngle, true>* angles); |
+ bool activeOp(int xorMiMask, int xorSuMask, int index, int endIndex, SkPathOp op, |
+ int* sumMiWinding, int* sumSuWinding, int* maxWinding, int* sumWinding, |
+ int* oppMaxWinding, int* oppSumWinding); |
+ bool activeWinding(int index, int endIndex, int* maxWinding, int* sumWinding); |
void addAngle(SkTArray<SkOpAngle, true>* angles, int start, int end) const; |
- void addCancelOutsides(double tStart, double oStart, SkOpSegment* other, double oEnd); |
- void addCoinOutsides(const SkTArray<double, true>& outsideTs, SkOpSegment* other, double oEnd); |
+ void addCancelOutsides(const SkPoint& startPt, const SkPoint& endPt, SkOpSegment* other); |
+ void addCoinOutsides(const SkPoint& startPt, const SkPoint& endPt, SkOpSegment* other); |
+ void addTPair(double t, SkOpSegment* other, double otherT, bool borrowWind, const SkPoint& pt, |
+ const SkPoint& oPt); |
void addTwoAngles(int start, int end, SkTArray<SkOpAngle, true>* angles) const; |
- int advanceCoincidentOther(const SkOpSpan* test, double oEndT, int oIndex); |
- int advanceCoincidentThis(const SkOpSpan* oTest, bool opp, int index); |
- void buildAngles(int index, SkTArray<SkOpAngle, true>* angles, bool includeOpp) const; |
+ void adjustMissingNear(const SkPoint& startPt, const SkPoint& endPt, |
+ SkTArray<MissingSpan, true>* ); |
+ void adjustNear(double startT, const SkPoint& endPt, SkTArray<MissingSpan, true>* ); |
+ void adjustOtherNear(double startT, const SkPoint& startPt, const SkPoint& endPt, |
+ SkTArray<MissingSpan, true>* ); |
+ MissingSpan::Command adjustThisNear(double startT, const SkPoint& startPt, const SkPoint& endPt, |
+ SkTArray<MissingSpan, true>* ); |
+ int advanceCoincidentOther(double oEndT, int oIndex); |
+ int advanceCoincidentThis(int index); |
+ bool betweenPoints(double midT, const SkPoint& pt1, const SkPoint& pt2) const; |
+ bool buildAngles(int index, SkTArray<SkOpAngle, true>* angles, bool includeOpp) const; |
void buildAnglesInner(int index, SkTArray<SkOpAngle, true>* angles) const; |
- int bumpCoincidentThis(const SkOpSpan& oTest, bool opp, int index, |
- SkTArray<double, true>* outsideTs); |
- int bumpCoincidentOther(const SkOpSpan& test, double oEndT, int& oIndex, |
- SkTArray<double, true>* oOutsideTs); |
+ void bumpCoincidentThis(const SkOpSpan& oTest, bool binary, int* index, |
+ SkTArray<SkPoint, true>* outsideTs); |
+ bool bumpCoincident(SkOpSpan* test, bool bigger, bool binary); |
+ void bumpCoincidentOther(const SkOpSpan& oTest, int* index, |
+ SkTArray<SkPoint, true>* outsideTs); |
bool bumpSpan(SkOpSpan* span, int windDelta, int oppDelta); |
bool clockwise(int tStart, int tEnd) const; |
- void decrementSpan(SkOpSpan* span); |
- bool equalPoints(int greaterTIndex, int lesserTIndex); |
+ static void ComputeOneSum(const SkOpAngle* baseAngle, SkOpAngle* nextAngle, |
+ SkOpAngle::IncludeType ); |
+ static void ComputeOneSumReverse(const SkOpAngle* baseAngle, SkOpAngle* nextAngle, |
+ SkOpAngle::IncludeType ); |
+ bool decrementSpan(SkOpSpan* span); |
int findStartingEdge(const SkTArray<SkOpAngle*, true>& sorted, int start, int end); |
void init(const SkPoint pts[], SkPath::Verb verb, bool operand, bool evenOdd); |
+ bool isSimple(int end) const; |
+ bool isTiny(int index) const; |
void matchWindingValue(int tIndex, double t, bool borrowWind); |
SkOpSpan* markAndChaseDone(int index, int endIndex, int winding); |
SkOpSpan* markAndChaseDoneBinary(const SkOpAngle* angle, int winding, int oppWinding); |
@@ -363,19 +390,33 @@ private: |
void markOneDoneBinary(const char* funName, int tIndex); |
void markOneDoneBinary(const char* funName, int tIndex, int winding, int oppWinding); |
void markOneDoneUnary(const char* funName, int tIndex); |
+ SkOpSpan* markOneWinding(const char* funName, int tIndex, int winding); |
+ SkOpSpan* markOneWinding(const char* funName, int tIndex, int winding, int oppWinding); |
+ void markWinding(int index, int winding); |
+ void markWinding(int index, int winding, int oppWinding); |
void markUnsortable(int start, int end); |
bool monotonicInY(int tStart, int tEnd) const; |
+ double missingNear(double otherT, const SkOpSegment* other, const SkPoint& startPt, |
+ const SkPoint& endPt) const; |
bool multipleSpans(int end) const; |
SkOpSegment* nextChase(int* index, const int step, int* min, SkOpSpan** last); |
+ int nextExactSpan(int from, int step) const; |
bool serpentine(int tStart, int tEnd) const; |
+ void setUpWindings(int index, int endIndex, int* sumMiWinding, |
+ int* maxWinding, int* sumWinding); |
void subDivideBounds(int start, int end, SkPathOpsBounds* bounds) const; |
- static void TrackOutside(SkTArray<double, true>* outsideTs, double end, double start); |
+ static void TrackOutsidePair(SkTArray<SkPoint, true>* outsideTs, const SkPoint& endPt, |
+ const SkPoint& startPt); |
+ static void TrackOutside(SkTArray<SkPoint, true>* outsideTs, const SkPoint& startPt); |
int updateOppWinding(int index, int endIndex) const; |
int updateOppWinding(const SkOpAngle* angle) const; |
int updateWinding(int index, int endIndex) const; |
int updateWinding(const SkOpAngle* angle) const; |
+ int updateWindingReverse(int index, int endIndex) const; |
+ static bool UseInnerWindingReverse(int outerWinding, int innerWinding); |
SkOpSpan* verifyOneWinding(const char* funName, int tIndex); |
SkOpSpan* verifyOneWindingU(const char* funName, int tIndex); |
+ int windValue(const SkOpAngle* angle) const; |
int windValueAt(double t) const; |
void zeroSpan(SkOpSpan* span); |
@@ -395,6 +436,11 @@ private: |
} |
#endif |
void debugValidate() const; |
+#ifdef SK_DEBUG |
+ void dumpPts() const; |
+ void dumpDPts() const; |
+ void dumpSpans() const; |
+#endif |
const SkPoint* fPts; |
SkPathOpsBounds fBounds; |
@@ -407,7 +453,7 @@ private: |
bool fOperand; |
bool fXor; // set if original contour had even-odd fill |
bool fOppXor; // set if opposite operand had even-odd fill |
-#if DEBUG_DUMP |
+#ifdef SK_DEBUG |
int fID; |
#endif |
}; |