| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 The Android Open Source Project | 2 * Copyright 2012 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 #include <emmintrin.h> | 8 #include <emmintrin.h> |
| 9 #include "SkBitmapProcState_opts_SSE2.h" | 9 #include "SkBitmapProcState_opts_SSE2.h" |
| 10 #include "SkBlitRow_opts_SSE2.h" | 10 #include "SkBlitRow_opts_SSE2.h" |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 } | 294 } |
| 295 | 295 |
| 296 // Small loop to handle remaining pixels. | 296 // Small loop to handle remaining pixels. |
| 297 while (count > 0) { | 297 while (count > 0) { |
| 298 *dst = SkBlend32_RGB16(src_expand, *dst, scale); | 298 *dst = SkBlend32_RGB16(src_expand, *dst, scale); |
| 299 dst += 1; | 299 dst += 1; |
| 300 count--; | 300 count--; |
| 301 } | 301 } |
| 302 } | 302 } |
| 303 | 303 |
| 304 void SkARGB32_A8_BlitMask_SSE2(void* device, size_t dstRB, const void* maskPtr, | |
| 305 size_t maskRB, SkColor origColor, | |
| 306 int width, int height) { | |
| 307 SkPMColor color = SkPreMultiplyColor(origColor); | |
| 308 size_t dstOffset = dstRB - (width << 2); | |
| 309 size_t maskOffset = maskRB - width; | |
| 310 SkPMColor* dst = (SkPMColor *)device; | |
| 311 const uint8_t* mask = (const uint8_t*)maskPtr; | |
| 312 do { | |
| 313 int count = width; | |
| 314 if (count >= 4) { | |
| 315 while (((size_t)dst & 0x0F) != 0 && (count > 0)) { | |
| 316 *dst = SkBlendARGB32(color, *dst, *mask); | |
| 317 mask++; | |
| 318 dst++; | |
| 319 count--; | |
| 320 } | |
| 321 __m128i *d = reinterpret_cast<__m128i*>(dst); | |
| 322 __m128i src_pixel = _mm_set1_epi32(color); | |
| 323 while (count >= 4) { | |
| 324 // Load 4 dst pixels | |
| 325 __m128i dst_pixel = _mm_load_si128(d); | |
| 326 | |
| 327 // Set the alpha value | |
| 328 __m128i alpha_wide = _mm_cvtsi32_si128(*reinterpret_cast<const u
int32_t*>(mask)); | |
| 329 alpha_wide = _mm_unpacklo_epi8(alpha_wide, _mm_setzero_si128()); | |
| 330 alpha_wide = _mm_unpacklo_epi16(alpha_wide, _mm_setzero_si128())
; | |
| 331 | |
| 332 __m128i result = SkBlendARGB32_SSE2(src_pixel, dst_pixel, alpha_
wide); | |
| 333 _mm_store_si128(d, result); | |
| 334 // Load the next 4 dst pixels and alphas | |
| 335 mask = mask + 4; | |
| 336 d++; | |
| 337 count -= 4; | |
| 338 } | |
| 339 dst = reinterpret_cast<SkPMColor*>(d); | |
| 340 } | |
| 341 while (count > 0) { | |
| 342 *dst= SkBlendARGB32(color, *dst, *mask); | |
| 343 dst += 1; | |
| 344 mask++; | |
| 345 count --; | |
| 346 } | |
| 347 dst = (SkPMColor *)((char*)dst + dstOffset); | |
| 348 mask += maskOffset; | |
| 349 } while (--height != 0); | |
| 350 } | |
| 351 | |
| 352 // The following (left) shifts cause the top 5 bits of the mask components to | 304 // The following (left) shifts cause the top 5 bits of the mask components to |
| 353 // line up with the corresponding components in an SkPMColor. | 305 // line up with the corresponding components in an SkPMColor. |
| 354 // Note that the mask's RGB16 order may differ from the SkPMColor order. | 306 // Note that the mask's RGB16 order may differ from the SkPMColor order. |
| 355 #define SK_R16x5_R32x5_SHIFT (SK_R32_SHIFT - SK_R16_SHIFT - SK_R16_BITS + 5) | 307 #define SK_R16x5_R32x5_SHIFT (SK_R32_SHIFT - SK_R16_SHIFT - SK_R16_BITS + 5) |
| 356 #define SK_G16x5_G32x5_SHIFT (SK_G32_SHIFT - SK_G16_SHIFT - SK_G16_BITS + 5) | 308 #define SK_G16x5_G32x5_SHIFT (SK_G32_SHIFT - SK_G16_SHIFT - SK_G16_BITS + 5) |
| 357 #define SK_B16x5_B32x5_SHIFT (SK_B32_SHIFT - SK_B16_SHIFT - SK_B16_BITS + 5) | 309 #define SK_B16x5_B32x5_SHIFT (SK_B32_SHIFT - SK_B16_SHIFT - SK_B16_BITS + 5) |
| 358 | 310 |
| 359 #if SK_R16x5_R32x5_SHIFT == 0 | 311 #if SK_R16x5_R32x5_SHIFT == 0 |
| 360 #define SkPackedR16x5ToUnmaskedR32x5_SSE2(x) (x) | 312 #define SkPackedR16x5ToUnmaskedR32x5_SSE2(x) (x) |
| 361 #elif SK_R16x5_R32x5_SHIFT > 0 | 313 #elif SK_R16x5_R32x5_SHIFT > 0 |
| (...skipping 796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1158 uint32_t dst_expanded = SkExpand_rgb_16(*dst); | 1110 uint32_t dst_expanded = SkExpand_rgb_16(*dst); |
| 1159 dst_expanded = dst_expanded * (SkAlpha255To256(255 - a) >> 3); | 1111 dst_expanded = dst_expanded * (SkAlpha255To256(255 - a) >> 3); |
| 1160 // now src and dst expanded are in g:11 r:10 x:1 b:10 | 1112 // now src and dst expanded are in g:11 r:10 x:1 b:10 |
| 1161 *dst = SkCompact_rgb_16((src_expanded + dst_expanded) >> 5); | 1113 *dst = SkCompact_rgb_16((src_expanded + dst_expanded) >> 5); |
| 1162 } | 1114 } |
| 1163 dst += 1; | 1115 dst += 1; |
| 1164 DITHER_INC_X(x); | 1116 DITHER_INC_X(x); |
| 1165 } while (--count != 0); | 1117 } while (--count != 0); |
| 1166 } | 1118 } |
| 1167 } | 1119 } |
| OLD | NEW |