aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pathops/SkOpAngle.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/pathops/SkOpAngle.h')
-rw-r--r--src/pathops/SkOpAngle.h100
1 files changed, 68 insertions, 32 deletions
diff --git a/src/pathops/SkOpAngle.h b/src/pathops/SkOpAngle.h
index 583f5ec8b3..87a858a2db 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