• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 #ifndef SkOpAngle_DEFINED
8 #define SkOpAngle_DEFINED
9 
10 #include "SkChunkAlloc.h"
11 #include "SkLineParameters.h"
12 
13 class SkOpSegment;
14 struct SkOpSpan;
15 
16 // sorting angles
17 // given angles of {dx dy ddx ddy dddx dddy} sort them
18 class SkOpAngle {
19 public:
20     enum { kStackBasedCount = 8 }; // FIXME: determine what this should be
21     enum IncludeType {
22         kUnaryWinding,
23         kUnaryXor,
24         kBinarySingle,
25         kBinaryOpp,
26     };
27 
28 
end()29     int end() const {
30         return fEnd;
31     }
32 
33     const SkOpAngle* findFirst() const;
34 
inLoop()35     bool inLoop() const {
36         return !!fNext;
37     }
38 
39     void insert(SkOpAngle* );
40     bool isHorizontal() const;
41     SkOpSpan* lastMarked() const;
42     bool loopContains(const SkOpAngle& ) const;
43     int loopCount() const;
44     void markStops();
45     bool merge(SkOpAngle* );
46 
next()47     SkOpAngle* next() const {
48         return fNext;
49     }
50 
51     SkOpAngle* previous() const;
52 
53     void set(const SkOpSegment* segment, int start, int end);
54 
setLastMarked(SkOpSpan * marked)55     void setLastMarked(SkOpSpan* marked) {
56         fLastMarked = marked;
57     }
58 
segment()59     SkOpSegment* segment() const {
60         return const_cast<SkOpSegment*>(fSegment);
61     }
62 
sign()63     int sign() const {
64         return SkSign32(fStart - fEnd);
65     }
66 
67     bool small() const;
68 
start()69     int start() const {
70         return fStart;
71     }
72 
unorderable()73     bool unorderable() const {
74         return fUnorderable;
75     }
76 
77     // available to testing only
78 #if DEBUG_SORT
79     void debugLoop() const;  // called by code during run
80 #endif
81 #if DEBUG_ANGLE
82     void debugSameAs(const SkOpAngle* compare) const;
83 #endif
84     void dump() const;
85     void dumpLoop() const;
86     void dumpTo(const SkOpSegment* fromSeg, const SkOpAngle* ) const;
87 
88 #if DEBUG_ANGLE
debugID()89     int debugID() const { return fID; }
90 
setID(int id)91     void setID(int id) {
92         fID = id;
93     }
94 #else
debugID()95     int debugID() const { return 0; }
96 #endif
97 
98 #if DEBUG_VALIDATE
99     void debugValidateLoop() const;
100 #endif
101 
102 private:
103     bool after(const SkOpAngle* test) const;
104     int allOnOneSide(const SkOpAngle& test) const;
105     bool calcSlop(double x, double y, double rx, double ry, bool* result) const;
106     bool checkCrossesZero() const;
107     bool checkParallel(const SkOpAngle& ) const;
108     bool computeSector();
109     int convexHullOverlaps(const SkOpAngle& ) const;
110     double distEndRatio(double dist) const;
111     int findSector(SkPath::Verb verb, double x, double y) const;
112     bool endsIntersect(const SkOpAngle& ) const;
113     double midT() const;
114     bool oppositePlanes(const SkOpAngle& rh) const;
115     bool orderable(const SkOpAngle& rh) const;  // false == this < rh ; true == this > rh
116     bool overlap(const SkOpAngle& test) const;
117     void setCurveHullSweep();
118     void setSector();
119     void setSpans();
120     bool tangentsDiverge(const SkOpAngle& rh, double s0xt0) const;
121 
122     SkDCubic fCurvePart; // the curve from start to end
123     double fSide;
124     SkLineParameters fTangentHalf;  // used only to sort a pair of lines or line-like sections
125     const SkOpSegment* fSegment;
126     SkOpAngle* fNext;
127     SkOpSpan* fLastMarked;
128     SkDVector fSweep[2];
129     int fStart;
130     int fEnd;
131     int fComputedEnd;
132     int fSectorMask;
133     int8_t fSectorStart;  // in 32nds of a circle
134     int8_t fSectorEnd;
135     bool fIsCurve;
136     bool fStop; // set if ordered angle is greater than the previous
137     mutable bool fUnorderable;  // this is editable by orderable()
138     bool fUnorderedSweep;  // set when a cubic's first control point between the sweep vectors
139     bool fComputeSector;
140     bool fComputedSector;
141 
142 #if DEBUG_ANGLE
143     int fID;
144 #endif
145 #if DEBUG_VALIDATE
146     void debugValidateNext() const;  // in debug builds, verify that angle loop is uncorrupted
147 #else
debugValidateNext()148     void debugValidateNext() const {}
149 #endif
150     void dumpOne(bool showFunc) const;  // available to testing only
151     void dumpPartials() const;  // utility to be called by user from debugger
152     friend class PathOpsAngleTester;
153 };
154 
155 class SkOpAngleSet {
156 public:
157     SkOpAngleSet();
158     ~SkOpAngleSet();
159     SkOpAngle& push_back();
160     void reset();
161 private:
162     void dump() const;  // utility to be called by user from debugger
163     SkChunkAlloc* fAngles;
164 #if DEBUG_ANGLE
165     int fCount;
166 #endif
167 };
168 
169 #endif
170