aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/effects/SkArithmeticMode.cpp84
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);
}
}