Index: src/core/SkBlitRow_D32.cpp
diff --git a/src/core/SkBlitRow_D32.cpp b/src/core/SkBlitRow_D32.cpp
index 97aa665cb951fcddbcb55253717950f25f8e5b31..89b2c5dc002da911b10ac65aac2feac8d9308b89 100644
--- a/src/core/SkBlitRow_D32.cpp
+++ b/src/core/SkBlitRow_D32.cpp
@@ -10,6 +10,8 @@
#include "SkColorPriv.h"
#include "SkUtils.h"
+static bool gUsePlatformOptsForFactory = false;
+
#define UNROLL
static void S32_Opaque_BlitRow32(SkPMColor* SK_RESTRICT dst,
@@ -24,8 +26,12 @@ static void S32_Blend_BlitRow32(SkPMColor* SK_RESTRICT dst,
int count, U8CPU alpha) {
SkASSERT(alpha <= 255);
if (count > 0) {
- unsigned src_scale = SkAlpha255To256(alpha);
+ unsigned src_scale = SkAlphaToScale(alpha);
+#ifdef SK_BLEND_CORRECTLY
+ unsigned dst_scale = SkAlphaToInvScale8(alpha);
+#else
unsigned dst_scale = 256 - src_scale;
+#endif
#ifdef UNROLL
if (count & 1) {
@@ -138,7 +144,7 @@ SkBlitRow::Proc32 SkBlitRow::Factory32(unsigned flags) {
flags &= kFlags32_Mask;
SkBlitRow::Proc32 proc = PlatformProcs32(flags);
- if (NULL == proc) {
+ if (NULL == proc || !gUsePlatformOptsForFactory) {
proc = gDefault_Procs32[flags];
}
SkASSERT(proc);
@@ -147,13 +153,18 @@ SkBlitRow::Proc32 SkBlitRow::Factory32(unsigned flags) {
SkBlitRow::Proc32 SkBlitRow::ColorProcFactory() {
SkBlitRow::ColorProc proc = PlatformColorProc();
- if (NULL == proc) {
+ if (NULL == proc || !gUsePlatformOptsForFactory) {
proc = Color32;
}
SkASSERT(proc);
return proc;
}
+void SkBlitRow::UsePlatformOptsForFactory(bool opts)
+{
+ gUsePlatformOptsForFactory = opts;
+}
+
void SkBlitRow::Color32(SkPMColor* SK_RESTRICT dst,
const SkPMColor* SK_RESTRICT src,
int count, SkPMColor color) {
@@ -168,7 +179,11 @@ void SkBlitRow::Color32(SkPMColor* SK_RESTRICT dst,
if (255 == colorA) {
sk_memset32(dst, color, count);
} else {
+#ifdef SK_BLEND_CORRECTLY
+ unsigned scale = SkAlphaToInvScale8(colorA);
+#else
unsigned scale = 256 - SkAlpha255To256(colorA);
+#endif
do {
*dst = color + SkAlphaMulQ(*src, scale);
src += 1;