aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pathops/SkOpAngle.h
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-03-24 13:55:33 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-03-24 13:55:33 -0700
commit0dc4dd6dda9a7912f696b46d9c02155ec1d1ba5f (patch)
tree994c85a8e418986415175ddccc71adf924df3846 /src/pathops/SkOpAngle.h
parent82dec0e16ae10026194ce45b67af931700510450 (diff)
Revert of pathops version two (patchset #16 id:150001 of https://codereview.chromium.org/1002693002/)
Reason for revert: ASAN investigation Original issue's description: > pathops version two > > R=reed@google.com > > marked 'no commit' to attempt to get trybots to run > > TBR=reed@google.com > > Committed: https://skia.googlesource.com/skia/+/ccec0f958ffc71a9986d236bc2eb335cb2111119 TBR=caryclark@google.com NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true Review URL: https://codereview.chromium.org/1029993002
Diffstat (limited to 'src/pathops/SkOpAngle.h')
-rw-r--r--src/pathops/SkOpAngle.h179
1 files changed, 102 insertions, 77 deletions
diff --git a/src/pathops/SkOpAngle.h b/src/pathops/SkOpAngle.h
index 84b37010c9..1dc4250613 100644
--- a/src/pathops/SkOpAngle.h
+++ b/src/pathops/SkOpAngle.h
@@ -7,18 +7,17 @@
#ifndef SkOpAngle_DEFINED
#define SkOpAngle_DEFINED
+#include "SkChunkAlloc.h"
#include "SkLineParameters.h"
-#if DEBUG_ANGLE
-#include "SkString.h"
-#endif
-class SkOpContour;
-class SkOpPtT;
class SkOpSegment;
-class SkOpSpanBase;
-class SkOpSpan;
+struct SkOpSpan;
-struct SkOpAngle {
+// sorting angles
+// given angles of {dx dy ddx ddy dddx dddy} sort them
+class SkOpAngle {
+public:
+ enum { kStackBasedCount = 8 }; // FIXME: determine what this should be
enum IncludeType {
kUnaryWinding,
kUnaryXor,
@@ -26,66 +25,29 @@ struct SkOpAngle {
kBinaryOpp,
};
- bool after(SkOpAngle* test);
- int allOnOneSide(const SkOpAngle* test);
- bool checkCrossesZero() const;
- void checkNearCoincidence();
- bool checkParallel(SkOpAngle* );
- bool computeSector();
- int convexHullOverlaps(const SkOpAngle* ) const;
-
- const SkOpAngle* debugAngle(int id) const;
- SkOpContour* debugContour(int id);
- int debugID() const {
- return PATH_OPS_DEBUG_RELEASE(fID, -1);
+ int end() const {
+ return fEnd;
}
-#if DEBUG_SORT
- void debugLoop() const;
-#endif
+ const SkOpAngle* findFirst() const;
-#if DEBUG_ANGLE
- SkString debugPart() const;
-#endif
- const SkOpPtT* debugPtT(int id) const;
- const SkOpSegment* debugSegment(int id) const;
- const SkOpSpanBase* debugSpan(int id) const;
- void debugValidate() const;
- void debugValidateNext() const; // in debug builds, verify that angle loop is uncorrupted
- double distEndRatio(double dist) const;
- // available to testing only
- void dump() const;
- void dumpCurves() const;
- void dumpLoop() const;
- void dumpOne(bool functionHeader) const;
- void dumpTo(const SkOpSegment* fromSeg, const SkOpAngle* ) const;
- void dumpTest() const;
-
- SkOpSpanBase* end() const {
- return fEnd;
+ bool inLoop() const {
+ return !!fNext;
}
- bool endsIntersect(SkOpAngle* );
- bool endToSide(const SkOpAngle* rh, bool* inside) const;
- SkOpAngle* findFirst();
- int findSector(SkPath::Verb verb, double x, double y) const;
- SkOpGlobalState* globalState() const;
void insert(SkOpAngle* );
- SkOpSpanBase* lastMarked() const;
- bool loopContains(const SkOpAngle* ) const;
+ bool isHorizontal() const;
+ SkOpSpan* lastMarked() const;
+ bool loopContains(const SkOpAngle& ) const;
int loopCount() const;
void markStops();
bool merge(SkOpAngle* );
- double midT() const;
- bool midToSide(const SkOpAngle* rh, bool* inside) const;
SkOpAngle* next() const {
return fNext;
}
- bool oppositePlanes(const SkOpAngle* rh) const;
- bool orderable(SkOpAngle* rh); // false == this < rh ; true == this > rh
SkOpAngle* previous() const;
int sectorEnd() const {
@@ -96,57 +58,120 @@ struct SkOpAngle {
return fSectorStart;
}
- SkOpSegment* segment() const;
+ void set(const SkOpSegment* segment, int start, int end);
- void set(SkOpSpanBase* start, SkOpSpanBase* end);
- void setCurveHullSweep();
+ void setLastMarked(SkOpSpan* marked) {
+ fLastMarked = marked;
+ }
- void setID(int id) {
- PATH_OPS_DEBUG_CODE(fID = id);
+ SkOpSegment* segment() const {
+ return const_cast<SkOpSegment*>(fSegment);
}
- void setLastMarked(SkOpSpanBase* marked) {
- fLastMarked = marked;
+ int sign() const {
+ return SkSign32(fStart - fEnd);
}
- void setSector();
- void setSpans();
- int sign() const;
+ bool small() const;
- SkOpSpanBase* start() const {
+ int start() const {
return fStart;
}
- SkOpSpan* starter();
- bool tangentsDiverge(const SkOpAngle* rh, double s0xt0) const;
-
bool unorderable() const {
return fUnorderable;
}
- SkDCubic fCurvePart; // the curve from start to end
+ // 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 dumpLoop() const;
+ void dumpTo(const SkOpSegment* fromSeg, const SkOpAngle* ) const;
+
+#if DEBUG_ANGLE
+ int debugID() const { return fID; }
+
+ void setID(int id) {
+ fID = id;
+ }
+#else
+ int debugID() const { return 0; }
+#endif
+
+#if DEBUG_VALIDATE
+ void debugValidateLoop() const;
+#endif
+
+private:
+ 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
+ bool overlap(const SkOpAngle& test) const;
+ void setCurveHullSweep();
+ void setSector();
+ void setSpans();
+ bool tangentsDiverge(const SkOpAngle& rh, double s0xt0) const;
+
+ SkDCubic fCurvePart; // the curve from start to end
double fSide;
SkLineParameters fTangentHalf; // used only to sort a pair of lines or line-like sections
+ const SkOpSegment* fSegment;
SkOpAngle* fNext;
- SkOpSpanBase* fLastMarked;
+ SkOpSpan* fLastMarked;
SkDVector fSweep[2];
- SkOpSpanBase* fStart;
- SkOpSpanBase* fEnd;
- SkOpSpanBase* fComputedEnd;
+ int fStart;
+ int fEnd;
+ int fComputedEnd;
int fSectorMask;
int8_t fSectorStart; // in 32nds of a circle
int8_t fSectorEnd;
bool fIsCurve;
- bool fStop; // set if ordered angle is greater than the previous
- bool fUnorderable;
+ 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;
- bool fCheckCoincidence;
- PATH_OPS_DEBUG_CODE(int fID);
+#if DEBUG_ANGLE
+ int fID;
+#endif
+#if DEBUG_VALIDATE
+ void debugValidateNext() const; // in debug builds, verify that angle loop is uncorrupted
+#else
+ void debugValidateNext() const {}
+#endif
+ void dumpOne(bool showFunc) const; // available to testing only
+ void dumpPartials() const; // utility to be called by user from debugger
+ friend class PathOpsAngleTester;
};
-
+class SkOpAngleSet {
+public:
+ SkOpAngleSet();
+ ~SkOpAngleSet();
+ SkOpAngle& push_back();
+ void reset();
+private:
+ void dump() const; // utility to be called by user from debugger
+ SkChunkAlloc* fAngles;
+#if DEBUG_ANGLE
+ int fCount;
+#endif
+};
#endif