Index: src/core/SkBlitter_RGB16.cpp |
diff --git a/src/core/SkBlitter_RGB16.cpp b/src/core/SkBlitter_RGB16.cpp |
index 6724b12ace423493cbb02871dc3c3307783439fa..8caf90831231fdcc61cd6c166e193a9eab1ee281 100644 |
--- a/src/core/SkBlitter_RGB16.cpp |
+++ b/src/core/SkBlitter_RGB16.cpp |
@@ -22,6 +22,11 @@ extern void blitmask_d565_opaque_mips(int width, int height, uint16_t* device, |
#if SK_ARM_NEON_IS_ALWAYS && defined(SK_CPU_LENDIAN) |
#include <arm_neon.h> |
+extern void SkRGB16BlitterBlitV_neon(uint16_t* device, |
+ int height, |
+ size_t deviceRB, |
+ unsigned scale, |
+ uint32_t src32); |
#else |
// if we don't have neon, then our black blitter is worth the extra code |
#define USE_BLACK_BLITTER |
@@ -484,11 +489,15 @@ void SkRGB16_Opaque_Blitter::blitV(int x, int y, int height, SkAlpha alpha) { |
unsigned scale5 = SkAlpha255To256(alpha) >> 3; |
uint32_t src32 = fExpandedRaw16 * scale5; |
scale5 = 32 - scale5; |
+#if SK_ARM_NEON_IS_ALWAYS && defined(SK_CPU_LENDIAN) |
+ SkRGB16BlitterBlitV_neon(device, height, deviceRB, scale5, src32); |
+#else |
do { |
uint32_t dst32 = SkExpand_rgb_16(*device) * scale5; |
*device = SkCompact_rgb_16((src32 + dst32) >> 5); |
device = (uint16_t*)((char*)device + deviceRB); |
} while (--height != 0); |
+#endif |
} |
void SkRGB16_Opaque_Blitter::blitRect(int x, int y, int width, int height) { |
@@ -659,11 +668,15 @@ void SkRGB16_Blitter::blitV(int x, int y, int height, SkAlpha alpha) { |
unsigned scale5 = SkAlpha255To256(alpha) * fScale >> (8 + 3); |
uint32_t src32 = fExpandedRaw16 * scale5; |
scale5 = 32 - scale5; |
+#if SK_ARM_NEON_IS_ALWAYS && defined(SK_CPU_LENDIAN) |
+ SkRGB16BlitterBlitV_neon(device, height, deviceRB, scale5, src32); |
+#else |
do { |
uint32_t dst32 = SkExpand_rgb_16(*device) * scale5; |
*device = SkCompact_rgb_16((src32 + dst32) >> 5); |
device = (uint16_t*)((char*)device + deviceRB); |
} while (--height != 0); |
+#endif |
} |
void SkRGB16_Blitter::blitRect(int x, int y, int width, int height) { |