diff options
author | Mike Reed <reed@google.com> | 2017-05-12 13:07:46 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-05-12 17:49:22 +0000 |
commit | 273eeade448d9bd02a8da508c1fa88a9fbeec42e (patch) | |
tree | 9f109b9a7b5193ad384edb96265f3c0f2ab70bae /src/core/SkComposeShader.cpp | |
parent | 08aa88d280732386f4c56cbce6ae15f638805a1b (diff) |
implement 4f for composeshader
Bug: skia:
Change-Id: I7ad0077345f7589528c89cd84d252539a1df6614
Reviewed-on: https://skia-review.googlesource.com/16703
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'src/core/SkComposeShader.cpp')
-rw-r--r-- | src/core/SkComposeShader.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/core/SkComposeShader.cpp b/src/core/SkComposeShader.cpp index 9cb16addc6..ee0fe10c77 100644 --- a/src/core/SkComposeShader.cpp +++ b/src/core/SkComposeShader.cpp @@ -182,6 +182,36 @@ void SkComposeShader::ComposeShaderContext::shadeSpan(int x, int y, SkPMColor re } } +void SkComposeShader::ComposeShaderContext::shadeSpan4f(int x, int y, SkPM4f result[], int count) { + SkShader::Context* shaderContextA = fShaderContextA; + SkShader::Context* shaderContextB = fShaderContextB; + SkBlendMode mode = static_cast<const SkComposeShader&>(fShader).fMode; + unsigned alpha = this->getPaintAlpha(); + Sk4f scale(alpha * (1.0f / 255)); + + SkPM4f tmp[TMP_COLOR_COUNT]; + + SkXfermodeProc4f xfer = SkXfermode::GetProc4f(mode); + do { + int n = SkTMin(count, TMP_COLOR_COUNT); + + shaderContextA->shadeSpan4f(x, y, result, n); + shaderContextB->shadeSpan4f(x, y, tmp, n); + if (255 == alpha) { + for (int i = 0; i < n; ++i) { + result[i] = xfer(tmp[i], result[i]); + } + } else { + for (int i = 0; i < n; ++i) { + (xfer(tmp[i], result[i]).to4f() * scale).store(result + i); + } + } + result += n; + x += n; + count -= n; + } while (count > 0); +} + #if SK_SUPPORT_GPU #include "effects/GrConstColorProcessor.h" |