Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(490)

Side by Side Diff: src/opts/SkXfermode_opts_SSE2.cpp

Issue 229003004: Xfermode: SSE2 implementation of hardlight mode (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase master Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698