Index: src/core/SkBlitter_4444.cpp
diff --git a/src/core/SkBlitter_4444.cpp b/src/core/SkBlitter_4444.cpp
index ec62523c5d81283d3aefd6bfd23cde6df784b217..7579e3c1a078f8901b72bb73c611f23c478cf454 100644
--- a/src/core/SkBlitter_4444.cpp
+++ b/src/core/SkBlitter_4444.cpp
@@ -20,11 +20,11 @@ static inline SkPMColor SkBlendARGB4444(SkPMColor16 src, SkPMColor16 dst,
SkASSERT((unsigned)aa <= 255);
unsigned src_scale = SkAlpha255To256(aa) >> 4;
- unsigned dst_scale = SkAlpha15To16(15 - SkAlphaMul4(SkGetPackedA4444(src), src_scale));
+ unsigned dst_scale = SkAlphaToInvScale4(SkAlphaMul4(SkGetPackedA4444(src), src_scale));
uint32_t src32 = SkExpand_4444(src) * src_scale;
uint32_t dst32 = SkExpand_4444(dst) * dst_scale;
- return SkCompact_4444((src32 + dst32) >> 4);
+ return SkCompact_4444((src32 >> 4) + (dst32 >> 4));
}
///////////////////////////////////////////////////////////////////////////////
@@ -44,6 +44,7 @@ protected:
SkPMColor16 fPMColor16, fPMColor16Other;
SkPMColor16 fRawColor16, fRawColor16Other;
uint8_t fScale16;
+ uint8_t fInvScale16;
private:
// illegal
@@ -75,6 +76,7 @@ SkARGB4444_Blitter::SkARGB4444_Blitter(const SkBitmap& device,
}
fScale16 = SkAlpha15To16(SkGetPackedA4444(fPMColor16Other));
+ fInvScale16 = SkAlphaToInvScale4(SkGetPackedA4444(fPMColor16Other));
if (16 == fScale16) {
// force the original to also be opaque
fPMColor16 |= (0xF << SK_A4444_SHIFT);
@@ -103,24 +105,19 @@ static void src_over_4444(SkPMColor16 dst[], SkPMColor16 color,
}
}
-static inline uint32_t SkExpand_4444_Replicate(SkPMColor16 c) {
- uint32_t c32 = SkExpand_4444(c);
- return c32 | (c32 << 4);
-}
-
static void src_over_4444x(SkPMColor16 dst[], uint32_t color,
uint32_t other, unsigned invScale, int count) {
int twice = count >> 1;
uint32_t tmp;
while (--twice >= 0) {
tmp = SkExpand_4444(*dst) * invScale;
- *dst++ = SkCompact_4444((color + tmp) >> 4);
+ *dst++ = SkCompact_4444(color + (tmp >> 4));
tmp = SkExpand_4444(*dst) * invScale;
- *dst++ = SkCompact_4444((other + tmp) >> 4);
+ *dst++ = SkCompact_4444(other + (tmp >> 4));
}
if (count & 1) {
tmp = SkExpand_4444(*dst) * invScale;
- *dst = SkCompact_4444((color + tmp) >> 4);
+ *dst = SkCompact_4444(color + (tmp >> 4));
}
}
@@ -142,9 +139,9 @@ void SkARGB4444_Blitter::blitH(int x, int y, int width) {
if (16 == fScale16) {
sk_dither_memset16(device, color, other, width);
} else {
- src_over_4444x(device, SkExpand_4444_Replicate(color),
- SkExpand_4444_Replicate(other),
- 16 - fScale16, width);
+ src_over_4444x(device, SkExpand_4444(color),
+ SkExpand_4444(color),
+ fInvScale16, width);
}
}
@@ -169,18 +166,18 @@ void SkARGB4444_Blitter::blitV(int x, int y, int height, SkAlpha alpha) {
SkTSwap<SkPMColor16>(color, other);
}
} else {
- unsigned alphaScale = SkAlpha255To256(alpha);
+ unsigned alphaScale = SkAlphaToScale(alpha);
uint32_t c32 = SkExpand_4444(color) * (alphaScale >> 4);
// need to normalize the low nibble of each expanded component
// so we don't overflow the add with d32
c32 = SkCompact_4444(c32 >> 4);
- unsigned invScale = 16 - SkAlpha15To16(SkGetPackedA4444(c32));
+ unsigned invScale = SkAlphaToInvScale4(SkGetPackedA4444(c32));
// now re-expand and replicate
- c32 = SkExpand_4444_Replicate(c32);
+ c32 = SkExpand_4444(c32);
while (--height >= 0) {
uint32_t d32 = SkExpand_4444(*device) * invScale;
- *device = SkCompact_4444((c32 + d32) >> 4);
+ *device = SkCompact_4444(c32 + (d32 >> 4));
device = (SkPMColor16*)((char*)device + rb);
}
}
@@ -209,12 +206,10 @@ void SkARGB4444_Blitter::blitRect(int x, int y, int width, int height) {
SkTSwap<SkPMColor16>(color, other);
}
} else {
- unsigned invScale = 16 - fScale16;
-
- uint32_t c32 = SkExpand_4444_Replicate(color);
- uint32_t o32 = SkExpand_4444_Replicate(other);
+ uint32_t c32 = SkExpand_4444(color);
+ uint32_t o32 = SkExpand_4444(other);
while (--height >= 0) {
- src_over_4444x(device, c32, o32, invScale, width);
+ src_over_4444x(device, c32, o32, fInvScale16, width);
device = (SkPMColor16*)((char*)device + fDevice.rowBytes());
SkTSwap<uint32_t>(c32, o32);
}
@@ -248,7 +243,7 @@ void SkARGB4444_Blitter::blitAntiH(int x, int y, const SkAlpha antialias[],
if (16 == fScale16) {
sk_dither_memset16(device, color, other, count);
} else {
- src_over_4444(device, color, other, 16 - fScale16, count);
+ src_over_4444(device, color, other, fInvScale16, count);
}
} else {
// todo: respect dithering
@@ -324,7 +319,7 @@ void SkARGB4444_Blitter::blitMask(const SkMask& mask, const SkIRect& clip) {
if (16 == fScale16) {
SkARGB4444_BlitBW(fDevice, mask, clip, fPMColor16);
} else {
- SkARGB4444_BlendBW(fDevice, mask, clip, fPMColor16, 16 - fScale16);
+ SkARGB4444_BlendBW(fDevice, mask, clip, fPMColor16, fInvScale16);
}
return;
}