Index: src/pathops/SkOpAngle.h |
diff --git a/src/pathops/SkOpAngle.h b/src/pathops/SkOpAngle.h |
index 583f5ec8b39df3bbb47e8411b054d2209b796e17..87a858a2db89b631de4e4b1c01e4e7e09edfab2b 100644 |
--- a/src/pathops/SkOpAngle.h |
+++ b/src/pathops/SkOpAngle.h |
@@ -8,8 +8,6 @@ |
#define SkOpAngle_DEFINED |
#include "SkLineParameters.h" |
-#include "SkPath.h" |
-#include "SkPathOpsCubic.h" |
class SkOpSegment; |
struct SkOpSpan; |
@@ -26,28 +24,29 @@ public: |
kBinaryOpp, |
}; |
- bool operator<(const SkOpAngle& rh) const; |
- |
- bool calcSlop(double x, double y, double rx, double ry, bool* result) const; |
- |
- double dx() const { |
- return fTangentPart.dx(); |
+ int end() const { |
+ return fEnd; |
} |
- double dy() const { |
- return fTangentPart.dy(); |
- } |
+ const SkOpAngle* findFirst() const; |
- int end() const { |
- return fEnd; |
+ bool inLoop() const { |
+ return !!fNext; |
} |
+ void insert(SkOpAngle* ); |
bool isHorizontal() const; |
+ SkOpSpan* lastMarked() const; |
+ int loopCount() const; |
+ void markStops(); |
+ bool merge(SkOpAngle* ); |
- SkOpSpan* lastMarked() const { |
- return fLastMarked; |
+ SkOpAngle* next() const { |
+ return fNext; |
} |
+ SkOpAngle* previous() const; |
+ |
void set(const SkOpSegment* segment, int start, int end); |
void setLastMarked(SkOpSpan* marked) { |
@@ -62,6 +61,8 @@ public: |
return SkSign32(fStart - fEnd); |
} |
+ bool small() const; |
+ |
int start() const { |
return fStart; |
} |
@@ -70,43 +71,78 @@ public: |
return fUnorderable; |
} |
- bool unsortable() const { |
- return fUnsortable; |
- } |
- |
-#ifdef SK_DEBUG |
- void dump() const; |
+ // available to testing only |
+#if DEBUG_SORT |
+ void debugLoop() const; // called by code during run |
+#endif |
+#if DEBUG_ANGLE |
+ void debugSameAs(const SkOpAngle* compare) const; |
#endif |
+ void dump() const; |
+ void dumpFromTo(const SkOpSegment* fromSeg, int from, int to) const; |
#if DEBUG_ANGLE |
void setID(int id) { |
fID = id; |
} |
#endif |
+#if DEBUG_VALIDATE |
+ void debugValidateLoop() const; |
+#endif |
private: |
- bool lengthen(const SkOpAngle& ); |
+ bool after(const SkOpAngle* test) const; |
+ int allOnOneSide(const SkOpAngle& test) const; |
+ bool calcSlop(double x, double y, double rx, double ry, bool* result) const; |
+ bool checkCrossesZero() const; |
+ bool checkParallel(const SkOpAngle& ) const; |
+ bool computeSector(); |
+ int convexHullOverlaps(const SkOpAngle& ) const; |
+ double distEndRatio(double dist) const; |
+ int findSector(SkPath::Verb verb, double x, double y) const; |
+ bool endsIntersect(const SkOpAngle& ) const; |
+ double midT() const; |
+ bool oppositePlanes(const SkOpAngle& rh) const; |
+ bool orderable(const SkOpAngle& rh) const; // false == this < rh ; true == this > rh |
+ void setCurveHullSweep(); |
+ void setSector(); |
void setSpans(); |
+ bool tangentsDiverge(const SkOpAngle& rh, double s0xt0) const; |
SkDCubic fCurvePart; // the curve from start to end |
- SkDCubic fCurveHalf; // the curve from start to 1 or 0 |
double fSide; |
- double fSide2; |
- SkLineParameters fTangentPart; |
- SkLineParameters fTangentHalf; |
+ SkLineParameters fTangentHalf; // used only to sort a pair of lines or line-like sections |
const SkOpSegment* fSegment; |
+ SkOpAngle* fNext; |
SkOpSpan* fLastMarked; |
+ SkDVector fSweep[2]; |
int fStart; |
int fEnd; |
- bool fComputed; // tangent is computed, may contain some error |
- // if subdividing a quad or cubic causes the tangent to go from the maximum angle to the |
- // minimum, mark it unorderable. It still can be sorted, which is good enough for find-top |
- // but can't be ordered, and therefore can't be used to compute winding |
- bool fUnorderable; |
- mutable bool fUnsortable; // this alone is editable by the less than operator |
+ int fSectorMask; |
+ char fSectorStart; // in 32nds of a circle |
+ char fSectorEnd; |
+ bool fIsCurve; |
+ bool fStop; // set if ordered angle is greater than the previous |
+ mutable bool fUnorderable; // this is editable by orderable() |
+ bool fUnorderedSweep; // set when a cubic's first control point between the sweep vectors |
+ bool fComputeSector; |
+ bool fComputedSector; |
+ |
+#if DEBUG_SORT |
+ void debugOne(bool showFunc) const; // available to testing only |
+#endif |
#if DEBUG_ANGLE |
+ int debugID() const { return fID; } |
int fID; |
#endif |
+#if DEBUG_VALIDATE |
+ void debugValidateNext() const; // in debug builds, verify that angle loop is uncorrupted |
+#else |
+ void debugValidateNext() const {} |
+#endif |
+ void dumpLoop() const; // utility to be called by user from debugger |
+ void dumpPartials() const; // utility to be called by user from debugger |
+ friend class PathOpsAngleTester; |
}; |
#endif |