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 #include "SkIntersections.h" | 7 #include "SkIntersections.h" |
8 #include "SkLineParameters.h" | 8 #include "SkLineParameters.h" |
9 #include "SkPathOpsCubic.h" | 9 #include "SkPathOpsCubic.h" |
10 #include "SkPathOpsCurve.h" | 10 #include "SkPathOpsCurve.h" |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 double one_t = 1 - t; | 184 double one_t = 1 - t; |
185 double a = one_t * one_t; | 185 double a = one_t * one_t; |
186 double b = 2 * one_t * t; | 186 double b = 2 * one_t * t; |
187 double c = t * t; | 187 double c = t * t; |
188 SkDPoint result = { a * fPts[0].fX + b * fPts[1].fX + c * fPts[2].fX, | 188 SkDPoint result = { a * fPts[0].fX + b * fPts[1].fX + c * fPts[2].fX, |
189 a * fPts[0].fY + b * fPts[1].fY + c * fPts[2].fY }; | 189 a * fPts[0].fY + b * fPts[1].fY + c * fPts[2].fY }; |
190 return result; | 190 return result; |
191 } | 191 } |
192 | 192 |
193 static double interp_quad_coords(const double* src, double t) { | 193 static double interp_quad_coords(const double* src, double t) { |
| 194 if (0 == t) { |
| 195 return src[0]; |
| 196 } |
| 197 if (1 == t) { |
| 198 return src[4]; |
| 199 } |
194 double ab = SkDInterp(src[0], src[2], t); | 200 double ab = SkDInterp(src[0], src[2], t); |
195 double bc = SkDInterp(src[2], src[4], t); | 201 double bc = SkDInterp(src[2], src[4], t); |
196 double abc = SkDInterp(ab, bc, t); | 202 double abc = SkDInterp(ab, bc, t); |
197 return abc; | 203 return abc; |
198 } | 204 } |
199 | 205 |
200 bool SkDQuad::monotonicInX() const { | 206 bool SkDQuad::monotonicInX() const { |
201 return between(fPts[0].fX, fPts[1].fX, fPts[2].fX); | 207 return between(fPts[0].fX, fPts[1].fX, fPts[2].fX); |
202 } | 208 } |
203 | 209 |
(...skipping 17 matching lines...) Expand all Loading... |
221 _12 = A/2 + B/2 | 227 _12 = A/2 + B/2 |
222 12_ = B/2 + C/2 | 228 12_ = B/2 + C/2 |
223 123 = A/4 + B/2 + C/4 | 229 123 = A/4 + B/2 + C/4 |
224 = D | 230 = D |
225 | 231 |
226 Group the known values on one side: | 232 Group the known values on one side: |
227 | 233 |
228 B = D*2 - A/2 - C/2 | 234 B = D*2 - A/2 - C/2 |
229 */ | 235 */ |
230 | 236 |
231 // OPTIMIZE : special case either or both of t1 = 0, t2 = 1 | 237 // OPTIMIZE? : special case t1 = 1 && t2 = 0 |
232 SkDQuad SkDQuad::subDivide(double t1, double t2) const { | 238 SkDQuad SkDQuad::subDivide(double t1, double t2) const { |
| 239 if (0 == t1 && 1 == t2) { |
| 240 return *this; |
| 241 } |
233 SkDQuad dst; | 242 SkDQuad dst; |
234 double ax = dst[0].fX = interp_quad_coords(&fPts[0].fX, t1); | 243 double ax = dst[0].fX = interp_quad_coords(&fPts[0].fX, t1); |
235 double ay = dst[0].fY = interp_quad_coords(&fPts[0].fY, t1); | 244 double ay = dst[0].fY = interp_quad_coords(&fPts[0].fY, t1); |
236 double dx = interp_quad_coords(&fPts[0].fX, (t1 + t2) / 2); | 245 double dx = interp_quad_coords(&fPts[0].fX, (t1 + t2) / 2); |
237 double dy = interp_quad_coords(&fPts[0].fY, (t1 + t2) / 2); | 246 double dy = interp_quad_coords(&fPts[0].fY, (t1 + t2) / 2); |
238 double cx = dst[2].fX = interp_quad_coords(&fPts[0].fX, t2); | 247 double cx = dst[2].fX = interp_quad_coords(&fPts[0].fX, t2); |
239 double cy = dst[2].fY = interp_quad_coords(&fPts[0].fY, t2); | 248 double cy = dst[2].fY = interp_quad_coords(&fPts[0].fY, t2); |
240 /* bx = */ dst[1].fX = 2 * dx - (ax + cx) / 2; | 249 /* bx = */ dst[1].fX = 2 * dx - (ax + cx) / 2; |
241 /* by = */ dst[1].fY = 2 * dy - (ay + cy) / 2; | 250 /* by = */ dst[1].fY = 2 * dy - (ay + cy) / 2; |
242 return dst; | 251 return dst; |
(...skipping 13 matching lines...) Expand all Loading... |
256 SkDPoint b; | 265 SkDPoint b; |
257 SkDQuad sub = subDivide(t1, t2); | 266 SkDQuad sub = subDivide(t1, t2); |
258 SkDLine b0 = {{a, sub[1] + (a - sub[0])}}; | 267 SkDLine b0 = {{a, sub[1] + (a - sub[0])}}; |
259 SkDLine b1 = {{c, sub[1] + (c - sub[2])}}; | 268 SkDLine b1 = {{c, sub[1] + (c - sub[2])}}; |
260 SkIntersections i; | 269 SkIntersections i; |
261 i.intersectRay(b0, b1); | 270 i.intersectRay(b0, b1); |
262 if (i.used() == 1 && i[0][0] >= 0 && i[1][0] >= 0) { | 271 if (i.used() == 1 && i[0][0] >= 0 && i[1][0] >= 0) { |
263 b = i.pt(0); | 272 b = i.pt(0); |
264 } else { | 273 } else { |
265 SkASSERT(i.used() <= 2); | 274 SkASSERT(i.used() <= 2); |
266 b = SkDPoint::Mid(b0[1], b1[1]); | 275 return SkDPoint::Mid(b0[1], b1[1]); |
267 } | 276 } |
268 if (t1 == 0 || t2 == 0) { | 277 if (t1 == 0 || t2 == 0) { |
269 align(0, &b); | 278 align(0, &b); |
270 } | 279 } |
271 if (t1 == 1 || t2 == 1) { | 280 if (t1 == 1 || t2 == 1) { |
272 align(2, &b); | 281 align(2, &b); |
273 } | 282 } |
274 if (AlmostBequalUlps(b.fX, a.fX)) { | 283 if (AlmostBequalUlps(b.fX, a.fX)) { |
275 b.fX = a.fX; | 284 b.fX = a.fX; |
276 } else if (AlmostBequalUlps(b.fX, c.fX)) { | 285 } else if (AlmostBequalUlps(b.fX, c.fX)) { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 * c = C | 351 * c = C |
343 */ | 352 */ |
344 void SkDQuad::SetABC(const double* quad, double* a, double* b, double* c) { | 353 void SkDQuad::SetABC(const double* quad, double* a, double* b, double* c) { |
345 *a = quad[0]; // a = A | 354 *a = quad[0]; // a = A |
346 *b = 2 * quad[2]; // b = 2*B | 355 *b = 2 * quad[2]; // b = 2*B |
347 *c = quad[4]; // c = C | 356 *c = quad[4]; // c = C |
348 *b -= *c; // b = 2*B - C | 357 *b -= *c; // b = 2*B - C |
349 *a -= *b; // a = A - 2*B + C | 358 *a -= *b; // a = A - 2*B + C |
350 *b -= *c; // b = 2*B - 2*C | 359 *b -= *c; // b = 2*B - 2*C |
351 } | 360 } |
OLD | NEW |