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 |