| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 The Android Open Source Project | 2 * Copyright 2014 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef SkColor_opts_SSE2_DEFINED | 8 #ifndef SkColor_opts_SSE2_DEFINED |
| 9 #define SkColor_opts_SSE2_DEFINED | 9 #define SkColor_opts_SSE2_DEFINED |
| 10 | 10 |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 SK_B32_SHIFT + (8 - SK_B16_BITS)); | 199 SK_B32_SHIFT + (8 - SK_B16_BITS)); |
| 200 b2 = _mm_and_si128(b2, _mm_set1_epi32(SK_B16_MASK)); | 200 b2 = _mm_and_si128(b2, _mm_set1_epi32(SK_B16_MASK)); |
| 201 __m128i b = _mm_packs_epi32(b1, b2); | 201 __m128i b = _mm_packs_epi32(b1, b2); |
| 202 | 202 |
| 203 // Store 8 16-bit colors in dst. | 203 // Store 8 16-bit colors in dst. |
| 204 __m128i d_pixel = SkPackRGB16_SSE2(r, g, b); | 204 __m128i d_pixel = SkPackRGB16_SSE2(r, g, b); |
| 205 | 205 |
| 206 return d_pixel; | 206 return d_pixel; |
| 207 } | 207 } |
| 208 | 208 |
| 209 // Portable version SkBlendARGB32 is in SkColorPriv.h. | 209 // Portable version is SkPMSrcOver in SkColorPriv.h. |
| 210 static inline __m128i SkPMSrcOver_SSE2(const __m128i& src, const __m128i& dst) { |
| 211 return _mm_add_epi32(src, |
| 212 SkAlphaMulQ_SSE2(dst, _mm_sub_epi32(_mm_set1_epi32(256)
, |
| 213 SkGetPackedA32_SSE2
(src)))); |
| 214 } |
| 215 |
| 216 // Portable version is SkBlendARGB32 in SkColorPriv.h. |
| 210 static inline __m128i SkBlendARGB32_SSE2(const __m128i& src, const __m128i& dst, | 217 static inline __m128i SkBlendARGB32_SSE2(const __m128i& src, const __m128i& dst, |
| 211 const __m128i& aa) { | 218 const __m128i& aa) { |
| 212 __m128i src_scale = SkAlpha255To256_SSE2(aa); | 219 __m128i src_scale = SkAlpha255To256_SSE2(aa); |
| 213 // SkAlpha255To256(255 - SkAlphaMul(SkGetPackedA32(src), src_scale)) | 220 // SkAlpha255To256(255 - SkAlphaMul(SkGetPackedA32(src), src_scale)) |
| 214 __m128i dst_scale = SkGetPackedA32_SSE2(src); | 221 __m128i dst_scale = SkGetPackedA32_SSE2(src); |
| 215 dst_scale = _mm_mullo_epi16(dst_scale, src_scale); | 222 dst_scale = _mm_mullo_epi16(dst_scale, src_scale); |
| 216 dst_scale = _mm_srli_epi16(dst_scale, 8); | 223 dst_scale = _mm_srli_epi16(dst_scale, 8); |
| 217 dst_scale = _mm_sub_epi32(_mm_set1_epi32(256), dst_scale); | 224 dst_scale = _mm_sub_epi32(_mm_set1_epi32(256), dst_scale); |
| 218 | 225 |
| 219 __m128i result = SkAlphaMulQ_SSE2(src, src_scale); | 226 __m128i result = SkAlphaMulQ_SSE2(src, src_scale); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 230 dst_scale = _mm_mullo_epi16(dst_scale, src_scale); | 237 dst_scale = _mm_mullo_epi16(dst_scale, src_scale); |
| 231 dst_scale = _mm_srli_epi16(dst_scale, 8); | 238 dst_scale = _mm_srli_epi16(dst_scale, 8); |
| 232 dst_scale = _mm_sub_epi32(_mm_set1_epi32(256), dst_scale); | 239 dst_scale = _mm_sub_epi32(_mm_set1_epi32(256), dst_scale); |
| 233 | 240 |
| 234 __m128i result = SkAlphaMulQ_SSE2(src, alpha); | 241 __m128i result = SkAlphaMulQ_SSE2(src, alpha); |
| 235 return _mm_add_epi8(result, SkAlphaMulQ_SSE2(dst, dst_scale)); | 242 return _mm_add_epi8(result, SkAlphaMulQ_SSE2(dst, dst_scale)); |
| 236 } | 243 } |
| 237 | 244 |
| 238 #undef ASSERT_EQ | 245 #undef ASSERT_EQ |
| 239 #endif // SkColor_opts_SSE2_DEFINED | 246 #endif // SkColor_opts_SSE2_DEFINED |
| OLD | NEW |