diff options
author | reed <reed@chromium.org> | 2015-03-24 19:24:34 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-03-24 19:24:34 -0700 |
commit | 6b9ef90c029c7c783f156ffd6fb1ba047bec63e0 (patch) | |
tree | 9bcba5ff052d6f6c883d98ba2b516c6db1eff38d /src/core/SkGeometry.cpp | |
parent | f3d53a037db6500efad67f9a05b2ae80ecd648ae (diff) |
SkChopCubicAt2 using Sk2s -- 2x faster
BUG=skia:
TBR=
Review URL: https://codereview.chromium.org/1036753002
Diffstat (limited to 'src/core/SkGeometry.cpp')
-rw-r--r-- | src/core/SkGeometry.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp index 0d64fb5137..62c5903123 100644 --- a/src/core/SkGeometry.cpp +++ b/src/core/SkGeometry.cpp @@ -479,6 +479,31 @@ void SkChopCubicAt(const SkPoint src[4], SkPoint dst[7], SkScalar t) { interp_cubic_coords(&src[0].fY, &dst[0].fY, t); } +void SkChopCubicAt2(const SkPoint src[4], SkPoint dst[7], SkScalar t) { + SkASSERT(t > 0 && t < SK_Scalar1); + + Sk2s p0 = from_point(src[0]); + Sk2s p1 = from_point(src[1]); + Sk2s p2 = from_point(src[2]); + Sk2s p3 = from_point(src[3]); + Sk2s tt(t); + + Sk2s ab = interp(p0, p1, tt); + Sk2s bc = interp(p1, p2, tt); + Sk2s cd = interp(p2, p3, tt); + Sk2s abc = interp(ab, bc, tt); + Sk2s bcd = interp(bc, cd, tt); + Sk2s abcd = interp(abc, bcd, tt); + + dst[0] = src[0]; + dst[1] = to_point(ab); + dst[2] = to_point(abc); + dst[3] = to_point(abcd); + dst[4] = to_point(bcd); + dst[5] = to_point(cd); + dst[6] = src[3]; +} + /* http://code.google.com/p/skia/issues/detail?id=32 This test code would fail when we didn't check the return result of |