|
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 "SkPath.h" |
|
12 #include "SkPathOpsCubic.h" |
|
13 |
|
14 class SkOpSegment; |
|
15 struct SkOpSpan; |
|
16 |
|
17 // sorting angles |
|
18 // given angles of {dx dy ddx ddy dddx dddy} sort them |
|
19 class SkOpAngle { |
|
20 public: |
|
21 enum { kStackBasedCount = 8 }; // FIXME: determine what this should be |
|
22 enum IncludeType { |
|
23 kUnaryWinding, |
|
24 kUnaryXor, |
|
25 kBinarySingle, |
|
26 kBinaryOpp, |
|
27 }; |
|
28 |
|
29 bool operator<(const SkOpAngle& rh) const; |
|
30 |
|
31 bool calcSlop(double x, double y, double rx, double ry, bool* result) const; |
|
32 |
|
33 double dx() const { |
|
34 return fTangentPart.dx(); |
|
35 } |
|
36 |
|
37 double dy() const { |
|
38 return fTangentPart.dy(); |
|
39 } |
|
40 |
|
41 int end() const { |
|
42 return fEnd; |
|
43 } |
|
44 |
|
45 bool isHorizontal() const; |
|
46 |
|
47 SkOpSpan* lastMarked() const { |
|
48 return fLastMarked; |
|
49 } |
|
50 |
|
51 void set(const SkOpSegment* segment, int start, int end); |
|
52 |
|
53 void setLastMarked(SkOpSpan* marked) { |
|
54 fLastMarked = marked; |
|
55 } |
|
56 |
|
57 SkOpSegment* segment() const { |
|
58 return const_cast<SkOpSegment*>(fSegment); |
|
59 } |
|
60 |
|
61 int sign() const { |
|
62 return SkSign32(fStart - fEnd); |
|
63 } |
|
64 |
|
65 int start() const { |
|
66 return fStart; |
|
67 } |
|
68 |
|
69 bool unorderable() const { |
|
70 return fUnorderable; |
|
71 } |
|
72 |
|
73 bool unsortable() const { |
|
74 return fUnsortable; |
|
75 } |
|
76 |
|
77 #ifdef SK_DEBUG |
|
78 void dump() const; |
|
79 #endif |
|
80 |
|
81 #if DEBUG_ANGLE |
|
82 void setID(int id) { |
|
83 fID = id; |
|
84 } |
|
85 #endif |
|
86 |
|
87 private: |
|
88 bool lengthen(const SkOpAngle& ); |
|
89 void setSpans(); |
|
90 |
|
91 SkDCubic fCurvePart; // the curve from start to end |
|
92 SkDCubic fCurveHalf; // the curve from start to 1 or 0 |
|
93 double fSide; |
|
94 double fSide2; |
|
95 SkLineParameters fTangentPart; |
|
96 SkLineParameters fTangentHalf; |
|
97 const SkOpSegment* fSegment; |
|
98 SkOpSpan* fLastMarked; |
|
99 int fStart; |
|
100 int fEnd; |
|
101 bool fComputed; // tangent is computed, may contain some error |
|
102 // if subdividing a quad or cubic causes the tangent to go from the maximum angle to the |
|
103 // minimum, mark it unorderable. It still can be sorted, which is good enough for find-top |
|
104 // but can't be ordered, and therefore can't be used to compute winding |
|
105 bool fUnorderable; |
|
106 mutable bool fUnsortable; // this alone is editable by the less than operator |
|
107 #if DEBUG_ANGLE |
|
108 int fID; |
|
109 #endif |
|
110 }; |
|
111 |
|
112 #endif |