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

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

Issue 1245673002: 565 support for SIMD xfermodes (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix typo 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
225 private: 238 private:
226 Proc4 fProc4; 239 Proc4 fProc4;
227 AAProc4 fAAProc4; 240 AAProc4 fAAProc4;
228 typedef SkProcCoeffXfermode INHERITED; 241 typedef SkProcCoeffXfermode INHERITED;
229 }; 242 };
230 243
231 class SkPMFloatXfermode : public SkProcCoeffXfermode { 244 class SkPMFloatXfermode : public SkProcCoeffXfermode {
232 public: 245 public:
233 typedef SkPMFloat (SK_VECTORCALL *ProcF)(SkPMFloat, SkPMFloat); 246 typedef SkPMFloat (SK_VECTORCALL *ProcF)(SkPMFloat, SkPMFloat);
234 SkPMFloatXfermode(const ProcCoeff& rec, SkXfermode::Mode mode, ProcF procf) 247 SkPMFloatXfermode(const ProcCoeff& rec, SkXfermode::Mode mode, ProcF procf)
235 : INHERITED(rec, mode) 248 : INHERITED(rec, mode)
236 , fProcF(procf) {} 249 , fProcF(procf) {}
237 250
238 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[ ]) const override { 251 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[ ]) const override {
239 for (int i = 0; i < n; i++) { 252 for (int i = 0; i < n; i++) {
240 SkPMFloat s(src[i]), 253 dst[i] = aa ? this->xfer32(dst[i], src[i], aa[i])
241 d(dst[i]), 254 : this->xfer32(dst[i], src[i]);
242 b(fProcF(s,d)); 255 }
243 if (aa) { 256 }
244 // We do aa in full float precision before going back down to by tes, because we can! 257
245 SkPMFloat a = Sk4f(aa[i]) * Sk4f(1.0f/255); 258 void xfer16(uint16_t dst[], const SkPMColor src[], int n, const SkAlpha aa[] ) const override {
246 b = b*a + d*(Sk4f(1)-a); 259 for (int i = 0; i < n; i++) {
247 } 260 SkPMColor dst32 = SkPixel16ToPixel32(dst[i]);
248 dst[i] = b.round(); 261 dst32 = aa ? this->xfer32(dst32, src[i], aa[i])
262 : this->xfer32(dst32, src[i]);
263 dst[i] = SkPixel32ToPixel16(dst32);
249 } 264 }
250 } 265 }
251 266
252 private: 267 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
253 ProcF fProcF; 282 ProcF fProcF;
254 typedef SkProcCoeffXfermode INHERITED; 283 typedef SkProcCoeffXfermode INHERITED;
255 }; 284 };
256 285
257 static SkProcCoeffXfermode* SkCreate4pxXfermode(const ProcCoeff& rec, SkXfermode ::Mode mode) { 286 static SkProcCoeffXfermode* SkCreate4pxXfermode(const ProcCoeff& rec, SkXfermode ::Mode mode) {
258 switch (mode) { 287 switch (mode) {
259 #define CASE(Mode) case SkXfermode::k##Mode##_Mode: \ 288 #define CASE(Mode) case SkXfermode::k##Mode##_Mode: \
260 return SkNEW_ARGS(Sk4pxXfermode, (rec, mode, &Mode, &xfer_aa<Mode>)) 289 return SkNEW_ARGS(Sk4pxXfermode, (rec, mode, &Mode, &xfer_aa<Mode>))
261 CASE(Clear); 290 CASE(Clear);
262 CASE(Src); 291 CASE(Src);
(...skipping 29 matching lines...) Expand all
292 default: break; 321 default: break;
293 } 322 }
294 return nullptr; 323 return nullptr;
295 } 324 }
296 325
297 #endif 326 #endif
298 327
299 } // namespace 328 } // namespace
300 329
301 #endif//Sk4pxXfermode_DEFINED 330 #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