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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 __m128i g = blendfunc_multiply_byte_SSE2(sg, dg, sa, da); | 77 __m128i g = blendfunc_multiply_byte_SSE2(sg, dg, sa, da); |
78 | 78 |
79 | 79 |
80 __m128i sb = SkGetPackedB32_SSE2(src); | 80 __m128i sb = SkGetPackedB32_SSE2(src); |
81 __m128i db = SkGetPackedB32_SSE2(dst); | 81 __m128i db = SkGetPackedB32_SSE2(dst); |
82 __m128i b = blendfunc_multiply_byte_SSE2(sb, db, sa, da); | 82 __m128i b = blendfunc_multiply_byte_SSE2(sb, db, sa, da); |
83 | 83 |
84 return SkPackARGB32_SSE2(a, r, g, b); | 84 return SkPackARGB32_SSE2(a, r, g, b); |
85 } | 85 } |
86 | 86 |
| 87 static inline __m128i exclusion_byte_SSE2(const __m128i& sc, const __m128i& dc, |
| 88 const __m128i&, __m128i&) { |
| 89 __m128i tmp1 = _mm_mullo_epi16(_mm_set1_epi32(255), sc); // 255 * sc |
| 90 __m128i tmp2 = _mm_mullo_epi16(_mm_set1_epi32(255), dc); // 255 * dc |
| 91 tmp1 = _mm_add_epi32(tmp1, tmp2); |
| 92 tmp2 = _mm_mullo_epi16(sc, dc); // sc * dc |
| 93 tmp2 = _mm_slli_epi32(tmp2, 1); // 2 * sc * dc |
| 94 |
| 95 __m128i r = _mm_sub_epi32(tmp1, tmp2); |
| 96 return clamp_div255round_SSE2(r); |
| 97 } |
| 98 |
| 99 static __m128i exclusion_modeproc_SSE2(const __m128i& src, const __m128i& dst) { |
| 100 __m128i sa = SkGetPackedA32_SSE2(src); |
| 101 __m128i da = SkGetPackedA32_SSE2(dst); |
| 102 |
| 103 __m128i a = srcover_byte_SSE2(sa, da); |
| 104 __m128i r = exclusion_byte_SSE2(SkGetPackedR32_SSE2(src), |
| 105 SkGetPackedR32_SSE2(dst), sa, da); |
| 106 __m128i g = exclusion_byte_SSE2(SkGetPackedG32_SSE2(src), |
| 107 SkGetPackedG32_SSE2(dst), sa, da); |
| 108 __m128i b = exclusion_byte_SSE2(SkGetPackedB32_SSE2(src), |
| 109 SkGetPackedB32_SSE2(dst), sa, da); |
| 110 return SkPackARGB32_SSE2(a, r, g, b); |
| 111 } |
| 112 |
87 //////////////////////////////////////////////////////////////////////////////// | 113 //////////////////////////////////////////////////////////////////////////////// |
88 | 114 |
89 typedef __m128i (*SkXfermodeProcSIMD)(const __m128i& src, const __m128i& dst); | 115 typedef __m128i (*SkXfermodeProcSIMD)(const __m128i& src, const __m128i& dst); |
90 | 116 |
91 extern SkXfermodeProcSIMD gSSE2XfermodeProcs[]; | 117 extern SkXfermodeProcSIMD gSSE2XfermodeProcs[]; |
92 | 118 |
93 SkSSE2ProcCoeffXfermode::SkSSE2ProcCoeffXfermode(SkReadBuffer& buffer) | 119 SkSSE2ProcCoeffXfermode::SkSSE2ProcCoeffXfermode(SkReadBuffer& buffer) |
94 : INHERITED(buffer) { | 120 : INHERITED(buffer) { |
95 fProcSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[this->getMode()]); | 121 fProcSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[this->getMode()]); |
96 } | 122 } |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 NULL, // kScreen_Mode | 266 NULL, // kScreen_Mode |
241 | 267 |
242 NULL, // kOverlay_Mode | 268 NULL, // kOverlay_Mode |
243 NULL, // kDarken_Mode | 269 NULL, // kDarken_Mode |
244 NULL, // kLighten_Mode | 270 NULL, // kLighten_Mode |
245 NULL, // kColorDodge_Mode | 271 NULL, // kColorDodge_Mode |
246 NULL, // kColorBurn_Mode | 272 NULL, // kColorBurn_Mode |
247 NULL, // kHardLight_Mode | 273 NULL, // kHardLight_Mode |
248 NULL, // kSoftLight_Mode | 274 NULL, // kSoftLight_Mode |
249 NULL, // kDifference_Mode | 275 NULL, // kDifference_Mode |
250 NULL, // kExclusion_Mode | 276 exclusion_modeproc_SSE2, |
251 multiply_modeproc_SSE2, | 277 multiply_modeproc_SSE2, |
252 | 278 |
253 NULL, // kHue_Mode | 279 NULL, // kHue_Mode |
254 NULL, // kSaturation_Mode | 280 NULL, // kSaturation_Mode |
255 NULL, // kColor_Mode | 281 NULL, // kColor_Mode |
256 NULL, // kLuminosity_Mode | 282 NULL, // kLuminosity_Mode |
257 }; | 283 }; |
258 | 284 |
259 SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec, | 285 SkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_SSE2(const ProcCoeff& rec, |
260 SkXfermode::Mode mode)
{ | 286 SkXfermode::Mode mode)
{ |
261 void* procSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[mode]); | 287 void* procSIMD = reinterpret_cast<void*>(gSSE2XfermodeProcs[mode]); |
262 | 288 |
263 if (procSIMD != NULL) { | 289 if (procSIMD != NULL) { |
264 return SkNEW_ARGS(SkSSE2ProcCoeffXfermode, (rec, mode, procSIMD)); | 290 return SkNEW_ARGS(SkSSE2ProcCoeffXfermode, (rec, mode, procSIMD)); |
265 } | 291 } |
266 return NULL; | 292 return NULL; |
267 } | 293 } |
OLD | NEW |