Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(366)

Unified Diff: src/pathops/SkOpAngle.h

Issue 1029993002: Revert of pathops version two (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/pathops/SkIntersections.cpp ('k') | src/pathops/SkOpAngle.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/pathops/SkOpAngle.h
diff --git a/src/pathops/SkOpAngle.h b/src/pathops/SkOpAngle.h
index 84b37010c94ecf11f98a004c67c7b5cfe89e731b..1dc425061352f43188d88abea5a6d84512b7827b 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 @@
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);
- }
-
-#if DEBUG_SORT
- void debugLoop() const;
-#endif
-
-#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 {
+ int end() const {
return fEnd;
}
- 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;
+ const SkOpAngle* findFirst() const;
+
+ bool inLoop() const {
+ return !!fNext;
+ }
+
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 @@
return fSectorStart;
}
- SkOpSegment* segment() const;
+ void set(const SkOpSegment* segment, int start, int end);
- void set(SkOpSpanBase* start, SkOpSpanBase* end);
- void setCurveHullSweep();
-
- void setID(int id) {
- PATH_OPS_DEBUG_CODE(fID = id);
- }
-
- void setLastMarked(SkOpSpanBase* marked) {
+ void setLastMarked(SkOpSpan* marked) {
fLastMarked = marked;
}
- void setSector();
- void setSpans();
- int sign() const;
+ SkOpSegment* segment() const {
+ return const_cast<SkOpSegment*>(fSegment);
+ }
- SkOpSpanBase* start() const {
+ int sign() const {
+ return SkSign32(fStart - fEnd);
+ }
+
+ bool small() 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
« no previous file with comments | « src/pathops/SkIntersections.cpp ('k') | src/pathops/SkOpAngle.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698