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 #ifndef SkPathOpsCurve_DEFINE | 7 #ifndef SkPathOpsCurve_DEFINE |
8 #define SkPathOpsCurve_DEFINE | 8 #define SkPathOpsCurve_DEFINE |
9 | 9 |
10 #include "SkIntersections.h" | 10 #include "SkIntersections.h" |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 return conic.ptAtT(t); | 101 return conic.ptAtT(t); |
102 } | 102 } |
103 | 103 |
104 static SkDPoint dcubic_xy_at_t(const SkPoint a[4], SkScalar , double t) { | 104 static SkDPoint dcubic_xy_at_t(const SkPoint a[4], SkScalar , double t) { |
105 SkDCubic cubic; | 105 SkDCubic cubic; |
106 cubic.set(a); | 106 cubic.set(a); |
107 return cubic.ptAtT(t); | 107 return cubic.ptAtT(t); |
108 } | 108 } |
109 | 109 |
110 static SkDPoint (* const CurveDPointAtT[])(const SkPoint[], SkScalar , double )
= { | 110 static SkDPoint (* const CurveDPointAtT[])(const SkPoint[], SkScalar , double )
= { |
111 NULL, | 111 nullptr, |
112 dline_xy_at_t, | 112 dline_xy_at_t, |
113 dquad_xy_at_t, | 113 dquad_xy_at_t, |
114 dconic_xy_at_t, | 114 dconic_xy_at_t, |
115 dcubic_xy_at_t | 115 dcubic_xy_at_t |
116 }; | 116 }; |
117 | 117 |
118 static SkPoint fline_xy_at_t(const SkPoint a[2], SkScalar weight, double t) { | 118 static SkPoint fline_xy_at_t(const SkPoint a[2], SkScalar weight, double t) { |
119 return dline_xy_at_t(a, weight, t).asSkPoint(); | 119 return dline_xy_at_t(a, weight, t).asSkPoint(); |
120 } | 120 } |
121 | 121 |
122 static SkPoint fquad_xy_at_t(const SkPoint a[3], SkScalar weight, double t) { | 122 static SkPoint fquad_xy_at_t(const SkPoint a[3], SkScalar weight, double t) { |
123 return dquad_xy_at_t(a, weight, t).asSkPoint(); | 123 return dquad_xy_at_t(a, weight, t).asSkPoint(); |
124 } | 124 } |
125 | 125 |
126 static SkPoint fconic_xy_at_t(const SkPoint a[3], SkScalar weight, double t) { | 126 static SkPoint fconic_xy_at_t(const SkPoint a[3], SkScalar weight, double t) { |
127 return dconic_xy_at_t(a, weight, t).asSkPoint(); | 127 return dconic_xy_at_t(a, weight, t).asSkPoint(); |
128 } | 128 } |
129 | 129 |
130 static SkPoint fcubic_xy_at_t(const SkPoint a[4], SkScalar weight, double t) { | 130 static SkPoint fcubic_xy_at_t(const SkPoint a[4], SkScalar weight, double t) { |
131 return dcubic_xy_at_t(a, weight, t).asSkPoint(); | 131 return dcubic_xy_at_t(a, weight, t).asSkPoint(); |
132 } | 132 } |
133 | 133 |
134 static SkPoint (* const CurvePointAtT[])(const SkPoint[], SkScalar , double ) =
{ | 134 static SkPoint (* const CurvePointAtT[])(const SkPoint[], SkScalar , double ) =
{ |
135 NULL, | 135 nullptr, |
136 fline_xy_at_t, | 136 fline_xy_at_t, |
137 fquad_xy_at_t, | 137 fquad_xy_at_t, |
138 fconic_xy_at_t, | 138 fconic_xy_at_t, |
139 fcubic_xy_at_t | 139 fcubic_xy_at_t |
140 }; | 140 }; |
141 | 141 |
142 static SkDVector dline_dxdy_at_t(const SkPoint a[2], SkScalar , double ) { | 142 static SkDVector dline_dxdy_at_t(const SkPoint a[2], SkScalar , double ) { |
143 SkDLine line; | 143 SkDLine line; |
144 line.set(a); | 144 line.set(a); |
145 return line[1] - line[0]; | 145 return line[1] - line[0]; |
(...skipping 11 matching lines...) Expand all Loading... |
157 return conic.dxdyAtT(t); | 157 return conic.dxdyAtT(t); |
158 } | 158 } |
159 | 159 |
160 static SkDVector dcubic_dxdy_at_t(const SkPoint a[4], SkScalar , double t) { | 160 static SkDVector dcubic_dxdy_at_t(const SkPoint a[4], SkScalar , double t) { |
161 SkDCubic cubic; | 161 SkDCubic cubic; |
162 cubic.set(a); | 162 cubic.set(a); |
163 return cubic.dxdyAtT(t); | 163 return cubic.dxdyAtT(t); |
164 } | 164 } |
165 | 165 |
166 static SkDVector (* const CurveDSlopeAtT[])(const SkPoint[], SkScalar , double )
= { | 166 static SkDVector (* const CurveDSlopeAtT[])(const SkPoint[], SkScalar , double )
= { |
167 NULL, | 167 nullptr, |
168 dline_dxdy_at_t, | 168 dline_dxdy_at_t, |
169 dquad_dxdy_at_t, | 169 dquad_dxdy_at_t, |
170 dconic_dxdy_at_t, | 170 dconic_dxdy_at_t, |
171 dcubic_dxdy_at_t | 171 dcubic_dxdy_at_t |
172 }; | 172 }; |
173 | 173 |
174 static SkVector fline_dxdy_at_t(const SkPoint a[2], SkScalar , double ) { | 174 static SkVector fline_dxdy_at_t(const SkPoint a[2], SkScalar , double ) { |
175 return a[1] - a[0]; | 175 return a[1] - a[0]; |
176 } | 176 } |
177 | 177 |
178 static SkVector fquad_dxdy_at_t(const SkPoint a[3], SkScalar weight, double t) { | 178 static SkVector fquad_dxdy_at_t(const SkPoint a[3], SkScalar weight, double t) { |
179 return dquad_dxdy_at_t(a, weight, t).asSkVector(); | 179 return dquad_dxdy_at_t(a, weight, t).asSkVector(); |
180 } | 180 } |
181 | 181 |
182 static SkVector fconic_dxdy_at_t(const SkPoint a[3], SkScalar weight, double t)
{ | 182 static SkVector fconic_dxdy_at_t(const SkPoint a[3], SkScalar weight, double t)
{ |
183 return dconic_dxdy_at_t(a, weight, t).asSkVector(); | 183 return dconic_dxdy_at_t(a, weight, t).asSkVector(); |
184 } | 184 } |
185 | 185 |
186 static SkVector fcubic_dxdy_at_t(const SkPoint a[4], SkScalar weight, double t)
{ | 186 static SkVector fcubic_dxdy_at_t(const SkPoint a[4], SkScalar weight, double t)
{ |
187 return dcubic_dxdy_at_t(a, weight, t).asSkVector(); | 187 return dcubic_dxdy_at_t(a, weight, t).asSkVector(); |
188 } | 188 } |
189 | 189 |
190 static SkVector (* const CurveSlopeAtT[])(const SkPoint[], SkScalar , double ) =
{ | 190 static SkVector (* const CurveSlopeAtT[])(const SkPoint[], SkScalar , double ) =
{ |
191 NULL, | 191 nullptr, |
192 fline_dxdy_at_t, | 192 fline_dxdy_at_t, |
193 fquad_dxdy_at_t, | 193 fquad_dxdy_at_t, |
194 fconic_dxdy_at_t, | 194 fconic_dxdy_at_t, |
195 fcubic_dxdy_at_t | 195 fcubic_dxdy_at_t |
196 }; | 196 }; |
197 | 197 |
198 static bool line_is_vertical(const SkPoint a[2], SkScalar , double startT, doubl
e endT) { | 198 static bool line_is_vertical(const SkPoint a[2], SkScalar , double startT, doubl
e endT) { |
199 SkDLine line; | 199 SkDLine line; |
200 line.set(a); | 200 line.set(a); |
201 SkDPoint dst[2] = { line.ptAtT(startT), line.ptAtT(endT) }; | 201 SkDPoint dst[2] = { line.ptAtT(startT), line.ptAtT(endT) }; |
(...skipping 16 matching lines...) Expand all Loading... |
218 | 218 |
219 static bool cubic_is_vertical(const SkPoint a[4], SkScalar , double startT, doub
le endT) { | 219 static bool cubic_is_vertical(const SkPoint a[4], SkScalar , double startT, doub
le endT) { |
220 SkDCubic cubic; | 220 SkDCubic cubic; |
221 cubic.set(a); | 221 cubic.set(a); |
222 SkDCubic dst = cubic.subDivide(startT, endT); | 222 SkDCubic dst = cubic.subDivide(startT, endT); |
223 return AlmostEqualUlps(dst[0].fX, dst[1].fX) && AlmostEqualUlps(dst[1].fX, d
st[2].fX) | 223 return AlmostEqualUlps(dst[0].fX, dst[1].fX) && AlmostEqualUlps(dst[1].fX, d
st[2].fX) |
224 && AlmostEqualUlps(dst[2].fX, dst[3].fX); | 224 && AlmostEqualUlps(dst[2].fX, dst[3].fX); |
225 } | 225 } |
226 | 226 |
227 static bool (* const CurveIsVertical[])(const SkPoint[], SkScalar , double , dou
ble) = { | 227 static bool (* const CurveIsVertical[])(const SkPoint[], SkScalar , double , dou
ble) = { |
228 NULL, | 228 nullptr, |
229 line_is_vertical, | 229 line_is_vertical, |
230 quad_is_vertical, | 230 quad_is_vertical, |
231 conic_is_vertical, | 231 conic_is_vertical, |
232 cubic_is_vertical | 232 cubic_is_vertical |
233 }; | 233 }; |
234 | 234 |
235 static void line_intersect_ray(const SkPoint a[2], SkScalar , const SkDLine& ray
, | 235 static void line_intersect_ray(const SkPoint a[2], SkScalar , const SkDLine& ray
, |
236 SkIntersections* i) { | 236 SkIntersections* i) { |
237 SkDLine line; | 237 SkDLine line; |
238 line.set(a); | 238 line.set(a); |
(...skipping 16 matching lines...) Expand all Loading... |
255 | 255 |
256 static void cubic_intersect_ray(const SkPoint a[4], SkScalar , const SkDLine& ra
y, | 256 static void cubic_intersect_ray(const SkPoint a[4], SkScalar , const SkDLine& ra
y, |
257 SkIntersections* i) { | 257 SkIntersections* i) { |
258 SkDCubic cubic; | 258 SkDCubic cubic; |
259 cubic.set(a); | 259 cubic.set(a); |
260 i->intersectRay(cubic, ray); | 260 i->intersectRay(cubic, ray); |
261 } | 261 } |
262 | 262 |
263 static void (* const CurveIntersectRay[])(const SkPoint[] , SkScalar , const SkD
Line& , | 263 static void (* const CurveIntersectRay[])(const SkPoint[] , SkScalar , const SkD
Line& , |
264 SkIntersections* ) = { | 264 SkIntersections* ) = { |
265 NULL, | 265 nullptr, |
266 line_intersect_ray, | 266 line_intersect_ray, |
267 quad_intersect_ray, | 267 quad_intersect_ray, |
268 conic_intersect_ray, | 268 conic_intersect_ray, |
269 cubic_intersect_ray | 269 cubic_intersect_ray |
270 }; | 270 }; |
271 | 271 |
272 static int line_intercept_h(const SkPoint a[2], SkScalar , SkScalar y, double* r
oots) { | 272 static int line_intercept_h(const SkPoint a[2], SkScalar , SkScalar y, double* r
oots) { |
273 SkDLine line; | 273 SkDLine line; |
274 roots[0] = SkIntersections::HorizontalIntercept(line.set(a), y); | 274 roots[0] = SkIntersections::HorizontalIntercept(line.set(a), y); |
275 return between(0, roots[0], 1); | 275 return between(0, roots[0], 1); |
(...skipping 29 matching lines...) Expand all Loading... |
305 SkDCubic cubic; | 305 SkDCubic cubic; |
306 return cubic.set(a).horizontalIntersect(y, roots); | 306 return cubic.set(a).horizontalIntersect(y, roots); |
307 } | 307 } |
308 | 308 |
309 static int cubic_intercept_v(const SkPoint a[3], SkScalar , SkScalar x, double*
roots) { | 309 static int cubic_intercept_v(const SkPoint a[3], SkScalar , SkScalar x, double*
roots) { |
310 SkDCubic cubic; | 310 SkDCubic cubic; |
311 return cubic.set(a).verticalIntersect(x, roots); | 311 return cubic.set(a).verticalIntersect(x, roots); |
312 } | 312 } |
313 | 313 |
314 static int (* const CurveIntercept[])(const SkPoint[] , SkScalar , SkScalar , do
uble* ) = { | 314 static int (* const CurveIntercept[])(const SkPoint[] , SkScalar , SkScalar , do
uble* ) = { |
315 NULL, | 315 nullptr, |
316 NULL, | 316 nullptr, |
317 line_intercept_h, | 317 line_intercept_h, |
318 line_intercept_v, | 318 line_intercept_v, |
319 quad_intercept_h, | 319 quad_intercept_h, |
320 quad_intercept_v, | 320 quad_intercept_v, |
321 conic_intercept_h, | 321 conic_intercept_h, |
322 conic_intercept_v, | 322 conic_intercept_v, |
323 cubic_intercept_h, | 323 cubic_intercept_h, |
324 cubic_intercept_v, | 324 cubic_intercept_v, |
325 }; | 325 }; |
326 | 326 |
327 #endif | 327 #endif |
OLD | NEW |