aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkComposeShader.cpp
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-05-12 13:07:46 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-12 17:49:22 +0000
commit273eeade448d9bd02a8da508c1fa88a9fbeec42e (patch)
tree9f109b9a7b5193ad384edb96265f3c0f2ab70bae /src/core/SkComposeShader.cpp
parent08aa88d280732386f4c56cbce6ae15f638805a1b (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.cpp30
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"