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

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

Issue 1217013003: Edges matter, part 2. (Closed) Base URL: https://skia.googlesource.com/skia@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 | « 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 /* 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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 // There's no chance of underflow, and if we subtract p before adding src+ds t, no overflow. 61 // There's no chance of underflow, and if we subtract p before adding src+ds t, no overflow.
62 return (s - p) + (d - p.zeroAlphas()); 62 return (s - p) + (d - p.zeroAlphas());
63 } 63 }
64 64
65 XFERMODE(HardLight) { 65 XFERMODE(HardLight) {
66 auto alphas = SrcOver::Xfer(s,d); 66 auto alphas = SrcOver::Xfer(s,d);
67 67
68 auto sa = s.alphas(), 68 auto sa = s.alphas(),
69 da = d.alphas(); 69 da = d.alphas();
70 70
71 auto isDark = s < (sa-s); 71 auto isLite = (sa-s) < s;
72 72
73 auto dark = s*d << 1, 73 auto dark = s*d << 1,
74 lite = sa*da - ((da-d)*(sa-s) << 1), 74 lite = sa*da - ((da-d)*(sa-s) << 1),
75 both = s*da.inv() + d*sa.inv(); 75 both = s*da.inv() + d*sa.inv();
76 76
77 // TODO: do isDark in 16-bit so we only have to div255() once. 77 // TODO: do isLite in 16-bit so we only have to div255() once.
78 auto colors = isDark.thenElse((dark + both).div255(), 78 auto colors = isLite.thenElse((lite + both).div255(),
79 (lite + both).div255()); 79 (dark + both).div255());
80 return alphas.zeroColors() + colors.zeroAlphas(); 80 return alphas.zeroColors() + colors.zeroAlphas();
81 } 81 }
82 XFERMODE(Overlay) { return HardLight::Xfer(d,s); } 82 XFERMODE(Overlay) { return HardLight::Xfer(d,s); }
83 83
84 XFERMODE(Darken) { 84 XFERMODE(Darken) {
85 auto sda = s.approxMulDiv255(d.alphas()), 85 auto sda = s.approxMulDiv255(d.alphas()),
86 dsa = d.approxMulDiv255(s.alphas()); 86 dsa = d.approxMulDiv255(s.alphas());
87 auto srcover = s + (d - dsa), 87 auto srcover = s + (d - dsa),
88 dstover = d + (s - sda); 88 dstover = d + (s - sda);
89 auto alphas = srcover, 89 auto alphas = srcover,
90 colors = (sda < dsa).thenElse(srcover, dstover); 90 colors = (sda < dsa).thenElse(srcover, dstover);
91 return alphas.zeroColors() + colors.zeroAlphas(); 91 return alphas.zeroColors() + colors.zeroAlphas();
92 } 92 }
93 XFERMODE(Lighten) { 93 XFERMODE(Lighten) {
94 auto sda = s.approxMulDiv255(d.alphas()), 94 auto sda = s.approxMulDiv255(d.alphas()),
95 dsa = d.approxMulDiv255(s.alphas()); 95 dsa = d.approxMulDiv255(s.alphas());
96 auto srcover = s + (d - dsa), 96 auto srcover = s + (d - dsa),
97 dstover = d + (s - sda); 97 dstover = d + (s - sda);
98 auto alphas = srcover, 98 auto alphas = srcover,
99 colors = (sda < dsa).thenElse(dstover, srcover); 99 colors = (dsa < sda).thenElse(srcover, dstover);
100 return alphas.zeroColors() + colors.zeroAlphas(); 100 return alphas.zeroColors() + colors.zeroAlphas();
101 } 101 }
102 #undef XFERMODE 102 #undef XFERMODE
103 103
104 // Some xfermodes use math like divide or sqrt that's best done in floats 1 pixe l at a time. 104 // Some xfermodes use math like divide or sqrt that's best done in floats 1 pixe l at a time.
105 #define XFERMODE(Name) \ 105 #define XFERMODE(Name) \
106 struct Name { \ 106 struct Name { \
107 static SkPMFloat Xfer(const SkPMFloat&, const SkPMFloat&); \ 107 static SkPMFloat Xfer(const SkPMFloat&, const SkPMFloat&); \
108 static const SkXfermode::Mode kMode = SkXfermode::k##Name##_Mode; \ 108 static const SkXfermode::Mode kMode = SkXfermode::k##Name##_Mode; \
109 }; \ 109 }; \
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 #endif 247 #endif
248 default: break; 248 default: break;
249 } 249 }
250 #endif 250 #endif
251 return nullptr; 251 return nullptr;
252 } 252 }
253 253
254 } // namespace 254 } // namespace
255 255
256 #endif//Sk4pxXfermode_DEFINED 256 #endif//Sk4pxXfermode_DEFINED
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