diff options
-rw-r--r-- | src/effects/SkArithmeticMode.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/effects/SkArithmeticMode.cpp b/src/effects/SkArithmeticMode.cpp index bf17bb833d..b8aa36853a 100644 --- a/src/effects/SkArithmeticMode.cpp +++ b/src/effects/SkArithmeticMode.cpp @@ -8,6 +8,7 @@ #include "SkArithmeticMode.h" #include "SkColorPriv.h" #include "SkNx.h" +#include "SkRasterPipeline.h" #include "SkReadBuffer.h" #include "SkString.h" #include "SkUnPreMultiply.h" @@ -29,6 +30,11 @@ public: void xfer32(SkPMColor[], const SkPMColor[], int count, const SkAlpha[]) const override; + bool onAppendStages(SkRasterPipeline* p) const override { + p->append(&Stage, this); + return true; + } + SK_TO_STRING_OVERRIDE() SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkArithmeticMode_scalar) @@ -39,6 +45,10 @@ public: #endif private: + static void SK_VECTORCALL Stage(SkRasterPipeline::Stage* st, size_t x, + Sk4f r, Sk4f g, Sk4f b, Sk4f a, + Sk4f dr, Sk4f dg, Sk4f db, Sk4f da); + void flatten(SkWriteBuffer& buffer) const override { buffer.writeScalar(fK[0]); buffer.writeScalar(fK[1]); @@ -64,6 +74,26 @@ sk_sp<SkFlattenable> SkArithmeticMode_scalar::CreateProc(SkReadBuffer& buffer) { return SkArithmeticMode::Make(k1, k2, k3, k4, enforcePMColor); } +void SK_VECTORCALL SkArithmeticMode_scalar::Stage(SkRasterPipeline::Stage* st, size_t x, + Sk4f r, Sk4f g, Sk4f b, Sk4f a, + Sk4f dr, Sk4f dg, Sk4f db, Sk4f da) { + auto self = st->ctx<const SkArithmeticMode_scalar*>(); + + const Sk4f k1 = self->fK[0], + k2 = self->fK[1], + k3 = self->fK[2], + k4 = self->fK[3]; + + r = k1*r*dr + k2*r + k3*dr + k4; + g = k1*g*dg + k2*g + k3*dg + k4; + b = k1*b*db + k2*b + k3*db + k4; + a = k1*a*da + k2*a + k3*da + k4; + + // A later stage (clamp_01_premul) will pin and fEnforcePMColor for us. + + st->next(x, r,g,b,a, dr,dg,db,da); +} + void SkArithmeticMode_scalar::xfer32(SkPMColor dst[], const SkPMColor src[], int count, const SkAlpha aaCoverage[]) const { const Sk4f k1 = fK[0] * (1/255.0f), |