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 "SkLineParameters.h"
11 #include "SkPathOpsCurve.h"
12 #if DEBUG_ANGLE
13 #include "SkString.h"
14 #endif
15 
16 class SkOpContour;
17 class SkOpPtT;
18 class SkOpSegment;
19 class SkOpSpanBase;
20 class SkOpSpan;
21 
22 class SkOpAngle {
23 public:
24     enum IncludeType {
25         kUnaryWinding,
26         kUnaryXor,
27         kBinarySingle,
28         kBinaryOpp,
29     };
30 
31     const SkOpAngle* debugAngle(int id) const;
32     const SkOpCoincidence* debugCoincidence() const;
33     SkOpContour* debugContour(int id) const;
34 
35     int debugID() const {
36         return SkDEBUGRELEASE(fID, -1);
37     }
38 
39 #if DEBUG_SORT
40     void debugLoop() const;
41 #endif
42 
43 #if DEBUG_ANGLE
44     bool debugCheckCoincidence() const { return fCheckCoincidence; }
45     void debugCheckNearCoincidence() const;
46     SkString debugPart() const;
47 #endif
48     const SkOpPtT* debugPtT(int id) const;
49     const SkOpSegment* debugSegment(int id) const;
50     int debugSign() const;
51     const SkOpSpanBase* debugSpan(int id) const;
52     void debugValidate() const;
53     void debugValidateNext() const;  // in debug builds, verify that angle loop is uncorrupted
54     double distEndRatio(double dist) const;
55     // available to testing only
56     void dump() const;
57     void dumpCurves() const;
58     void dumpLoop() const;
59     void dumpOne(bool functionHeader) const;
60     void dumpTo(const SkOpSegment* fromSeg, const SkOpAngle* ) const;
61     void dumpTest() const;
62 
63     SkOpSpanBase* end() const {
64         return fEnd;
65     }
66 
67     bool insert(SkOpAngle* );
68     SkOpSpanBase* lastMarked() const;
69     bool loopContains(const SkOpAngle* ) const;
70     int loopCount() const;
71 
72     SkOpAngle* next() const {
73         return fNext;
74     }
75 
76     SkOpAngle* previous() const;
77     SkOpSegment* segment() const;
78     void set(SkOpSpanBase* start, SkOpSpanBase* end);
79 
80     void setLastMarked(SkOpSpanBase* marked) {
81         fLastMarked = marked;
82     }
83 
84     SkOpSpanBase* start() const {
85         return fStart;
86     }
87 
88     SkOpSpan* starter();
89 
90     bool tangentsAmbiguous() const {
91         return fTangentsAmbiguous;
92     }
93 
94     bool unorderable() const {
95         return fUnorderable;
96     }
97 
98 private:
99     bool after(SkOpAngle* test);
100     void alignmentSameSide(const SkOpAngle* test, int* order) const;
101     int allOnOneSide(const SkOpAngle* test);
102     bool checkCrossesZero() const;
103     bool checkParallel(SkOpAngle* );
104     bool computeSector();
105     int convexHullOverlaps(const SkOpAngle* );
106     bool endToSide(const SkOpAngle* rh, bool* inside) const;
107     bool endsIntersect(SkOpAngle* );
108     int findSector(SkPath::Verb verb, double x, double y) const;
109     SkOpGlobalState* globalState() const;
110     bool merge(SkOpAngle* );
111     double midT() const;
112     bool midToSide(const SkOpAngle* rh, bool* inside) const;
113     bool oppositePlanes(const SkOpAngle* rh) const;
114     bool orderable(SkOpAngle* rh);  // false == this < rh ; true == this > rh
115     void setSector();
116     void setSpans();
117     bool tangentsDiverge(const SkOpAngle* rh, double s0xt0);
118 
119     SkDCurve fOriginalCurvePart;  // the curve from start to end
120     SkDCurveSweep fPart;  // the curve from start to end offset as needed
121     double fSide;
122     SkLineParameters fTangentHalf;  // used only to sort a pair of lines or line-like sections
123     SkOpAngle* fNext;
124     SkOpSpanBase* fLastMarked;
125     SkOpSpanBase* fStart;
126     SkOpSpanBase* fEnd;
127     SkOpSpanBase* fComputedEnd;
128     int fSectorMask;
129     int8_t fSectorStart;  // in 32nds of a circle
130     int8_t fSectorEnd;
131     bool fUnorderable;
132     bool fComputeSector;
133     bool fComputedSector;
134     bool fCheckCoincidence;
135     bool fTangentsAmbiguous;
136     SkDEBUGCODE(int fID);
137 
138     friend class PathOpsAngleTester;
139 };
140 
141 
142 
143 #endif
144