OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
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 #include "SkGeometry.h" | 8 #include "SkGeometry.h" |
9 #include "SkMatrix.h" | 9 #include "SkMatrix.h" |
10 #include "Sk2x.h" | 10 #include "Sk2x.h" |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 SkScalar t = SkFindQuadMaxCurvature(src); | 304 SkScalar t = SkFindQuadMaxCurvature(src); |
305 if (t == 0) { | 305 if (t == 0) { |
306 memcpy(dst, src, 3 * sizeof(SkPoint)); | 306 memcpy(dst, src, 3 * sizeof(SkPoint)); |
307 return 1; | 307 return 1; |
308 } else { | 308 } else { |
309 SkChopQuadAt(src, dst, t); | 309 SkChopQuadAt(src, dst, t); |
310 return 2; | 310 return 2; |
311 } | 311 } |
312 } | 312 } |
313 | 313 |
314 #define SK_ScalarTwoThirds (0.666666666f) | 314 void SkConvertQuadToCubic(const SkPoint src[3], SkPoint dst[4]) { |
| 315 Sk2s scale(SkDoubleToScalar(2.0 / 3.0)); |
| 316 Sk2s s0 = from_point(src[0]); |
| 317 Sk2s s1 = from_point(src[1]); |
| 318 Sk2s s2 = from_point(src[2]); |
315 | 319 |
316 void SkConvertQuadToCubic(const SkPoint src[3], SkPoint dst[4]) { | |
317 const SkScalar scale = SK_ScalarTwoThirds; | |
318 dst[0] = src[0]; | 320 dst[0] = src[0]; |
319 dst[1].set(src[0].fX + SkScalarMul(src[1].fX - src[0].fX, scale), | 321 dst[1] = to_point(s0 + (s1 - s0) * scale); |
320 src[0].fY + SkScalarMul(src[1].fY - src[0].fY, scale)); | 322 dst[2] = to_point(s2 + (s1 - s2) * scale); |
321 dst[2].set(src[2].fX + SkScalarMul(src[1].fX - src[2].fX, scale), | |
322 src[2].fY + SkScalarMul(src[1].fY - src[2].fY, scale)); | |
323 dst[3] = src[2]; | 323 dst[3] = src[2]; |
324 } | 324 } |
325 | 325 |
326 ////////////////////////////////////////////////////////////////////////////// | 326 ////////////////////////////////////////////////////////////////////////////// |
327 ///// CUBICS // CUBICS // CUBICS // CUBICS // CUBICS // CUBICS // CUBICS ///// | 327 ///// CUBICS // CUBICS // CUBICS // CUBICS // CUBICS // CUBICS // CUBICS ///// |
328 ////////////////////////////////////////////////////////////////////////////// | 328 ////////////////////////////////////////////////////////////////////////////// |
329 | 329 |
330 static void get_cubic_coeff(const SkScalar pt[], SkScalar coeff[4]) { | 330 static void get_cubic_coeff(const SkScalar pt[], SkScalar coeff[4]) { |
331 coeff[0] = pt[6] + 3*(pt[2] - pt[4]) - pt[0]; | 331 coeff[0] = pt[6] + 3*(pt[2] - pt[4]) - pt[0]; |
332 coeff[1] = 3*(pt[4] - pt[2] - pt[2] + pt[0]); | 332 coeff[1] = 3*(pt[4] - pt[2] - pt[2] + pt[0]); |
(...skipping 921 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1254 Sk2s ww(fW); | 1254 Sk2s ww(fW); |
1255 | 1255 |
1256 Sk2s p20 = p2 - p0; | 1256 Sk2s p20 = p2 - p0; |
1257 Sk2s p10 = p1 - p0; | 1257 Sk2s p10 = p1 - p0; |
1258 | 1258 |
1259 Sk2s C = ww * p10; | 1259 Sk2s C = ww * p10; |
1260 Sk2s A = ww * p20 - p20; | 1260 Sk2s A = ww * p20 - p20; |
1261 Sk2s B = p20 - C - C; | 1261 Sk2s B = p20 - C - C; |
1262 | 1262 |
1263 return to_vector(quad_poly_eval(A, B, C, Sk2s(t))); | 1263 return to_vector(quad_poly_eval(A, B, C, Sk2s(t))); |
1264 #if 0 | |
1265 static void conic_deriv_coeff(const SkScalar src[], | |
1266 SkScalar w, | |
1267 SkScalar coeff[3]) { | |
1268 const SkScalar P20 = src[4] - src[0]; | |
1269 const SkScalar P10 = src[2] - src[0]; | |
1270 const SkScalar wP10 = w * P10; | |
1271 coeff[0] = w * P20 - P20; | |
1272 coeff[1] = P20 - 2 * wP10; | |
1273 coeff[2] = wP10; | |
1274 } | |
1275 | |
1276 static SkScalar conic_eval_tan(const SkScalar coord[], SkScalar w, SkScalar
t) { | |
1277 SkScalar coeff[3]; | |
1278 conic_deriv_coeff(coord, w, coeff); | |
1279 return t * (t * coeff[0] + coeff[1]) + coeff[2]; | |
1280 } | |
1281 #endif | |
1282 } | 1264 } |
1283 | 1265 |
1284 static SkScalar subdivide_w_value(SkScalar w) { | 1266 static SkScalar subdivide_w_value(SkScalar w) { |
1285 return SkScalarSqrt(SK_ScalarHalf + w * SK_ScalarHalf); | 1267 return SkScalarSqrt(SK_ScalarHalf + w * SK_ScalarHalf); |
1286 } | 1268 } |
1287 | 1269 |
1288 static Sk2s twice(const Sk2s& value) { | 1270 static Sk2s twice(const Sk2s& value) { |
1289 return value + value; | 1271 return value + value; |
1290 } | 1272 } |
1291 | 1273 |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1552 matrix.preScale(SK_Scalar1, -SK_Scalar1); | 1534 matrix.preScale(SK_Scalar1, -SK_Scalar1); |
1553 } | 1535 } |
1554 if (userMatrix) { | 1536 if (userMatrix) { |
1555 matrix.postConcat(*userMatrix); | 1537 matrix.postConcat(*userMatrix); |
1556 } | 1538 } |
1557 for (int i = 0; i < conicCount; ++i) { | 1539 for (int i = 0; i < conicCount; ++i) { |
1558 matrix.mapPoints(dst[i].fPts, 3); | 1540 matrix.mapPoints(dst[i].fPts, 3); |
1559 } | 1541 } |
1560 return conicCount; | 1542 return conicCount; |
1561 } | 1543 } |
OLD | NEW |