OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef SkPathOpsCubic_DEFINED | 8 #ifndef SkPathOpsCubic_DEFINED |
9 #define SkPathOpsCubic_DEFINED | 9 #define SkPathOpsCubic_DEFINED |
10 | 10 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 | 50 |
51 static bool IsCubic() { return true; } | 51 static bool IsCubic() { return true; } |
52 | 52 |
53 const SkDPoint& operator[](int n) const { SkASSERT(n >= 0 && n < kPointCount
); return fPts[n]; } | 53 const SkDPoint& operator[](int n) const { SkASSERT(n >= 0 && n < kPointCount
); return fPts[n]; } |
54 SkDPoint& operator[](int n) { SkASSERT(n >= 0 && n < kPointCount); return fP
ts[n]; } | 54 SkDPoint& operator[](int n) { SkASSERT(n >= 0 && n < kPointCount); return fP
ts[n]; } |
55 | 55 |
56 void align(int endIndex, int ctrlIndex, SkDPoint* dstPt) const; | 56 void align(int endIndex, int ctrlIndex, SkDPoint* dstPt) const; |
57 double binarySearch(double min, double max, double axisIntercept, SearchAxis
xAxis) const; | 57 double binarySearch(double min, double max, double axisIntercept, SearchAxis
xAxis) const; |
58 double calcPrecision() const; | 58 double calcPrecision() const; |
59 SkDCubicPair chopAt(double t) const; | 59 SkDCubicPair chopAt(double t) const; |
60 bool clockwise(const SkDCubic& whole, bool* swap) const; | |
61 static bool Clockwise(const SkPoint* pts, double startT, double endT, bool*
swap); | |
62 static void Coefficients(const double* cubic, double* A, double* B, double*
C, double* D); | 60 static void Coefficients(const double* cubic, double* A, double* B, double*
C, double* D); |
63 static bool ComplexBreak(const SkPoint pts[4], SkScalar* t, CubicType* cubic
Type); | 61 static bool ComplexBreak(const SkPoint pts[4], SkScalar* t, CubicType* cubic
Type); |
64 int convexHull(char order[kPointCount]) const; | 62 int convexHull(char order[kPointCount]) const; |
65 | 63 |
66 void debugInit() { | 64 void debugInit() { |
67 sk_bzero(fPts, sizeof(fPts)); | 65 sk_bzero(fPts, sizeof(fPts)); |
68 } | 66 } |
69 | 67 |
70 void dump() const; // callable from the debugger when the implementation co
de is linked in | 68 void dump() const; // callable from the debugger when the implementation co
de is linked in |
71 void dumpID(int id) const; | 69 void dumpID(int id) const; |
72 void dumpInner() const; | 70 void dumpInner() const; |
73 SkDVector dxdyAtT(double t) const; | 71 SkDVector dxdyAtT(double t) const; |
74 bool endsAreExtremaInXOrY() const; | 72 bool endsAreExtremaInXOrY() const; |
75 static int FindExtrema(const double src[], double tValue[2]); | 73 static int FindExtrema(const double src[], double tValue[2]); |
76 int findInflections(double tValues[2]) const; | 74 int findInflections(double tValues[2]) const; |
77 | 75 |
78 static int FindInflections(const SkPoint a[kPointCount], double tValues[2])
{ | 76 static int FindInflections(const SkPoint a[kPointCount], double tValues[2])
{ |
79 SkDCubic cubic; | 77 SkDCubic cubic; |
80 cubic.set(a); | 78 return cubic.set(a).findInflections(tValues); |
81 return cubic.findInflections(tValues); | |
82 } | 79 } |
83 | 80 |
84 int findMaxCurvature(double tValues[]) const; | 81 int findMaxCurvature(double tValues[]) const; |
85 bool hullIntersects(const SkDCubic& c2, bool* isLinear) const; | 82 bool hullIntersects(const SkDCubic& c2, bool* isLinear) const; |
86 bool hullIntersects(const SkDConic& c, bool* isLinear) const; | 83 bool hullIntersects(const SkDConic& c, bool* isLinear) const; |
87 bool hullIntersects(const SkDQuad& c2, bool* isLinear) const; | 84 bool hullIntersects(const SkDQuad& c2, bool* isLinear) const; |
88 bool hullIntersects(const SkDPoint* pts, int ptCount, bool* isLinear) const; | 85 bool hullIntersects(const SkDPoint* pts, int ptCount, bool* isLinear) const; |
89 bool isLinear(int startIndex, int endIndex) const; | 86 bool isLinear(int startIndex, int endIndex) const; |
90 bool monotonicInX() const; | 87 bool monotonicInX() const; |
91 bool monotonicInY() const; | 88 bool monotonicInY() const; |
(...skipping 21 matching lines...) Expand all Loading... |
113 fPts[1] = pts[1]; | 110 fPts[1] = pts[1]; |
114 fPts[2] = pts[2]; | 111 fPts[2] = pts[2]; |
115 fPts[3] = pts[3]; | 112 fPts[3] = pts[3]; |
116 return *this; | 113 return *this; |
117 } | 114 } |
118 | 115 |
119 SkDCubic subDivide(double t1, double t2) const; | 116 SkDCubic subDivide(double t1, double t2) const; |
120 | 117 |
121 static SkDCubic SubDivide(const SkPoint a[kPointCount], double t1, double t2
) { | 118 static SkDCubic SubDivide(const SkPoint a[kPointCount], double t1, double t2
) { |
122 SkDCubic cubic; | 119 SkDCubic cubic; |
123 cubic.set(a); | 120 return cubic.set(a).subDivide(t1, t2); |
124 return cubic.subDivide(t1, t2); | |
125 } | 121 } |
126 | 122 |
127 void subDivide(const SkDPoint& a, const SkDPoint& d, double t1, double t2, S
kDPoint p[2]) const; | 123 void subDivide(const SkDPoint& a, const SkDPoint& d, double t1, double t2, S
kDPoint p[2]) const; |
128 | 124 |
129 static void SubDivide(const SkPoint pts[kPointCount], const SkDPoint& a, con
st SkDPoint& d, double t1, | 125 static void SubDivide(const SkPoint pts[kPointCount], const SkDPoint& a, con
st SkDPoint& d, double t1, |
130 double t2, SkDPoint p[2]) { | 126 double t2, SkDPoint p[2]) { |
131 SkDCubic cubic; | 127 SkDCubic cubic; |
132 cubic.set(pts); | 128 cubic.set(pts).subDivide(a, d, t1, t2, p); |
133 cubic.subDivide(a, d, t1, t2, p); | |
134 } | 129 } |
135 | 130 |
| 131 double top(const SkDCubic& dCurve, double startT, double endT, SkDPoint*topP
t) const; |
136 SkDQuad toQuad() const; | 132 SkDQuad toQuad() const; |
137 | 133 |
138 static const int gPrecisionUnit; | 134 static const int gPrecisionUnit; |
139 | 135 |
140 SkDPoint fPts[kPointCount]; | 136 SkDPoint fPts[kPointCount]; |
141 }; | 137 }; |
142 | 138 |
143 /* Given the set [0, 1, 2, 3], and two of the four members, compute an XOR mask | 139 /* Given the set [0, 1, 2, 3], and two of the four members, compute an XOR mask |
144 that computes the other two. Note that: | 140 that computes the other two. Note that: |
145 | 141 |
146 one ^ two == 3 for (0, 3), (1, 2) | 142 one ^ two == 3 for (0, 3), (1, 2) |
147 one ^ two < 3 for (0, 1), (0, 2), (1, 3), (2, 3) | 143 one ^ two < 3 for (0, 1), (0, 2), (1, 3), (2, 3) |
148 3 - (one ^ two) is either 0, 1, or 2 | 144 3 - (one ^ two) is either 0, 1, or 2 |
149 1 >> (3 - (one ^ two)) is either 0 or 1 | 145 1 >> (3 - (one ^ two)) is either 0 or 1 |
150 thus: | 146 thus: |
151 returned == 2 for (0, 3), (1, 2) | 147 returned == 2 for (0, 3), (1, 2) |
152 returned == 3 for (0, 1), (0, 2), (1, 3), (2, 3) | 148 returned == 3 for (0, 1), (0, 2), (1, 3), (2, 3) |
153 given that: | 149 given that: |
154 (0, 3) ^ 2 -> (2, 1) (1, 2) ^ 2 -> (3, 0) | 150 (0, 3) ^ 2 -> (2, 1) (1, 2) ^ 2 -> (3, 0) |
155 (0, 1) ^ 3 -> (3, 2) (0, 2) ^ 3 -> (3, 1) (1, 3) ^ 3 -> (2, 0) (2, 3) ^ 3
-> (1, 0) | 151 (0, 1) ^ 3 -> (3, 2) (0, 2) ^ 3 -> (3, 1) (1, 3) ^ 3 -> (2, 0) (2, 3) ^ 3
-> (1, 0) |
156 */ | 152 */ |
157 inline int other_two(int one, int two) { | 153 inline int other_two(int one, int two) { |
158 return 1 >> (3 - (one ^ two)) ^ 3; | 154 return 1 >> (3 - (one ^ two)) ^ 3; |
159 } | 155 } |
160 | 156 |
161 #endif | 157 #endif |
OLD | NEW |