diff options
author | Herb Derby <herb@google.com> | 2017-04-10 10:52:34 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-04-10 15:39:47 +0000 |
commit | 7b4202de0e818024fb5c5d9535ebbacec0e186c1 (patch) | |
tree | 16ece4cf890cd0bfbaf60bae2e907744e779ef29 /src/opts | |
parent | d61c9d93b126dca0af17eff89be8536944dadf81 (diff) |
Add multi-stop SkJumper stage.
CQ_INCLUDE_TRYBOTS=skia.primary:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD
Change-Id: I954d02638a785bec284d2fdf8f46abfccd474e7a
Reviewed-on: https://skia-review.googlesource.com/10211
Commit-Queue: Herb Derby <herb@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Reviewed-by: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'src/opts')
-rw-r--r-- | src/opts/SkRasterPipeline_opts.h | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/opts/SkRasterPipeline_opts.h b/src/opts/SkRasterPipeline_opts.h index 3310990186..aff746dbe7 100644 --- a/src/opts/SkRasterPipeline_opts.h +++ b/src/opts/SkRasterPipeline_opts.h @@ -1101,10 +1101,38 @@ STAGE_CTX(gather_f16, const SkImageShaderContext*) { from_f16(&px, &r, &g, &b, &a); } +STAGE_CTX(linear_gradient, const SkPM4f*) { + struct Stop { float pos; float f[4], b[4]; }; + struct Ctx { size_t n; Stop *stops; float start[4]; }; + + auto c = (const Ctx*)ctx; + Sk4f fr = 0, fg = 0, fb = 0, fa = 0; + Sk4f br = c->start[0], + bg = c->start[1], + bb = c->start[2], + ba = c->start[3]; + auto t = r; + for (size_t i = 0; i < c->n; i++) { + fr = (t < c->stops[i].pos).thenElse(fr, c->stops[i].f[0]); + fg = (t < c->stops[i].pos).thenElse(fg, c->stops[i].f[1]); + fb = (t < c->stops[i].pos).thenElse(fb, c->stops[i].f[2]); + fa = (t < c->stops[i].pos).thenElse(fa, c->stops[i].f[3]); + br = (t < c->stops[i].pos).thenElse(br, c->stops[i].b[0]); + bg = (t < c->stops[i].pos).thenElse(bg, c->stops[i].b[1]); + bb = (t < c->stops[i].pos).thenElse(bb, c->stops[i].b[2]); + ba = (t < c->stops[i].pos).thenElse(ba, c->stops[i].b[3]); + } + + r = SkNf_fma(t, fr, br); + g = SkNf_fma(t, fg, bg); + b = SkNf_fma(t, fb, bb); + a = SkNf_fma(t, fa, ba); +} + STAGE_CTX(linear_gradient_2stops, const SkPM4f*) { auto t = r; SkPM4f c0 = ctx[0], - dc = ctx[1]; + dc = ctx[1]; r = SkNf_fma(t, dc.r(), c0.r()); g = SkNf_fma(t, dc.g(), c0.g()); |