| 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 |