Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(751)

Unified Diff: src/effects/SkArithmeticMode.cpp

Issue 1902903002: arithmetic mode with Sk4f (Closed) Base URL: https://skia.googlesource.com/skia.git@m50
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/effects/SkArithmeticMode.cpp
diff --git a/src/effects/SkArithmeticMode.cpp b/src/effects/SkArithmeticMode.cpp
index c8e0756517b5b32cc7be3130085e1dace6e7aa86..954f8eb70ace675a389c7ea2be541ea8eaa0b078 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 @@ SkFlattenable* SkArithmeticMode_scalar::CreateProc(SkReadBuffer& buffer) {
return SkArithmeticMode::Create(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);
}
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698