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 srcScale) { |
| 87 SkASSERT(srcScale <= 256); |
| 88 int16x8_t vscale = vdupq_n_s16(srcScale); |
| 89 int16x8_t vsrc_wide, vdst_wide, vdiff; |
| 90 uint8x8_t res; |
| 91 |
| 92 vsrc_wide = vreinterpretq_s16_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(sr
c)))); |
| 93 vdst_wide = vreinterpretq_s16_u16(vmovl_u8(vreinterpret_u8_u32(vdup_n_u32(ds
t)))); |
| 94 |
| 95 vdiff = vsrc_wide - vdst_wide; |
| 96 vdiff *= vscale; |
| 97 |
| 98 vdiff = vshrq_n_s16(vdiff, 8); |
| 99 |
| 100 vdst_wide += vdiff; |
| 101 |
| 102 res = vmovn_u16(vreinterpretq_u16_s16(vdst_wide)); |
| 103 |
| 104 return vget_lane_u32(vreinterpret_u32_u8(res), 0); |
| 105 } |
| 106 |
| 107 static inline SkPMColor SkFourByteInterp_neon(SkPMColor src, SkPMColor dst, |
| 108 U8CPU srcWeight) { |
| 109 SkASSERT(srcWeight <= 255); |
| 110 unsigned scale = SkAlpha255To256(srcWeight); |
| 111 return SkFourByteInterp256_neon(src, dst, scale); |
| 112 } |
| 113 |
85 #endif /* #ifndef SkColor_opts_neon_DEFINED */ | 114 #endif /* #ifndef SkColor_opts_neon_DEFINED */ |
OLD | NEW |