Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #ifndef SkColor_opts_neon_DEFINED | 1 #ifndef SkColor_opts_neon_DEFINED |
| 2 #define SkColor_opts_neon_DEFINED | 2 #define SkColor_opts_neon_DEFINED |
| 3 | 3 |
| 4 #include "SkTypes.h" | 4 #include "SkTypes.h" |
| 5 #include "SkColorPriv.h" | 5 #include "SkColorPriv.h" |
| 6 | 6 |
| 7 #include <arm_neon.h> | 7 #include <arm_neon.h> |
| 8 | 8 |
| 9 #define NEON_A (SK_A32_SHIFT / 8) | 9 #define NEON_A (SK_A32_SHIFT / 8) |
| 10 #define NEON_R (SK_R32_SHIFT / 8) | 10 #define NEON_R (SK_R32_SHIFT / 8) |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 75 src_wide = vreinterpretq_s16_u16(vmovl_u8(src)); | 75 src_wide = vreinterpretq_s16_u16(vmovl_u8(src)); |
| 76 dst_wide = vreinterpretq_s16_u16(vmovl_u8(dst)); | 76 dst_wide = vreinterpretq_s16_u16(vmovl_u8(dst)); |
| 77 | 77 |
| 78 src_wide = (src_wide - dst_wide) * vreinterpretq_s16_u16(scale); | 78 src_wide = (src_wide - dst_wide) * vreinterpretq_s16_u16(scale); |
| 79 | 79 |
| 80 dst_wide += vshrq_n_s16(src_wide, 5); | 80 dst_wide += vshrq_n_s16(src_wide, 5); |
| 81 | 81 |
| 82 return vmovn_u16(vreinterpretq_u16_s16(dst_wide)); | 82 return vmovn_u16(vreinterpretq_u16_s16(dst_wide)); |
| 83 } | 83 } |
| 84 | 84 |
| 85 static inline SkPMColor SkFourByteInterp256_neon(SkPMColor src, SkPMColor dst, | |
| 86 unsigned scale) { | |
|
reed1
2013/12/02 16:25:42
Can we add SkASSERT(scale <= 256); at the beginnin
kevin.petit.not.used.account
2013/12/02 16:59:45
Done.
| |
| 87 int16x8_t vscale = vdupq_n_s16(scale); | |
| 88 int16x8_t vsrc_wide, vdst_wide, vdiff; | |
| 89 uint8x8_t res; | |
| 90 | |
| 91 vsrc_wide = vreinterpretq_s16_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(sr c)))); | |
| 92 vdst_wide = vreinterpretq_s16_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(ds t)))); | |
| 93 | |
| 94 vdiff = vsrc_wide - vdst_wide; | |
| 95 vdiff *= vscale; | |
| 96 | |
| 97 vdiff = vshrq_n_s16(vdiff, 8); | |
| 98 | |
| 99 vdst_wide += vdiff; | |
| 100 | |
| 101 res = vmovn_u16(vreinterpretq_u16_s16(vdst_wide)); | |
| 102 | |
| 103 return vget_lane_u32(vreinterpret_u32_u8(res), 0); | |
| 104 } | |
| 105 | |
| 106 static inline SkPMColor SkFourByteInterp_neon(SkPMColor src, SkPMColor dst, | |
| 107 U8CPU srcWeight) { | |
|
reed1
2013/12/02 16:25:42
SkASSERT(srcWeight <= 255);
kevin.petit.not.used.account
2013/12/02 16:59:45
Done.
| |
| 108 unsigned scale = SkAlpha255To256(srcWeight); | |
| 109 return SkFourByteInterp256_neon(src, dst, scale); | |
| 110 } | |
| 111 | |
| 85 #endif /* #ifndef SkColor_opts_neon_DEFINED */ | 112 #endif /* #ifndef SkColor_opts_neon_DEFINED */ |
| OLD | NEW |