| 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 "SkXfermode.h" | 4 #include "SkXfermode.h" |
| 5 #include "SkXfermode_opts_SSE2.h" | 5 #include "SkXfermode_opts_SSE2.h" |
| 6 #include "SkXfermode_proccoeff.h" | 6 #include "SkXfermode_proccoeff.h" |
| 7 | 7 |
| 8 //////////////////////////////////////////////////////////////////////////////// | 8 //////////////////////////////////////////////////////////////////////////////// |
| 9 // 4 pixels SSE2 version functions | 9 // 4 pixels SSE2 version functions |
| 10 //////////////////////////////////////////////////////////////////////////////// | 10 //////////////////////////////////////////////////////////////////////////////// |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 __m128i a = srcover_byte_SSE2(sa, da); | 259 __m128i a = srcover_byte_SSE2(sa, da); |
| 260 __m128i r = overlay_byte_SSE2(SkGetPackedR32_SSE2(src), | 260 __m128i r = overlay_byte_SSE2(SkGetPackedR32_SSE2(src), |
| 261 SkGetPackedR32_SSE2(dst), sa, da); | 261 SkGetPackedR32_SSE2(dst), sa, da); |
| 262 __m128i g = overlay_byte_SSE2(SkGetPackedG32_SSE2(src), | 262 __m128i g = overlay_byte_SSE2(SkGetPackedG32_SSE2(src), |
| 263 SkGetPackedG32_SSE2(dst), sa, da); | 263 SkGetPackedG32_SSE2(dst), sa, da); |
| 264 __m128i b = overlay_byte_SSE2(SkGetPackedB32_SSE2(src), | 264 __m128i b = overlay_byte_SSE2(SkGetPackedB32_SSE2(src), |
| 265 SkGetPackedB32_SSE2(dst), sa, da); | 265 SkGetPackedB32_SSE2(dst), sa, da); |
| 266 return SkPackARGB32_SSE2(a, r, g, b); | 266 return SkPackARGB32_SSE2(a, r, g, b); |
| 267 } | 267 } |
| 268 | 268 |
| 269 static inline __m128i hardlight_byte_SSE2(const __m128i& sc, const __m128i& dc, |
| 270 const __m128i& sa, const __m128i& da)
{ |
| 271 // if (2 * sc <= sa) |
| 272 __m128i tmp1 = _mm_slli_epi32(sc, 1); |
| 273 __m128i cmp1 = _mm_cmpgt_epi32(tmp1, sa); |
| 274 __m128i rc1 = _mm_mullo_epi16(sc, dc); // sc * dc; |
| 275 rc1 = _mm_slli_epi32(rc1, 1); // 2 * sc * dc |
| 276 rc1 = _mm_andnot_si128(cmp1, rc1); |
| 277 |
| 278 // else |
| 279 tmp1 = _mm_mullo_epi16(sa, da); |
| 280 __m128i tmp2 = Multiply32_SSE2(_mm_sub_epi32(da, dc), |
| 281 _mm_sub_epi32(sa, sc)); |
| 282 tmp2 = _mm_slli_epi32(tmp2, 1); |
| 283 __m128i rc2 = _mm_sub_epi32(tmp1, tmp2); |
| 284 rc2 = _mm_and_si128(cmp1, rc2); |
| 285 |
| 286 __m128i rc = _mm_or_si128(rc1, rc2); |
| 287 |
| 288 __m128i ida = _mm_sub_epi32(_mm_set1_epi32(255), da); |
| 289 tmp1 = _mm_mullo_epi16(sc, ida); |
| 290 __m128i isa = _mm_sub_epi32(_mm_set1_epi32(255), sa); |
| 291 tmp2 = _mm_mullo_epi16(dc, isa); |
| 292 rc = _mm_add_epi32(rc, tmp1); |
| 293 rc = _mm_add_epi32(rc, tmp2); |
| 294 return clamp_div255round_SSE2(rc); |
| 295 } |
| 296 |
| 297 static __m128i hardlight_modeproc_SSE2(const __m128i& src, const __m128i& dst) { |
| 298 __m128i sa = SkGetPackedA32_SSE2(src); |
| 299 __m128i da = SkGetPackedA32_SSE2(dst); |
| 300 |
| 301 __m128i a = srcover_byte_SSE2(sa, da); |
| 302 __m128i r = hardlight_byte_SSE2(SkGetPackedR32_SSE2(src), |
| 303 SkGetPackedR32_SSE2(dst), sa, da); |
| 304 __m128i g = hardlight_byte_SSE2(SkGetPackedG32_SSE2(src), |
| 305 SkGetPackedG32_SSE2(dst), sa, da); |
| 306 __m128i b = hardlight_byte_SSE2(SkGetPackedB32_SSE2(src), |
| 307 SkGetPackedB32_SSE2(dst), sa, da); |
| 308 return SkPackARGB32_SSE2(a, r, g, b); |
| 309 } |
| 310 |
| 269 static inline __m128i exclusion_byte_SSE2(const __m128i& sc, const __m128i& dc, | 311 static inline __m128i exclusion_byte_SSE2(const __m128i& sc, const __m128i& dc, |
| 270 const __m128i&, __m128i&) { | 312 const __m128i&, __m128i&) { |
| 271 __m128i tmp1 = _mm_mullo_epi16(_mm_set1_epi32(255), sc); // 255 * sc | 313 __m128i tmp1 = _mm_mullo_epi16(_mm_set1_epi32(255), sc); // 255 * sc |
| 272 __m128i tmp2 = _mm_mullo_epi16(_mm_set1_epi32(255), dc); // 255 * dc | 314 __m128i tmp2 = _mm_mullo_epi16(_mm_set1_epi32(255), dc); // 255 * dc |
| 273 tmp1 = _mm_add_epi32(tmp1, tmp2); | 315 tmp1 = _mm_add_epi32(tmp1, tmp2); |
| 274 tmp2 = _mm_mullo_epi16(sc, dc); // sc * dc | 316 tmp2 = _mm_mullo_epi16(sc, dc); // sc * dc |
| 275 tmp2 = _mm_slli_epi32(tmp2, 1); // 2 * sc * dc | 317 tmp2 = _mm_slli_epi32(tmp2, 1); // 2 * sc * dc |
| 276 | 318 |
| 277 __m128i r = _mm_sub_epi32(tmp1, tmp2); | 319 __m128i r = _mm_sub_epi32(tmp1, tmp2); |
| 278 return clamp_div255round_SSE2(r); | 320 return clamp_div255round_SSE2(r); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 xor_modeproc_SSE2, | 487 xor_modeproc_SSE2, |
| 446 plus_modeproc_SSE2, | 488 plus_modeproc_SSE2, |
| 447 modulate_modeproc_SSE2, | 489 modulate_modeproc_SSE2, |
| 448 screen_modeproc_SSE2, | 490 screen_modeproc_SSE2, |
| 449 | 491 |
| 450 overlay_modeproc_SSE2, | 492 overlay_modeproc_SSE2, |
| 451 NULL, // kDarken_Mode | 493 NULL, // kDarken_Mode |
| 452 NULL, // kLighten_Mode | 494 NULL, // kLighten_Mode |
| 453 NULL, // kColorDodge_Mode | 495 NULL, // kColorDodge_Mode |
| 454 NULL, // kColorBurn_Mode | 496 NULL, // kColorBurn_Mode |
| 455 NULL, // kHardLight_Mode | 497 hardlight_modeproc_SSE2, |
| 456 NULL, // kSoftLight_Mode | 498 NULL, // kSoftLight_Mode |
| 457 NULL, // kDifference_Mode | 499 NULL, // kDifference_Mode |
| 458 exclusion_modeproc_SSE2, | 500 exclusion_modeproc_SSE2, |
| 459 multiply_modeproc_SSE2, | 501 multiply_modeproc_SSE2, |
| 460 | 502 |
| 461 NULL, // kHue_Mode | 503 NULL, // kHue_Mode |
| 462 NULL, // kSaturation_Mode | 504 NULL, // kSaturation_Mode |
| 463 NULL, // kColor_Mode | 505 NULL, // kColor_Mode |
| 464 NULL, // kLuminosity_Mode | 506 NULL, // kLuminosity_Mode |
| 465 }; | 507 }; |
| 466 | 508 |
| 467 SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec, | 509 SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec, |
| 468 SkXfermode::Mode mode)
{ | 510 SkXfermode::Mode mode)
{ |
| 469 void* procSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[mode]); | 511 void* procSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[mode]); |
| 470 | 512 |
| 471 if (procSIMD != NULL) { | 513 if (procSIMD != NULL) { |
| 472 return SkNEW_ARGS(SkSSE2ProcCoeffXfermode, (rec, mode, procSIMD)); | 514 return SkNEW_ARGS(SkSSE2ProcCoeffXfermode, (rec, mode, procSIMD)); |
| 473 } | 515 } |
| 474 return NULL; | 516 return NULL; |
| 475 } | 517 } |
| OLD | NEW |