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 |