Chromium Code Reviews| 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 "SkNx.h" | 10 #include "SkNx.h" |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 149 coeff[2] = pts[0]; // C | 149 coeff[2] = pts[0]; // C |
| 150 } | 150 } |
| 151 | 151 |
| 152 void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tange nt) { | 152 void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tange nt) { |
| 153 SkASSERT(src); | 153 SkASSERT(src); |
| 154 SkASSERT(t >= 0 && t <= SK_Scalar1); | 154 SkASSERT(t >= 0 && t <= SK_Scalar1); |
| 155 | 155 |
| 156 if (pt) { | 156 if (pt) { |
| 157 pt->set(eval_quad(&src[0].fX, t), eval_quad(&src[0].fY, t)); | 157 pt->set(eval_quad(&src[0].fX, t), eval_quad(&src[0].fY, t)); |
| 158 } | 158 } |
| 159 if (tangent) { | 159 if (tangent) { |
|
reed1
2015/08/24 20:15:46
// The derivative equation is just 2(b - a +(a - 2
caryclark
2015/08/25 12:04:48
Done.
| |
| 160 tangent->set(eval_quad_derivative(&src[0].fX, t), | 160 if ((t == 0 && src[0] == src[1]) || (t == 1 && src[1] == src[2])) { |
| 161 eval_quad_derivative(&src[0].fY, t)); | 161 *tangent = src[2] - src[0]; |
| 162 } else { | |
| 163 tangent->set(eval_quad_derivative(&src[0].fX, t), | |
| 164 eval_quad_derivative(&src[0].fY, t)); | |
| 165 } | |
| 162 } | 166 } |
| 163 } | 167 } |
| 164 | 168 |
| 165 SkPoint SkEvalQuadAt(const SkPoint src[3], SkScalar t) { | 169 SkPoint SkEvalQuadAt(const SkPoint src[3], SkScalar t) { |
| 166 SkASSERT(src); | 170 SkASSERT(src); |
| 167 SkASSERT(t >= 0 && t <= SK_Scalar1); | 171 SkASSERT(t >= 0 && t <= SK_Scalar1); |
| 168 | 172 |
| 169 const Sk2s t2(t); | 173 const Sk2s t2(t); |
| 170 | 174 |
| 171 Sk2s P0 = from_point(src[0]); | 175 Sk2s P0 = from_point(src[0]); |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 391 | 395 |
| 392 void SkEvalCubicAt(const SkPoint src[4], SkScalar t, SkPoint* loc, | 396 void SkEvalCubicAt(const SkPoint src[4], SkScalar t, SkPoint* loc, |
| 393 SkVector* tangent, SkVector* curvature) { | 397 SkVector* tangent, SkVector* curvature) { |
| 394 SkASSERT(src); | 398 SkASSERT(src); |
| 395 SkASSERT(t >= 0 && t <= SK_Scalar1); | 399 SkASSERT(t >= 0 && t <= SK_Scalar1); |
| 396 | 400 |
| 397 if (loc) { | 401 if (loc) { |
| 398 loc->set(eval_cubic(&src[0].fX, t), eval_cubic(&src[0].fY, t)); | 402 loc->set(eval_cubic(&src[0].fX, t), eval_cubic(&src[0].fY, t)); |
| 399 } | 403 } |
| 400 if (tangent) { | 404 if (tangent) { |
| 401 tangent->set(eval_cubic_derivative(&src[0].fX, t), | 405 if ((t == 0 && src[0] == src[1]) || (t == 1 && src[2] == src[3])) { |
| 402 eval_cubic_derivative(&src[0].fY, t)); | 406 if (t == 0) { |
| 407 *tangent = src[2] - src[0]; | |
| 408 } else { | |
| 409 *tangent = src[3] - src[1]; | |
| 410 } | |
| 411 if (!tangent->fX && !tangent->fY) { | |
| 412 *tangent = src[3] - src[0]; | |
| 413 } | |
| 414 } else { | |
| 415 tangent->set(eval_cubic_derivative(&src[0].fX, t), | |
| 416 eval_cubic_derivative(&src[0].fY, t)); | |
| 417 } | |
| 403 } | 418 } |
| 404 if (curvature) { | 419 if (curvature) { |
| 405 curvature->set(eval_cubic_2ndDerivative(&src[0].fX, t), | 420 curvature->set(eval_cubic_2ndDerivative(&src[0].fX, t), |
| 406 eval_cubic_2ndDerivative(&src[0].fY, t)); | 421 eval_cubic_2ndDerivative(&src[0].fY, t)); |
| 407 } | 422 } |
| 408 } | 423 } |
| 409 | 424 |
| 410 /** Cubic'(t) = At^2 + Bt + C, where | 425 /** Cubic'(t) = At^2 + Bt + C, where |
| 411 A = 3(-a + 3(b - c) + d) | 426 A = 3(-a + 3(b - c) + d) |
| 412 B = 6(a - 2b + c) | 427 B = 6(a - 2b + c) |
| (...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1225 } | 1240 } |
| 1226 | 1241 |
| 1227 void SkConic::evalAt(SkScalar t, SkPoint* pt, SkVector* tangent) const { | 1242 void SkConic::evalAt(SkScalar t, SkPoint* pt, SkVector* tangent) const { |
| 1228 SkASSERT(t >= 0 && t <= SK_Scalar1); | 1243 SkASSERT(t >= 0 && t <= SK_Scalar1); |
| 1229 | 1244 |
| 1230 if (pt) { | 1245 if (pt) { |
| 1231 pt->set(conic_eval_pos(&fPts[0].fX, fW, t), | 1246 pt->set(conic_eval_pos(&fPts[0].fX, fW, t), |
| 1232 conic_eval_pos(&fPts[0].fY, fW, t)); | 1247 conic_eval_pos(&fPts[0].fY, fW, t)); |
| 1233 } | 1248 } |
| 1234 if (tangent) { | 1249 if (tangent) { |
| 1235 tangent->set(conic_eval_tan(&fPts[0].fX, fW, t), | 1250 if ((t == 0 && fPts[0] == fPts[1]) || (t == 1 && fPts[1] == fPts[2])) { |
| 1236 conic_eval_tan(&fPts[0].fY, fW, t)); | 1251 *tangent = fPts[2] - fPts[0]; |
| 1252 } else { | |
| 1253 tangent->set(conic_eval_tan(&fPts[0].fX, fW, t), | |
| 1254 conic_eval_tan(&fPts[0].fY, fW, t)); | |
| 1255 } | |
| 1237 } | 1256 } |
| 1238 } | 1257 } |
| 1239 | 1258 |
| 1240 void SkConic::chopAt(SkScalar t, SkConic dst[2]) const { | 1259 void SkConic::chopAt(SkScalar t, SkConic dst[2]) const { |
| 1241 SkP3D tmp[3], tmp2[3]; | 1260 SkP3D tmp[3], tmp2[3]; |
| 1242 | 1261 |
| 1243 ratquad_mapTo3D(fPts, fW, tmp); | 1262 ratquad_mapTo3D(fPts, fW, tmp); |
| 1244 | 1263 |
| 1245 p3d_interp(&tmp[0].fX, &tmp2[0].fX, t); | 1264 p3d_interp(&tmp[0].fX, &tmp2[0].fX, t); |
| 1246 p3d_interp(&tmp[0].fY, &tmp2[0].fY, t); | 1265 p3d_interp(&tmp[0].fY, &tmp2[0].fY, t); |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1579 matrix.preScale(SK_Scalar1, -SK_Scalar1); | 1598 matrix.preScale(SK_Scalar1, -SK_Scalar1); |
| 1580 } | 1599 } |
| 1581 if (userMatrix) { | 1600 if (userMatrix) { |
| 1582 matrix.postConcat(*userMatrix); | 1601 matrix.postConcat(*userMatrix); |
| 1583 } | 1602 } |
| 1584 for (int i = 0; i < conicCount; ++i) { | 1603 for (int i = 0; i < conicCount; ++i) { |
| 1585 matrix.mapPoints(dst[i].fPts, 3); | 1604 matrix.mapPoints(dst[i].fPts, 3); |
| 1586 } | 1605 } |
| 1587 return conicCount; | 1606 return conicCount; |
| 1588 } | 1607 } |
| OLD | NEW |