diff options
author | 2015-04-15 13:13:48 -0700 | |
---|---|---|
committer | 2015-04-15 13:13:48 -0700 | |
commit | a0246165eab9018d07afc09ff826ea4c40898ebc (patch) | |
tree | 1bb6a4ddd84871e812d7159c2d741373accc9dce /src/core/SkGeometry.cpp | |
parent | 00b7e5eb973a1b1e4d1affa74fc0341e8c41e3da (diff) |
Speeup hairline curves (quads and cubics)
/skia/trunk> cat ../old.txt
maxrss loops min median mean max stddev samples config bench
9M 1 4.28ms 4.32ms 4.36ms 4.67ms 3% ▄▁▁▃▂▂▁▁▂█ 8888 path_hairline_small_AA_cubic
9M 1 743µs 767µs 770µs 825µs 4% ▃▃▇▃▁▁▅▁█▁ 8888 path_hairline_small_AA_conic
9M 1 533µs 606µs 598µs 680µs 9% ▁▂▂█▆▇▇▄▂▂ 8888 path_hairline_small_AA_quad
9M 1 451µs 452µs 456µs 495µs 3% ▁▁▁▁█▁▁▁▁▁ 8888 path_hairline_small_AA_line
/skia/trunk> cat ../new.txt
maxrss loops min median mean max stddev samples config bench
9M 1 827µs 827µs 831µs 869µs 2% ▁▁▁▁▁▁▁█▁▁ 8888 path_hairline_small_AA_cubic
9M 1 515µs 517µs 517µs 518µs 0% ▇█▆▅▃▃▁▁▁▅ 8888 path_hairline_small_AA_conic
9M 1 310µs 311µs 315µs 332µs 2% ▂▁█▆▁▁▁▁▁▁ 8888 path_hairline_small_AA_quad
9M 1 254µs 254µs 258µs 276µs 3% ▁▁▁▁▁▁▁█▇▂ 8888 path_hairline_small_AA_line
Edited revert of https://codereview.chromium.org/1085013003
TBR=
Review URL: https://codereview.chromium.org/1078413003
Diffstat (limited to 'src/core/SkGeometry.cpp')
-rw-r--r-- | src/core/SkGeometry.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp index 50af22de37..5979615425 100644 --- a/src/core/SkGeometry.cpp +++ b/src/core/SkGeometry.cpp @@ -9,6 +9,7 @@ #include "SkMatrix.h" #include "SkNx.h" +#if 0 static Sk2s from_point(const SkPoint& point) { return Sk2s::Load(&point.fX); } @@ -18,6 +19,7 @@ static SkPoint to_point(const Sk2s& x) { x.store(&point.fX); return point; } +#endif static SkVector to_vector(const Sk2s& x) { SkVector vector; @@ -135,6 +137,18 @@ static SkScalar eval_quad_derivative(const SkScalar src[], SkScalar t) { return 2 * SkScalarMulAdd(A, t, B); } +void SkQuadToCoeff(const SkPoint pts[3], SkPoint coeff[3]) { + Sk2s p0 = from_point(pts[0]); + Sk2s p1 = from_point(pts[1]); + Sk2s p2 = from_point(pts[2]); + + Sk2s p1minus2 = p1 - p0; + + coeff[0] = to_point(p2 - p1 - p1 + p0); // A * t^2 + coeff[1] = to_point(p1minus2 + p1minus2); // B * t + coeff[2] = pts[0]; // C +} + void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tangent) { SkASSERT(src); SkASSERT(t >= 0 && t <= SK_Scalar1); @@ -452,6 +466,26 @@ void SkChopCubicAt(const SkPoint src[4], SkPoint dst[7], SkScalar t) { dst[6] = src[3]; } +void SkCubicToCoeff(const SkPoint pts[4], SkPoint coeff[4]) { + Sk2s p0 = from_point(pts[0]); + Sk2s p1 = from_point(pts[1]); + Sk2s p2 = from_point(pts[2]); + Sk2s p3 = from_point(pts[3]); + + const Sk2s three(3); + Sk2s p1minusp2 = p1 - p2; + + Sk2s D = p0; + Sk2s A = p3 + three * p1minusp2 - D; + Sk2s B = three * (D - p1minusp2 - p1); + Sk2s C = three * (p1 - D); + + coeff[0] = to_point(A); + coeff[1] = to_point(B); + coeff[2] = to_point(C); + coeff[3] = to_point(D); +} + /* http://code.google.com/p/skia/issues/detail?id=32 This test code would fail when we didn't check the return result of |