Index: src/core/SkGeometry.cpp |
diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp |
index b4d12dbfa42e902eb18179da19b9c7717d5c28b3..063c7822b25c221c58df7fa98068b816d01a136d 100644 |
--- a/src/core/SkGeometry.cpp |
+++ b/src/core/SkGeometry.cpp |
@@ -114,17 +114,10 @@ static SkScalar eval_quad_derivative(const SkScalar src[], SkScalar t) { |
return 2 * SkScalarMulAdd(A, t, B); |
} |
-static SkScalar eval_quad_derivative_at_half(const SkScalar src[]) { |
- SkScalar A = src[4] - 2 * src[2] + src[0]; |
- SkScalar B = src[2] - src[0]; |
- return A + 2 * B; |
-} |
- |
-void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, |
- SkVector* tangent) { |
+void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tangent) { |
SkASSERT(src); |
SkASSERT(t >= 0 && t <= SK_Scalar1); |
- |
+ |
if (pt) { |
pt->set(eval_quad(&src[0].fX, t), eval_quad(&src[0].fY, t)); |
} |
@@ -134,20 +127,25 @@ void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, |
} |
} |
-void SkEvalQuadAtHalf(const SkPoint src[3], SkPoint* pt, SkVector* tangent) { |
+#include "Sk4x.h" |
+ |
+SkPoint SkEvalQuadAt(const SkPoint src[3], SkScalar t) { |
SkASSERT(src); |
+ SkASSERT(t >= 0 && t <= SK_Scalar1); |
- if (pt) { |
- SkScalar x01 = SkScalarAve(src[0].fX, src[1].fX); |
- SkScalar y01 = SkScalarAve(src[0].fY, src[1].fY); |
- SkScalar x12 = SkScalarAve(src[1].fX, src[2].fX); |
- SkScalar y12 = SkScalarAve(src[1].fY, src[2].fY); |
- pt->set(SkScalarAve(x01, x12), SkScalarAve(y01, y12)); |
- } |
- if (tangent) { |
- tangent->set(eval_quad_derivative_at_half(&src[0].fX), |
- eval_quad_derivative_at_half(&src[0].fY)); |
- } |
+ const Sk4f t2(t); |
+ const Sk4f two(2); |
+ |
+ Sk4f P0 = Sk4f::Load2(&src[0].fX); |
+ Sk4f P1 = Sk4f::Load2(&src[1].fX); |
+ Sk4f P2 = Sk4f::Load2(&src[2].fX); |
+ |
+ Sk4f A = P2.subtract(P1.multiply(two)).add(P0); |
+ Sk4f B = P1.subtract(P0).multiply(two); |
+ |
+ SkPoint result; |
+ A.multiply(t2).add(B).multiply(t2).add(P0).store2(&result.fX); |
+ return result; |
} |
static void interp_quad_coords(const SkScalar* src, SkScalar* dst, SkScalar t) { |