aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-05-04 23:40:01 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-06 01:27:34 +0000
commit4c6e4103a246c27bdd1302a9c7fba64367758dcc (patch)
treef05a5b72d11ed57e95454f870e1f17efa77b6c72 /src
parent7633477b649c36dd2a03c21d799f66193a341182 (diff)
impl 4f version for tricolor shader
Bug: skia: Change-Id: I43f456aa115ce71a5d1acd9bc94984248a88319a Reviewed-on: https://skia-review.googlesource.com/15540 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/core/SkDraw.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp
index c3a5b3f8be..707c3a6a1c 100644
--- a/src/core/SkDraw.cpp
+++ b/src/core/SkDraw.cpp
@@ -1696,6 +1696,7 @@ public:
TriColorShaderContext(const SkTriColorShader& shader, const ContextRec&);
~TriColorShaderContext() override;
void shadeSpan(int x, int y, SkPMColor dstC[], int count) override;
+ void shadeSpan4f(int x, int y, SkPM4f dstC[], int count) override;
private:
bool setup(const SkPoint pts[], const SkColor colors[], int, int, int);
@@ -1704,6 +1705,7 @@ public:
SkPMColor fColors[3];
bool fSetup;
+ SkPM4f fC0, fC10, fC20, fDC;
typedef SkShader::Context INHERITED;
};
@@ -1765,6 +1767,22 @@ bool SkTriColorShader::TriColorShaderContext::setup(const SkPoint pts[], const S
}
// TODO replace INV(m) * INV(ctm) with INV(ctm * m)
fDstToUnit.setConcat(im, ctmInv);
+
+ fC0 = SkPM4f::FromPMColor(fColors[0]);
+
+ Sk4f alpha(this->getPaintAlpha() * (1.0f / 255)),
+ c0 = fC0.to4f() * alpha,
+ c1 = SkPM4f::FromPMColor(fColors[1]).to4f() * alpha,
+ c2 = SkPM4f::FromPMColor(fColors[2]).to4f() * alpha,
+ dx(fDstToUnit.getScaleX()),
+ dy(fDstToUnit.getSkewY());
+
+ Sk4f c10 = c1 - c0,
+ c20 = c2 - c0;
+
+ fDC = SkPM4f::From4f(dx * c10 + dy * c20);
+ fC10 = SkPM4f::From4f(c10);
+ fC20 = SkPM4f::From4f(c20);
return true;
}
@@ -1831,6 +1849,30 @@ void SkTriColorShader::TriColorShaderContext::shadeSpan(int x, int y, SkPMColor
}
}
+void SkTriColorShader::TriColorShaderContext::shadeSpan4f(int x, int y, SkPM4f dstC[], int count) {
+ SkTriColorShader* parent = static_cast<SkTriColorShader*>(const_cast<SkShader*>(&fShader));
+ TriColorShaderData* set = parent->takeSetupData();
+ if (set) {
+ fSetup = setup(set->pts, set->colors, set->state->f0, set->state->f1, set->state->f2);
+ }
+
+ if (!fSetup) {
+ // Invalid matrices. Not checked before so no need to assert.
+ return;
+ }
+
+ SkPoint src;
+ fDstToUnit.mapXY(SkIntToScalar(x) + 0.5, SkIntToScalar(y) + 0.5, &src);
+
+ Sk4f c = fC0.to4f() + src.fX * fC10.to4f() + src.fY * fC20.to4f(),
+ dc = fDC.to4f();
+
+ for (int i = 0; i < count; i++) {
+ c.store(dstC[i].fVec);
+ c += dc;
+ }
+}
+
#ifndef SK_IGNORE_TO_STRING
void SkTriColorShader::toString(SkString* str) const {
str->append("SkTriColorShader: (");