Line data Source code
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 0 : SkOpSpanBase* end() const {
64 0 : return fEnd;
65 : }
66 :
67 : bool insert(SkOpAngle* );
68 : SkOpSpanBase* lastMarked() const;
69 : bool loopContains(const SkOpAngle* ) const;
70 : int loopCount() const;
71 :
72 0 : SkOpAngle* next() const {
73 0 : return fNext;
74 : }
75 :
76 : SkOpAngle* previous() const;
77 : SkOpSegment* segment() const;
78 : void set(SkOpSpanBase* start, SkOpSpanBase* end);
79 :
80 0 : void setLastMarked(SkOpSpanBase* marked) {
81 0 : fLastMarked = marked;
82 0 : }
83 :
84 0 : SkOpSpanBase* start() const {
85 0 : return fStart;
86 : }
87 :
88 : SkOpSpan* starter();
89 :
90 0 : bool tangentsAmbiguous() const {
91 0 : return fTangentsAmbiguous;
92 : }
93 :
94 0 : bool unorderable() const {
95 0 : 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
|