diff options
author | rmistry@google.com <rmistry@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-02 13:50:38 +0000 |
---|---|---|
committer | rmistry@google.com <rmistry@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-02 13:50:38 +0000 |
commit | d6bab0238655dbab24dfe92bd0b16b464310a8c7 (patch) | |
tree | 664de29dd3b91a1ed1be463f2cd797e871cabec7 /src/opts | |
parent | 5b39f5ba9c339d1e4dae391fee9ec1396feec180 (diff) |
Reverting r12427
git-svn-id: http://skia.googlecode.com/svn/trunk@12428 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/opts')
-rw-r--r-- | src/opts/SkBlitMask_opts_arm.cpp | 27 | ||||
-rw-r--r-- | src/opts/SkColor_opts_neon.h | 17 |
2 files changed, 43 insertions, 1 deletions
diff --git a/src/opts/SkBlitMask_opts_arm.cpp b/src/opts/SkBlitMask_opts_arm.cpp index 0ad0919387..2bf760313c 100644 --- a/src/opts/SkBlitMask_opts_arm.cpp +++ b/src/opts/SkBlitMask_opts_arm.cpp @@ -1,14 +1,39 @@ +#include "SkColor.h" +#include "SkColorPriv.h" #include "SkBlitMask.h" +#include "SkUtilsArm.h" +#include "SkBlitMask_opts_arm_neon.h" SkBlitMask::ColorProc SkBlitMask::PlatformColorProcs(SkBitmap::Config dstConfig, SkMask::Format maskFormat, SkColor color) { +#if SK_ARM_NEON_IS_NONE + return NULL; +#else +#if SK_ARM_NEON_IS_DYNAMIC + if (!sk_cpu_arm_has_neon()) { + return NULL; + } +#endif + if ((SkBitmap::kARGB_8888_Config == dstConfig) && + (SkMask::kA8_Format == maskFormat)) { + return D32_A8_Factory_neon(color); + } +#endif + + // We don't need to handle the SkMask::kLCD16_Format case as the default + // LCD16 will call us through SkBlitMask::PlatformBlitRowProcs16() + return NULL; } SkBlitMask::BlitLCD16RowProc SkBlitMask::PlatformBlitRowProcs16(bool isOpaque) { - return NULL; + if (isOpaque) { + return SK_ARM_NEON_WRAP(SkBlitLCD16OpaqueRow); + } else { + return SK_ARM_NEON_WRAP(SkBlitLCD16Row); + } } SkBlitMask::RowProc SkBlitMask::PlatformRowProcs(SkBitmap::Config dstConfig, diff --git a/src/opts/SkColor_opts_neon.h b/src/opts/SkColor_opts_neon.h index f81239712a..85752f5558 100644 --- a/src/opts/SkColor_opts_neon.h +++ b/src/opts/SkColor_opts_neon.h @@ -2,6 +2,7 @@ #define SkColor_opts_neon_DEFINED #include "SkTypes.h" +#include "SkColorPriv.h" #include <arm_neon.h> @@ -65,4 +66,20 @@ static inline uint16x8_t SkPixel32ToPixel16_neon8(uint8x8x4_t vsrc) { return ret; } +/* This function blends 8 pixels of the same channel in the exact same way as + * SkBlend32. + */ +static inline uint8x8_t SkBlend32_neon8(uint8x8_t src, uint8x8_t dst, uint16x8_t scale) { + int16x8_t src_wide, dst_wide; + + src_wide = vreinterpretq_s16_u16(vmovl_u8(src)); + dst_wide = vreinterpretq_s16_u16(vmovl_u8(dst)); + + src_wide = (src_wide - dst_wide) * vreinterpretq_s16_u16(scale); + + dst_wide += vshrq_n_s16(src_wide, 5); + + return vmovn_u16(vreinterpretq_u16_s16(dst_wide)); +} + #endif /* #ifndef SkColor_opts_neon_DEFINED */ |