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

Side by Side Diff: src/core/Sk4pxXfermode.h

Issue 1248893004: Revert of 565 support for SIMD xfermodes (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 5 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 | « src/core/Sk4px.h ('k') | src/opts/Sk4px_NEON.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef Sk4pxXfermode_DEFINED 8 #ifndef Sk4pxXfermode_DEFINED
9 #define Sk4pxXfermode_DEFINED 9 #define Sk4pxXfermode_DEFINED
10 10
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 return fProc4(src4, dst4); 215 return fProc4(src4, dst4);
216 }); 216 });
217 } else { 217 } else {
218 Sk4px::MapDstSrcAlpha(n, dst, src, aa, 218 Sk4px::MapDstSrcAlpha(n, dst, src, aa,
219 [&](const Sk4px& dst4, const Sk4px& src4, const Sk4px& alpha ) { 219 [&](const Sk4px& dst4, const Sk4px& src4, const Sk4px& alpha ) {
220 return fAAProc4(src4, dst4, alpha); 220 return fAAProc4(src4, dst4, alpha);
221 }); 221 });
222 } 222 }
223 } 223 }
224 224
225 void xfer16(uint16_t dst[], const SkPMColor src[], int n, const SkAlpha aa[] ) const override {
226 if (NULL == aa) {
227 Sk4px::MapDstSrc(n, dst, src, [&](const Sk4px& dst4, const Sk4px& sr c4) {
228 return fProc4(src4, dst4);
229 });
230 } else {
231 Sk4px::MapDstSrcAlpha(n, dst, src, aa,
232 [&](const Sk4px& dst4, const Sk4px& src4, const Sk4px& alpha ) {
233 return fAAProc4(src4, dst4, alpha);
234 });
235 }
236 }
237
238 private: 225 private:
239 Proc4 fProc4; 226 Proc4 fProc4;
240 AAProc4 fAAProc4; 227 AAProc4 fAAProc4;
241 typedef SkProcCoeffXfermode INHERITED; 228 typedef SkProcCoeffXfermode INHERITED;
242 }; 229 };
243 230
244 class SkPMFloatXfermode : public SkProcCoeffXfermode { 231 class SkPMFloatXfermode : public SkProcCoeffXfermode {
245 public: 232 public:
246 typedef SkPMFloat (SK_VECTORCALL *ProcF)(SkPMFloat, SkPMFloat); 233 typedef SkPMFloat (SK_VECTORCALL *ProcF)(SkPMFloat, SkPMFloat);
247 SkPMFloatXfermode(const ProcCoeff& rec, SkXfermode::Mode mode, ProcF procf) 234 SkPMFloatXfermode(const ProcCoeff& rec, SkXfermode::Mode mode, ProcF procf)
248 : INHERITED(rec, mode) 235 : INHERITED(rec, mode)
249 , fProcF(procf) {} 236 , fProcF(procf) {}
250 237
251 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[ ]) const override { 238 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[ ]) const override {
252 for (int i = 0; i < n; i++) { 239 for (int i = 0; i < n; i++) {
253 dst[i] = aa ? this->xfer32(dst[i], src[i], aa[i]) 240 SkPMFloat s(src[i]),
254 : this->xfer32(dst[i], src[i]); 241 d(dst[i]),
255 } 242 b(fProcF(s,d));
256 } 243 if (aa) {
257 244 // We do aa in full float precision before going back down to by tes, because we can!
258 void xfer16(uint16_t dst[], const SkPMColor src[], int n, const SkAlpha aa[] ) const override { 245 SkPMFloat a = Sk4f(aa[i]) * Sk4f(1.0f/255);
259 for (int i = 0; i < n; i++) { 246 b = b*a + d*(Sk4f(1)-a);
260 SkPMColor dst32 = SkPixel16ToPixel32(dst[i]); 247 }
261 dst32 = aa ? this->xfer32(dst32, src[i], aa[i]) 248 dst[i] = b.round();
262 : this->xfer32(dst32, src[i]);
263 dst[i] = SkPixel32ToPixel16(dst32);
264 } 249 }
265 } 250 }
266 251
267 private: 252 private:
268 inline SkPMColor xfer32(SkPMColor dst, SkPMColor src) const {
269 return fProcF(SkPMFloat(src), SkPMFloat(dst)).round();
270 }
271
272 inline SkPMColor xfer32(SkPMColor dst, SkPMColor src, SkAlpha aa) const {
273 SkPMFloat s(src),
274 d(dst),
275 b(fProcF(s,d));
276 // We do aa in full float precision before going back down to bytes, bec ause we can!
277 SkPMFloat a = Sk4f(aa) * Sk4f(1.0f/255);
278 b = b*a + d*(Sk4f(1)-a);
279 return b.round();
280 }
281
282 ProcF fProcF; 253 ProcF fProcF;
283 typedef SkProcCoeffXfermode INHERITED; 254 typedef SkProcCoeffXfermode INHERITED;
284 }; 255 };
285 256
286 static SkProcCoeffXfermode* SkCreate4pxXfermode(const ProcCoeff& rec, SkXfermode ::Mode mode) { 257 static SkProcCoeffXfermode* SkCreate4pxXfermode(const ProcCoeff& rec, SkXfermode ::Mode mode) {
287 switch (mode) { 258 switch (mode) {
288 #define CASE(Mode) case SkXfermode::k##Mode##_Mode: \ 259 #define CASE(Mode) case SkXfermode::k##Mode##_Mode: \
289 return SkNEW_ARGS(Sk4pxXfermode, (rec, mode, &Mode, &xfer_aa<Mode>)) 260 return SkNEW_ARGS(Sk4pxXfermode, (rec, mode, &Mode, &xfer_aa<Mode>))
290 CASE(Clear); 261 CASE(Clear);
291 CASE(Src); 262 CASE(Src);
(...skipping 29 matching lines...) Expand all
321 default: break; 292 default: break;
322 } 293 }
323 return nullptr; 294 return nullptr;
324 } 295 }
325 296
326 #endif 297 #endif
327 298
328 } // namespace 299 } // namespace
329 300
330 #endif//Sk4pxXfermode_DEFINED 301 #endif//Sk4pxXfermode_DEFINED
OLDNEW
« no previous file with comments | « src/core/Sk4px.h ('k') | src/opts/Sk4px_NEON.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698