diff options
-rw-r--r-- | src/effects/SkArithmeticMode.cpp | 84 |
1 files changed, 29 insertions, 55 deletions
diff --git a/src/effects/SkArithmeticMode.cpp b/src/effects/SkArithmeticMode.cpp index fbe6358ae4..e926f1bc9a 100644 --- a/src/effects/SkArithmeticMode.cpp +++ b/src/effects/SkArithmeticMode.cpp @@ -7,10 +7,11 @@ #include "SkArithmeticMode.h" #include "SkColorPriv.h" +#include "SkNx.h" #include "SkReadBuffer.h" -#include "SkWriteBuffer.h" #include "SkString.h" #include "SkUnPreMultiply.h" +#include "SkWriteBuffer.h" #if SK_SUPPORT_GPU #include "SkArithmeticMode_gpu.h" #endif @@ -63,64 +64,37 @@ sk_sp<SkFlattenable> SkArithmeticMode_scalar::CreateProc(SkReadBuffer& buffer) { return SkArithmeticMode::Make(k1, k2, k3, k4, enforcePMColor); } -static int pinToByte(int value) { - if (value < 0) { - value = 0; - } else if (value > 255) { - value = 255; - } - return value; -} +void SkArithmeticMode_scalar::xfer32(SkPMColor dst[], const SkPMColor src[], + int count, const SkAlpha aaCoverage[]) const { + const Sk4f k1 = fK[0] * (1/255.0f), + k2 = fK[1], + k3 = fK[2], + k4 = fK[3] * 255.0f + 0.5f; + + auto pin = [](float min, const Sk4f& val, float max) { + return Sk4f::Max(min, Sk4f::Min(val, max)); + }; + + for (int i = 0; i < count; i++) { + if (aaCoverage && aaCoverage[i] == 0) { + continue; + } -static int arith(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4, - int src, int dst) { - SkScalar result = SkScalarMul(k1, src * dst) + - SkScalarMul(k2, src) + - SkScalarMul(k3, dst) + - k4; - int res = SkScalarRoundToInt(result); - return pinToByte(res); -} + Sk4f s = SkNx_cast<float>(Sk4b::Load(src+i)), + d = SkNx_cast<float>(Sk4b::Load(dst+i)), + r = pin(0, k1*s*d + k2*s + k3*d + k4, 255); -static int blend(int src, int dst, int scale) { - return dst + ((src - dst) * scale >> 8); -} + if (fEnforcePMColor) { + Sk4f a = SkNx_shuffle<3,3,3,3>(r); + r = Sk4f::Min(a, r); + } -void SkArithmeticMode_scalar::xfer32(SkPMColor dst[], const SkPMColor src[], - int count, const SkAlpha aaCoverage[]) const { - SkScalar k1 = fK[0] / 255; - SkScalar k2 = fK[1]; - SkScalar k3 = fK[2]; - SkScalar k4 = fK[3] * 255; - - for (int i = 0; i < count; ++i) { - if ((nullptr == aaCoverage) || aaCoverage[i]) { - SkPMColor sc = src[i]; - SkPMColor dc = dst[i]; - - int a, r, g, b; - - a = arith(k1, k2, k3, k4, SkGetPackedA32(sc), SkGetPackedA32(dc)); - r = arith(k1, k2, k3, k4, SkGetPackedR32(sc), SkGetPackedR32(dc)); - g = arith(k1, k2, k3, k4, SkGetPackedG32(sc), SkGetPackedG32(dc)); - b = arith(k1, k2, k3, k4, SkGetPackedB32(sc), SkGetPackedB32(dc)); - if (fEnforcePMColor) { - r = SkMin32(r, a); - g = SkMin32(g, a); - b = SkMin32(b, a); - } - - // apply antialias coverage if necessary - if (aaCoverage && 0xFF != aaCoverage[i]) { - int scale = aaCoverage[i] + (aaCoverage[i] >> 7); - a = blend(a, SkGetPackedA32(sc), scale); - r = blend(r, SkGetPackedR32(sc), scale); - g = blend(g, SkGetPackedG32(sc), scale); - b = blend(b, SkGetPackedB32(sc), scale); - } - - dst[i] = fEnforcePMColor ? SkPackARGB32(a, r, g, b) : SkPackARGB32NoCheck(a, r, g, b); + if (aaCoverage && aaCoverage[i] != 255) { + Sk4f c = aaCoverage[i] * (1/255.0f); + r = d + (r-d)*c; } + + SkNx_cast<uint8_t>(r).store(dst+i); } } |