diff options
author | reed <reed@google.com> | 2015-03-24 13:55:33 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-03-24 13:55:33 -0700 |
commit | 0dc4dd6dda9a7912f696b46d9c02155ec1d1ba5f (patch) | |
tree | 994c85a8e418986415175ddccc71adf924df3846 /src/pathops/SkOpAngle.h | |
parent | 82dec0e16ae10026194ce45b67af931700510450 (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.h | 179 |
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 |