| 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 |