aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/opts
diff options
context:
space:
mode:
authorGravatar Herb Derby <herb@google.com>2017-04-10 10:52:34 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-04-10 15:39:47 +0000
commit7b4202de0e818024fb5c5d9535ebbacec0e186c1 (patch)
tree16ece4cf890cd0bfbaf60bae2e907744e779ef29 /src/opts
parentd61c9d93b126dca0af17eff89be8536944dadf81 (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.h30
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());