OLD | NEW |
1 #include "SkColorPriv.h" | 1 #include "SkColorPriv.h" |
2 #include "SkColor_opts_SSE2.h" | 2 #include "SkColor_opts_SSE2.h" |
3 #include "SkMathPriv.h" | 3 #include "SkMathPriv.h" |
4 #include "SkMath_opts_SSE2.h" | 4 #include "SkMath_opts_SSE2.h" |
5 #include "SkXfermode.h" | 5 #include "SkXfermode.h" |
6 #include "SkXfermode_opts_SSE2.h" | 6 #include "SkXfermode_opts_SSE2.h" |
7 #include "SkXfermode_proccoeff.h" | 7 #include "SkXfermode_proccoeff.h" |
8 | 8 |
9 //////////////////////////////////////////////////////////////////////////////// | 9 //////////////////////////////////////////////////////////////////////////////// |
10 // 4 pixels SSE2 version functions | 10 // 4 pixels SSE2 version functions |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 __m128i a = srcover_byte_SSE2(sa, da); | 276 __m128i a = srcover_byte_SSE2(sa, da); |
277 __m128i r = overlay_byte_SSE2(SkGetPackedR32_SSE2(src), | 277 __m128i r = overlay_byte_SSE2(SkGetPackedR32_SSE2(src), |
278 SkGetPackedR32_SSE2(dst), sa, da); | 278 SkGetPackedR32_SSE2(dst), sa, da); |
279 __m128i g = overlay_byte_SSE2(SkGetPackedG32_SSE2(src), | 279 __m128i g = overlay_byte_SSE2(SkGetPackedG32_SSE2(src), |
280 SkGetPackedG32_SSE2(dst), sa, da); | 280 SkGetPackedG32_SSE2(dst), sa, da); |
281 __m128i b = overlay_byte_SSE2(SkGetPackedB32_SSE2(src), | 281 __m128i b = overlay_byte_SSE2(SkGetPackedB32_SSE2(src), |
282 SkGetPackedB32_SSE2(dst), sa, da); | 282 SkGetPackedB32_SSE2(dst), sa, da); |
283 return SkPackARGB32_SSE2(a, r, g, b); | 283 return SkPackARGB32_SSE2(a, r, g, b); |
284 } | 284 } |
285 | 285 |
| 286 static inline __m128i darken_byte_SSE2(const __m128i& sc, const __m128i& dc, |
| 287 const __m128i& sa, const __m128i& da) { |
| 288 __m128i sd = _mm_mullo_epi16(sc, da); |
| 289 __m128i ds = _mm_mullo_epi16(dc, sa); |
| 290 |
| 291 __m128i cmp = _mm_cmplt_epi32(sd, ds); |
| 292 |
| 293 __m128i tmp = _mm_add_epi32(sc, dc); |
| 294 __m128i ret1 = _mm_sub_epi32(tmp, SkDiv255Round_SSE2(ds)); |
| 295 __m128i ret2 = _mm_sub_epi32(tmp, SkDiv255Round_SSE2(sd)); |
| 296 __m128i ret = _mm_or_si128(_mm_and_si128(cmp, ret1), |
| 297 _mm_andnot_si128(cmp, ret2)); |
| 298 return ret; |
| 299 } |
| 300 |
| 301 static __m128i darken_modeproc_SSE2(const __m128i& src, const __m128i& dst) { |
| 302 __m128i sa = SkGetPackedA32_SSE2(src); |
| 303 __m128i da = SkGetPackedA32_SSE2(dst); |
| 304 |
| 305 __m128i a = srcover_byte_SSE2(sa, da); |
| 306 __m128i r = darken_byte_SSE2(SkGetPackedR32_SSE2(src), |
| 307 SkGetPackedR32_SSE2(dst), sa, da); |
| 308 __m128i g = darken_byte_SSE2(SkGetPackedG32_SSE2(src), |
| 309 SkGetPackedG32_SSE2(dst), sa, da); |
| 310 __m128i b = darken_byte_SSE2(SkGetPackedB32_SSE2(src), |
| 311 SkGetPackedB32_SSE2(dst), sa, da); |
| 312 return SkPackARGB32_SSE2(a, r, g, b); |
| 313 } |
| 314 |
| 315 static inline __m128i lighten_byte_SSE2(const __m128i& sc, const __m128i& dc, |
| 316 const __m128i& sa, const __m128i& da) { |
| 317 __m128i sd = _mm_mullo_epi16(sc, da); |
| 318 __m128i ds = _mm_mullo_epi16(dc, sa); |
| 319 |
| 320 __m128i cmp = _mm_cmpgt_epi32(sd, ds); |
| 321 |
| 322 __m128i tmp = _mm_add_epi32(sc, dc); |
| 323 __m128i ret1 = _mm_sub_epi32(tmp, SkDiv255Round_SSE2(ds)); |
| 324 __m128i ret2 = _mm_sub_epi32(tmp, SkDiv255Round_SSE2(sd)); |
| 325 __m128i ret = _mm_or_si128(_mm_and_si128(cmp, ret1), |
| 326 _mm_andnot_si128(cmp, ret2)); |
| 327 return ret; |
| 328 } |
| 329 |
| 330 static __m128i lighten_modeproc_SSE2(const __m128i& src, const __m128i& dst) { |
| 331 __m128i sa = SkGetPackedA32_SSE2(src); |
| 332 __m128i da = SkGetPackedA32_SSE2(dst); |
| 333 |
| 334 __m128i a = srcover_byte_SSE2(sa, da); |
| 335 __m128i r = lighten_byte_SSE2(SkGetPackedR32_SSE2(src), |
| 336 SkGetPackedR32_SSE2(dst), sa, da); |
| 337 __m128i g = lighten_byte_SSE2(SkGetPackedG32_SSE2(src), |
| 338 SkGetPackedG32_SSE2(dst), sa, da); |
| 339 __m128i b = lighten_byte_SSE2(SkGetPackedB32_SSE2(src), |
| 340 SkGetPackedB32_SSE2(dst), sa, da); |
| 341 return SkPackARGB32_SSE2(a, r, g, b); |
| 342 } |
| 343 |
286 static inline __m128i colordodge_byte_SSE2(const __m128i& sc, const __m128i& dc, | 344 static inline __m128i colordodge_byte_SSE2(const __m128i& sc, const __m128i& dc, |
287 const __m128i& sa, const __m128i& da)
{ | 345 const __m128i& sa, const __m128i& da)
{ |
288 __m128i diff = _mm_sub_epi32(sa, sc); | 346 __m128i diff = _mm_sub_epi32(sa, sc); |
289 __m128i ida = _mm_sub_epi32(_mm_set1_epi32(255), da); | 347 __m128i ida = _mm_sub_epi32(_mm_set1_epi32(255), da); |
290 __m128i isa = _mm_sub_epi32(_mm_set1_epi32(255), sa); | 348 __m128i isa = _mm_sub_epi32(_mm_set1_epi32(255), sa); |
291 | 349 |
292 // if (0 == dc) | 350 // if (0 == dc) |
293 __m128i cmp1 = _mm_cmpeq_epi32(dc, _mm_setzero_si128()); | 351 __m128i cmp1 = _mm_cmpeq_epi32(dc, _mm_setzero_si128()); |
294 __m128i rc1 = _mm_and_si128(cmp1, SkAlphaMulAlpha_SSE2(sc, ida)); | 352 __m128i rc1 = _mm_and_si128(cmp1, SkAlphaMulAlpha_SSE2(sc, ida)); |
295 | 353 |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 srcout_modeproc_SSE2, | 777 srcout_modeproc_SSE2, |
720 dstout_modeproc_SSE2, | 778 dstout_modeproc_SSE2, |
721 srcatop_modeproc_SSE2, | 779 srcatop_modeproc_SSE2, |
722 dstatop_modeproc_SSE2, | 780 dstatop_modeproc_SSE2, |
723 xor_modeproc_SSE2, | 781 xor_modeproc_SSE2, |
724 plus_modeproc_SSE2, | 782 plus_modeproc_SSE2, |
725 modulate_modeproc_SSE2, | 783 modulate_modeproc_SSE2, |
726 screen_modeproc_SSE2, | 784 screen_modeproc_SSE2, |
727 | 785 |
728 overlay_modeproc_SSE2, | 786 overlay_modeproc_SSE2, |
729 NULL, // kDarken_Mode | 787 darken_modeproc_SSE2, |
730 NULL, // kLighten_Mode | 788 lighten_modeproc_SSE2, |
731 colordodge_modeproc_SSE2, | 789 colordodge_modeproc_SSE2, |
732 colorburn_modeproc_SSE2, | 790 colorburn_modeproc_SSE2, |
733 hardlight_modeproc_SSE2, | 791 hardlight_modeproc_SSE2, |
734 softlight_modeproc_SSE2, | 792 softlight_modeproc_SSE2, |
735 difference_modeproc_SSE2, | 793 difference_modeproc_SSE2, |
736 exclusion_modeproc_SSE2, | 794 exclusion_modeproc_SSE2, |
737 multiply_modeproc_SSE2, | 795 multiply_modeproc_SSE2, |
738 | 796 |
739 NULL, // kHue_Mode | 797 NULL, // kHue_Mode |
740 NULL, // kSaturation_Mode | 798 NULL, // kSaturation_Mode |
741 NULL, // kColor_Mode | 799 NULL, // kColor_Mode |
742 NULL, // kLuminosity_Mode | 800 NULL, // kLuminosity_Mode |
743 }; | 801 }; |
744 | 802 |
745 SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec, | 803 SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec, |
746 SkXfermode::Mode mode)
{ | 804 SkXfermode::Mode mode)
{ |
747 void* procSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[mode]); | 805 void* procSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[mode]); |
748 | 806 |
749 if (procSIMD != NULL) { | 807 if (procSIMD != NULL) { |
750 return SkNEW_ARGS(SkSSE2ProcCoeffXfermode, (rec, mode, procSIMD)); | 808 return SkNEW_ARGS(SkSSE2ProcCoeffXfermode, (rec, mode, procSIMD)); |
751 } | 809 } |
752 return NULL; | 810 return NULL; |
753 } | 811 } |
OLD | NEW |