aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkBlitMask_D32.cpp
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-11-30 14:29:55 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-11-30 14:29:55 +0000
commitfb82300d1b41f21d1d154847b6bf3fb73d5b6f81 (patch)
tree2c5c35679966ef6de7555349dd902bab509cdff7 /src/core/SkBlitMask_D32.cpp
parentfb30951cd9346a7a2d36e7d5f81f9e7ee792b669 (diff)
enable shadermask optimization all the time
update gm for shadermask fix bugs in lcd_blend math git-svn-id: http://skia.googlecode.com/svn/trunk@2761 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkBlitMask_D32.cpp')
-rw-r--r--src/core/SkBlitMask_D32.cpp32
1 files changed, 18 insertions, 14 deletions
diff --git a/src/core/SkBlitMask_D32.cpp b/src/core/SkBlitMask_D32.cpp
index 1a006e5e1f..72a83ee2eb 100644
--- a/src/core/SkBlitMask_D32.cpp
+++ b/src/core/SkBlitMask_D32.cpp
@@ -552,6 +552,14 @@ static void LCD16_RowProc_Opaque(SkPMColor* SK_RESTRICT dst,
}
}
+static int mul(int a, int b) {
+ return a * b >> 8;
+}
+
+static int src_alpha_blend(int src, int dst, int srcA, int mask) {
+ return dst + mul(src - mul(srcA, dst), mask);
+}
+
static void LCD32_RowProc_Blend(SkPMColor* SK_RESTRICT dst,
const SkPMColor* SK_RESTRICT mask,
const SkPMColor* SK_RESTRICT src, int count) {
@@ -564,7 +572,7 @@ static void LCD32_RowProc_Blend(SkPMColor* SK_RESTRICT dst,
SkPMColor s = src[i];
int srcA = SkGetPackedA32(s);
int srcR = SkGetPackedR32(s);
- int srcG = SkGetPackedB32(s);
+ int srcG = SkGetPackedG32(s);
int srcB = SkGetPackedB32(s);
srcA = SkAlpha255To256(srcA);
@@ -575,15 +583,11 @@ static void LCD32_RowProc_Blend(SkPMColor* SK_RESTRICT dst,
int maskG = SkGetPackedG32(m);
int maskB = SkGetPackedB32(m);
- // Now upscale them to 0..256, so we can use SkAlphaBlend
+ // Now upscale them to 0..256
maskR = SkAlpha255To256(maskR);
maskG = SkAlpha255To256(maskG);
maskB = SkAlpha255To256(maskB);
-
- maskR = maskR * srcA >> 8;
- maskG = maskG * srcA >> 8;
- maskB = maskB * srcA >> 8;
-
+
int dstR = SkGetPackedR32(d);
int dstG = SkGetPackedG32(d);
int dstB = SkGetPackedB32(d);
@@ -591,9 +595,9 @@ static void LCD32_RowProc_Blend(SkPMColor* SK_RESTRICT dst,
// LCD blitting is only supported if the dst is known/required
// to be opaque
dst[i] = SkPackARGB32(0xFF,
- SkAlphaBlend(srcR, dstR, maskR),
- SkAlphaBlend(srcG, dstG, maskG),
- SkAlphaBlend(srcB, dstB, maskB));
+ src_alpha_blend(srcR, dstR, srcA, maskR),
+ src_alpha_blend(srcG, dstG, srcA, maskG),
+ src_alpha_blend(srcB, dstB, srcA, maskB));
}
}
@@ -612,9 +616,11 @@ static void LCD32_RowProc_Opaque(SkPMColor* SK_RESTRICT dst,
int maskR = SkGetPackedR32(m);
int maskG = SkGetPackedG32(m);
int maskB = SkGetPackedB32(m);
+
int srcR = SkGetPackedR32(s);
- int srcG = SkGetPackedB32(s);
- int srcB = SkGetPackedB32(s);
+ int srcG = SkGetPackedG32(s);
+ int srcB = SkGetPackedB32(s);
+
int dstR = SkGetPackedR32(d);
int dstG = SkGetPackedG32(d);
int dstB = SkGetPackedB32(d);
@@ -637,7 +643,6 @@ SkBlitMask::RowProc SkBlitMask::RowFactory(SkBitmap::Config config,
SkMask::Format format,
RowFlags flags) {
// make this opt-in until chrome can rebaseline
-#ifdef SK_ENABLE_FAST_SHADERMASK
RowProc proc = PlatformRowProcs(config, format, flags);
if (proc) {
return proc;
@@ -670,7 +675,6 @@ SkBlitMask::RowProc SkBlitMask::RowFactory(SkBitmap::Config config,
default:
break;
}
-#endif
return NULL;
}