Index: src/core/SkBlitter_RGB16.cpp |
diff --git a/src/core/SkBlitter_RGB16.cpp b/src/core/SkBlitter_RGB16.cpp |
index 7c30fb1ee045bb9195fff36d1d98542b6c3ff9c1..4dfa4a2f2d503842e061593693a8b8ec07b5078b 100644 |
--- a/src/core/SkBlitter_RGB16.cpp |
+++ b/src/core/SkBlitter_RGB16.cpp |
@@ -70,6 +70,7 @@ public: |
protected: |
SkPMColor fSrcColor32; |
+ SkPMColor fSrcColors32[8]; |
uint32_t fExpandedRaw16; |
unsigned fScale; |
uint16_t fColor16; // already scaled by fScale |
@@ -77,6 +78,8 @@ protected: |
uint16_t fRawDither16; // unscaled |
SkBool8 fDoDither; |
+ SkBlitRow::Blend32_16_row_Proc blendS32D16Row_Proc; |
+ |
// illegal |
SkRGB16_Blitter& operator=(const SkRGB16_Blitter&); |
@@ -527,6 +530,10 @@ SkRGB16_Blitter::SkRGB16_Blitter(const SkBitmap& device, const SkPaint& paint) |
SkColor color = paint.getColor(); |
fSrcColor32 = SkPreMultiplyColor(color); |
+ for (int count = 0; count < 8; count++) { |
+ fSrcColors32[count] = fSrcColor32; |
+ } |
+ |
fScale = SkAlpha255To256(SkColorGetA(color)); |
int r = SkColorGetR(color); |
@@ -544,6 +551,8 @@ SkRGB16_Blitter::SkRGB16_Blitter(const SkBitmap& device, const SkPaint& paint) |
fColor16 = SkPackRGB16( SkAlphaMul(r, fScale) >> (8 - SK_R16_BITS), |
SkAlphaMul(g, fScale) >> (8 - SK_G16_BITS), |
SkAlphaMul(b, fScale) >> (8 - SK_B16_BITS)); |
+ |
+ blendS32D16Row_Proc = SkBlitRow::Blend32_16_rowProcFactory(); |
} |
const SkBitmap* SkRGB16_Blitter::justAnOpaqueColor(uint32_t* value) { |
@@ -561,10 +570,11 @@ static uint32_t pmcolor_to_expand16(SkPMColor c) { |
return (g << 24) | (r << 13) | (b << 2); |
} |
-static inline void blend32_16_row(SkPMColor src, uint16_t dst[], int count) { |
+static inline void blend32_16_row(const SkPMColor* SK_RESTRICT src, |
+ uint16_t dst[], int count) { |
SkASSERT(count > 0); |
- uint32_t src_expand = pmcolor_to_expand16(src); |
- unsigned scale = SkAlpha255To256(0xFF - SkGetPackedA32(src)) >> 3; |
+ uint32_t src_expand = pmcolor_to_expand16(*src); |
+ unsigned scale = SkAlpha255To256(0xFF - SkGetPackedA32(*src)) >> 3; |
do { |
uint32_t dst_expand = SkExpand_rgb_16(*dst) * scale; |
*dst = SkCompact_rgb_16((src_expand + dst_expand) >> 5); |
@@ -572,13 +582,22 @@ static inline void blend32_16_row(SkPMColor src, uint16_t dst[], int count) { |
} while (--count != 0); |
} |
+SkBlitRow::Blend32_16_row_Proc SkBlitRow::Blend32_16_rowProcFactory() { |
+ SkBlitRow::Blend32_16_row_Proc proc = NULL; |
+ proc = PlatformBlend32_16_rowProc(); |
+ if (proc == NULL) { |
+ proc = blend32_16_row; |
+ } |
+ return proc; |
+}; |
+ |
void SkRGB16_Blitter::blitH(int x, int y, int width) { |
SkASSERT(width > 0); |
SkASSERT(x + width <= fDevice.width()); |
uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); |
// TODO: respect fDoDither |
- blend32_16_row(fSrcColor32, device, width); |
+ blendS32D16Row_Proc(fSrcColors32, device, width); |
} |
void SkRGB16_Blitter::blitAntiH(int x, int y, |
@@ -681,10 +700,9 @@ void SkRGB16_Blitter::blitRect(int x, int y, int width, int height) { |
SkASSERT(x + width <= fDevice.width() && y + height <= fDevice.height()); |
uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); |
size_t deviceRB = fDevice.rowBytes(); |
- SkPMColor src32 = fSrcColor32; |
while (--height >= 0) { |
- blend32_16_row(src32, device, width); |
+ blendS32D16Row_Proc(fSrcColors32, device, width); |
device = (uint16_t*)((char*)device + deviceRB); |
} |
} |