Index: src/effects/SkArithmeticMode.cpp |
diff --git a/src/effects/SkArithmeticMode.cpp b/src/effects/SkArithmeticMode.cpp |
index 3af550bac12c164016bdaad3b2e38b7cf3e5d402..c8e0756517b5b32cc7be3130085e1dace6e7aa86 100644 |
--- a/src/effects/SkArithmeticMode.cpp |
+++ b/src/effects/SkArithmeticMode.cpp |
@@ -15,25 +15,18 @@ |
#include "SkArithmeticMode_gpu.h" |
#endif |
-static const bool gUseUnpremul = false; |
- |
class SkArithmeticMode_scalar : public SkXfermode { |
public: |
- static SkXfermode* Create(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4, |
- bool enforcePMColor) { |
- if (SkScalarNearlyZero(k1) && SkScalarNearlyEqual(k2, SK_Scalar1) && |
- SkScalarNearlyZero(k3) && SkScalarNearlyZero(k4)) { |
- return SkXfermode::Create(SkXfermode::kSrc_Mode); |
- } else if (SkScalarNearlyZero(k1) && SkScalarNearlyZero(k2) && |
- SkScalarNearlyEqual(k3, SK_Scalar1) && SkScalarNearlyZero(k4)) { |
- return SkXfermode::Create(SkXfermode::kDst_Mode); |
- } |
- |
- return new SkArithmeticMode_scalar(k1, k2, k3, k4, enforcePMColor); |
+ SkArithmeticMode_scalar(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4, |
+ bool enforcePMColor) { |
+ fK[0] = k1; |
+ fK[1] = k2; |
+ fK[2] = k3; |
+ fK[3] = k4; |
+ fEnforcePMColor = enforcePMColor; |
} |
- |
- void xfer32(SkPMColor dst[], const SkPMColor src[], int count, |
- const SkAlpha aa[]) const override; |
+ |
+ void xfer32(SkPMColor[], const SkPMColor[], int count, const SkAlpha[]) const override; |
SK_TO_STRING_OVERRIDE() |
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkArithmeticMode_scalar) |
@@ -45,14 +38,6 @@ public: |
#endif |
private: |
- SkArithmeticMode_scalar(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4, bool enforcePMColor) { |
- fK[0] = k1; |
- fK[1] = k2; |
- fK[2] = k3; |
- fK[3] = k4; |
- fEnforcePMColor = enforcePMColor; |
- } |
- |
void flatten(SkWriteBuffer& buffer) const override { |
buffer.writeScalar(fK[0]); |
buffer.writeScalar(fK[1]); |
@@ -75,7 +60,7 @@ SkFlattenable* SkArithmeticMode_scalar::CreateProc(SkReadBuffer& buffer) { |
const SkScalar k3 = buffer.readScalar(); |
const SkScalar k4 = buffer.readScalar(); |
const bool enforcePMColor = buffer.readBool(); |
- return Create(k1, k2, k3, k4, enforcePMColor); |
+ return SkArithmeticMode::Create(k1, k2, k3, k4, enforcePMColor); |
} |
static int pinToByte(int value) { |
@@ -101,10 +86,6 @@ static int blend(int src, int dst, int scale) { |
return dst + ((src - dst) * scale >> 8); |
} |
-static bool needsUnpremul(int alpha) { |
- return 0 != alpha && 0xFF != alpha; |
-} |
- |
void SkArithmeticMode_scalar::xfer32(SkPMColor dst[], const SkPMColor src[], |
int count, const SkAlpha aaCoverage[]) const { |
SkScalar k1 = fK[0] / 255; |
@@ -119,54 +100,14 @@ void SkArithmeticMode_scalar::xfer32(SkPMColor dst[], const SkPMColor src[], |
int a, r, g, b; |
- if (gUseUnpremul) { |
- int sa = SkGetPackedA32(sc); |
- int da = SkGetPackedA32(dc); |
- |
- int srcNeedsUnpremul = needsUnpremul(sa); |
- int dstNeedsUnpremul = needsUnpremul(da); |
- |
- if (!srcNeedsUnpremul && !dstNeedsUnpremul) { |
- a = arith(k1, k2, k3, k4, sa, da); |
- 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)); |
- } else { |
- int sr = SkGetPackedR32(sc); |
- int sg = SkGetPackedG32(sc); |
- int sb = SkGetPackedB32(sc); |
- if (srcNeedsUnpremul) { |
- SkUnPreMultiply::Scale scale = SkUnPreMultiply::GetScale(sa); |
- sr = SkUnPreMultiply::ApplyScale(scale, sr); |
- sg = SkUnPreMultiply::ApplyScale(scale, sg); |
- sb = SkUnPreMultiply::ApplyScale(scale, sb); |
- } |
- |
- int dr = SkGetPackedR32(dc); |
- int dg = SkGetPackedG32(dc); |
- int db = SkGetPackedB32(dc); |
- if (dstNeedsUnpremul) { |
- SkUnPreMultiply::Scale scale = SkUnPreMultiply::GetScale(da); |
- dr = SkUnPreMultiply::ApplyScale(scale, dr); |
- dg = SkUnPreMultiply::ApplyScale(scale, dg); |
- db = SkUnPreMultiply::ApplyScale(scale, db); |
- } |
- |
- a = arith(k1, k2, k3, k4, sa, da); |
- r = arith(k1, k2, k3, k4, sr, dr); |
- g = arith(k1, k2, k3, k4, sg, dg); |
- b = arith(k1, k2, k3, k4, sb, db); |
- } |
- } else { |
- 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); |
- } |
+ 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 |
@@ -178,13 +119,6 @@ void SkArithmeticMode_scalar::xfer32(SkPMColor dst[], const SkPMColor src[], |
b = blend(b, SkGetPackedB32(sc), scale); |
} |
- // turn the result back into premul |
- if (gUseUnpremul && (0xFF != a)) { |
- int scale = a + (a >> 7); |
- r = SkAlphaMul(r, scale); |
- g = SkAlphaMul(g, scale); |
- b = SkAlphaMul(b, scale); |
- } |
dst[i] = fEnforcePMColor ? SkPackARGB32(a, r, g, b) : SkPackARGB32NoCheck(a, r, g, b); |
} |
} |
@@ -203,40 +137,18 @@ void SkArithmeticMode_scalar::toString(SkString* str) const { |
/////////////////////////////////////////////////////////////////////////////// |
-static bool fitsInBits(SkScalar x, int bits) { |
- return SkScalarAbs(x) < (1 << (bits - 1)); |
-} |
- |
-#if 0 // UNUSED |
-static int32_t toDot8(SkScalar x) { |
- return (int32_t)(x * 256); |
-} |
-#endif |
- |
SkXfermode* SkArithmeticMode::Create(SkScalar k1, SkScalar k2, |
SkScalar k3, SkScalar k4, |
bool enforcePMColor) { |
- if (fitsInBits(k1, 8) && fitsInBits(k2, 16) && |
- fitsInBits(k2, 16) && fitsInBits(k2, 24)) { |
- |
-#if 0 // UNUSED |
- int32_t i1 = toDot8(k1); |
- int32_t i2 = toDot8(k2); |
- int32_t i3 = toDot8(k3); |
- int32_t i4 = toDot8(k4); |
- if (i1) { |
- return new SkArithmeticMode_quad (i1, i2, i3, i4); |
- } |
- if (0 == i2) { |
- return new SkArithmeticMode_dst (i3, i4); |
- } |
- if (0 == i3) { |
- return new SkArithmeticMode_src (i2, i4); |
- } |
- return new SkArithmeticMode_linear (i2, i3, i4); |
-#endif |
+ if (SkScalarNearlyZero(k1) && SkScalarNearlyEqual(k2, SK_Scalar1) && |
+ SkScalarNearlyZero(k3) && SkScalarNearlyZero(k4)) { |
+ return SkXfermode::Create(SkXfermode::kSrc_Mode); |
+ } else if (SkScalarNearlyZero(k1) && SkScalarNearlyZero(k2) && |
+ SkScalarNearlyEqual(k3, SK_Scalar1) && SkScalarNearlyZero(k4)) { |
+ return SkXfermode::Create(SkXfermode::kDst_Mode); |
} |
- return SkArithmeticMode_scalar::Create(k1, k2, k3, k4, enforcePMColor); |
+ |
+ return new SkArithmeticMode_scalar(k1, k2, k3, k4, enforcePMColor); |
} |