Chromium Code Reviews| Index: src/core/SkGeometry.cpp |
| diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp |
| index 6afd9d7ffb0ed1478b6afd0062a76ce93f2db02a..e35bc8cb3ddfd1384a27275a9837c8f6ade94a03 100644 |
| --- a/src/core/SkGeometry.cpp |
| +++ b/src/core/SkGeometry.cpp |
| @@ -157,8 +157,12 @@ void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tange |
| pt->set(eval_quad(&src[0].fX, t), eval_quad(&src[0].fY, t)); |
| } |
| 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.
|
| - tangent->set(eval_quad_derivative(&src[0].fX, t), |
| - eval_quad_derivative(&src[0].fY, t)); |
| + if ((t == 0 && src[0] == src[1]) || (t == 1 && src[1] == src[2])) { |
| + *tangent = src[2] - src[0]; |
| + } else { |
| + tangent->set(eval_quad_derivative(&src[0].fX, t), |
| + eval_quad_derivative(&src[0].fY, t)); |
| + } |
| } |
| } |
| @@ -398,8 +402,19 @@ void SkEvalCubicAt(const SkPoint src[4], SkScalar t, SkPoint* loc, |
| loc->set(eval_cubic(&src[0].fX, t), eval_cubic(&src[0].fY, t)); |
| } |
| if (tangent) { |
| - tangent->set(eval_cubic_derivative(&src[0].fX, t), |
| - eval_cubic_derivative(&src[0].fY, t)); |
| + if ((t == 0 && src[0] == src[1]) || (t == 1 && src[2] == src[3])) { |
| + if (t == 0) { |
| + *tangent = src[2] - src[0]; |
| + } else { |
| + *tangent = src[3] - src[1]; |
| + } |
| + if (!tangent->fX && !tangent->fY) { |
| + *tangent = src[3] - src[0]; |
| + } |
| + } else { |
| + tangent->set(eval_cubic_derivative(&src[0].fX, t), |
| + eval_cubic_derivative(&src[0].fY, t)); |
| + } |
| } |
| if (curvature) { |
| curvature->set(eval_cubic_2ndDerivative(&src[0].fX, t), |
| @@ -1232,8 +1247,12 @@ void SkConic::evalAt(SkScalar t, SkPoint* pt, SkVector* tangent) const { |
| conic_eval_pos(&fPts[0].fY, fW, t)); |
| } |
| if (tangent) { |
| - tangent->set(conic_eval_tan(&fPts[0].fX, fW, t), |
| - conic_eval_tan(&fPts[0].fY, fW, t)); |
| + if ((t == 0 && fPts[0] == fPts[1]) || (t == 1 && fPts[1] == fPts[2])) { |
| + *tangent = fPts[2] - fPts[0]; |
| + } else { |
| + tangent->set(conic_eval_tan(&fPts[0].fX, fW, t), |
| + conic_eval_tan(&fPts[0].fY, fW, t)); |
| + } |
| } |
| } |