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

Side by Side Diff: src/opts/SkXfermode_opts.h

Issue 1569373002: Clean up order of arguments to d,s[,aa]. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 11 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
11 #include "Sk4px.h" 11 #include "Sk4px.h"
12 #include "SkNx.h" 12 #include "SkNx.h"
13 #include "SkXfermode_proccoeff.h" 13 #include "SkXfermode_proccoeff.h"
14 14
15 namespace { 15 namespace {
16 16
17 // Most xfermodes can be done most efficiently 4 pixels at a time in 8 or 16-bit fixed point. 17 // Most xfermodes can be done most efficiently 4 pixels at a time in 8 or 16-bit fixed point.
18 #define XFERMODE(Xfermode) \ 18 #define XFERMODE(Xfermode) \
19 struct Xfermode { Sk4px operator()(const Sk4px&, const Sk4px&) const; }; \ 19 struct Xfermode { Sk4px operator()(const Sk4px&, const Sk4px&) const; }; \
20 inline Sk4px Xfermode::operator()(const Sk4px& s, const Sk4px& d) const 20 inline Sk4px Xfermode::operator()(const Sk4px& d, const Sk4px& s) const
21 21
22 XFERMODE(Clear) { return Sk4px::DupPMColor(0); } 22 XFERMODE(Clear) { return Sk4px::DupPMColor(0); }
23 XFERMODE(Src) { return s; } 23 XFERMODE(Src) { return s; }
24 XFERMODE(Dst) { return d; } 24 XFERMODE(Dst) { return d; }
25 XFERMODE(SrcIn) { return s.approxMulDiv255(d.alphas() ); } 25 XFERMODE(SrcIn) { return s.approxMulDiv255(d.alphas() ); }
26 XFERMODE(SrcOut) { return s.approxMulDiv255(d.alphas().inv()); } 26 XFERMODE(SrcOut) { return s.approxMulDiv255(d.alphas().inv()); }
27 XFERMODE(SrcOver) { return s + d.approxMulDiv255(s.alphas().inv()); } 27 XFERMODE(SrcOver) { return s + d.approxMulDiv255(s.alphas().inv()); }
28 XFERMODE(DstIn) { return SrcIn ()(d,s); } 28 XFERMODE(DstIn) { return SrcIn ()(s,d); }
29 XFERMODE(DstOut) { return SrcOut ()(d,s); } 29 XFERMODE(DstOut) { return SrcOut ()(s,d); }
30 XFERMODE(DstOver) { return SrcOver()(d,s); } 30 XFERMODE(DstOver) { return SrcOver()(s,d); }
31 31
32 // [ S * Da + (1 - Sa) * D] 32 // [ S * Da + (1 - Sa) * D]
33 XFERMODE(SrcATop) { return (s * d.alphas() + d * s.alphas().inv()).div255(); } 33 XFERMODE(SrcATop) { return (s * d.alphas() + d * s.alphas().inv()).div255(); }
34 XFERMODE(DstATop) { return SrcATop()(d,s); } 34 XFERMODE(DstATop) { return SrcATop()(s,d); }
35 //[ S * (1 - Da) + (1 - Sa) * D ] 35 //[ S * (1 - Da) + (1 - Sa) * D ]
36 XFERMODE(Xor) { return (s * d.alphas().inv() + d * s.alphas().inv()).div255(); } 36 XFERMODE(Xor) { return (s * d.alphas().inv() + d * s.alphas().inv()).div255(); }
37 // [S + D ] 37 // [S + D ]
38 XFERMODE(Plus) { return s.saturatedAdd(d); } 38 XFERMODE(Plus) { return s.saturatedAdd(d); }
39 // [S * D ] 39 // [S * D ]
40 XFERMODE(Modulate) { return s.approxMulDiv255(d); } 40 XFERMODE(Modulate) { return s.approxMulDiv255(d); }
41 // [S + D - S * D] 41 // [S + D - S * D]
42 XFERMODE(Screen) { 42 XFERMODE(Screen) {
43 // Doing the math as S + (1-S)*D or S + (D - S*D) means the add and subtract can be done 43 // Doing the math as S + (1-S)*D or S + (D - S*D) means the add and subtract can be done
44 // in 8-bit space without overflow. S + (1-S)*D is a touch faster because i nv() is cheap. 44 // in 8-bit space without overflow. S + (1-S)*D is a touch faster because i nv() is cheap.
(...skipping 29 matching lines...) Expand all
74 auto isLite = ((sa-s) < s).widenLoHi(); 74 auto isLite = ((sa-s) < s).widenLoHi();
75 75
76 auto lite = sa*da - ((da-d)*(sa-s) << 1), 76 auto lite = sa*da - ((da-d)*(sa-s) << 1),
77 dark = s*d << 1, 77 dark = s*d << 1,
78 both = s*da.inv() + d*sa.inv(); 78 both = s*da.inv() + d*sa.inv();
79 79
80 auto alphas = srcover; 80 auto alphas = srcover;
81 auto colors = (both + isLite.thenElse(lite, dark)).div255(); 81 auto colors = (both + isLite.thenElse(lite, dark)).div255();
82 return alphas.zeroColors() + colors.zeroAlphas(); 82 return alphas.zeroColors() + colors.zeroAlphas();
83 } 83 }
84 XFERMODE(Overlay) { return HardLight()(d,s); } 84 XFERMODE(Overlay) { return HardLight()(s,d); }
85 85
86 XFERMODE(Darken) { 86 XFERMODE(Darken) {
87 auto sa = s.alphas(), 87 auto sa = s.alphas(),
88 da = d.alphas(); 88 da = d.alphas();
89 89
90 auto sda = (s*da).div255(), 90 auto sda = (s*da).div255(),
91 dsa = (d*sa).div255(); 91 dsa = (d*sa).div255();
92 92
93 auto srcover = s + (d * sa.inv()).div255(), 93 auto srcover = s + (d * sa.inv()).div255(),
94 dstover = d + (s * da.inv()).div255(); 94 dstover = d + (s * da.inv()).div255();
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 auto alpha = s + d*isa; 179 auto alpha = s + d*isa;
180 auto colors = s*ida + d*isa + (s2 <= sa).thenElse(darkSrc, liteSrc); // Case 1 or 2/3? 180 auto colors = s*ida + d*isa + (s2 <= sa).thenElse(darkSrc, liteSrc); // Case 1 or 2/3?
181 181
182 return a_rgb(alpha, colors); 182 return a_rgb(alpha, colors);
183 } 183 }
184 #undef XFERMODE 184 #undef XFERMODE
185 185
186 // A reasonable fallback mode for doing AA is to simply apply the transfermode f irst, 186 // A reasonable fallback mode for doing AA is to simply apply the transfermode f irst,
187 // then linearly interpolate the AA. 187 // then linearly interpolate the AA.
188 template <typename Xfermode> 188 template <typename Xfermode>
189 static Sk4px xfer_aa(const Sk4px& s, const Sk4px& d, const Sk4px& aa) { 189 static Sk4px xfer_aa(const Sk4px& d, const Sk4px& s, const Sk4px& aa) {
190 Sk4px bw = Xfermode()(s, d); 190 Sk4px bw = Xfermode()(d, s);
191 return (bw * aa + d * aa.inv()).div255(); 191 return (bw * aa + d * aa.inv()).div255();
192 } 192 }
193 193
194 // For some transfermodes we specialize AA, either for correctness or performanc e. 194 // For some transfermodes we specialize AA, either for correctness or performanc e.
195 #define XFERMODE_AA(Xfermode) \ 195 #define XFERMODE_AA(Xfermode) \
196 template <> Sk4px xfer_aa<Xfermode>(const Sk4px& s, const Sk4px& d, const Sk 4px& aa) 196 template <> Sk4px xfer_aa<Xfermode>(const Sk4px& d, const Sk4px& s, const Sk 4px& aa)
197 197
198 // Plus' clamp needs to happen after AA. skia:3852 198 // Plus' clamp needs to happen after AA. skia:3852
199 XFERMODE_AA(Plus) { // [ clamp( (1-AA)D + (AA)(S+D) ) == clamp(D + AA*S) ] 199 XFERMODE_AA(Plus) { // [ clamp( (1-AA)D + (AA)(S+D) ) == clamp(D + AA*S) ]
200 return d.saturatedAdd(s.approxMulDiv255(aa)); 200 return d.saturatedAdd(s.approxMulDiv255(aa));
201 } 201 }
202 202
203 #undef XFERMODE_AA 203 #undef XFERMODE_AA
204 204
205 template <typename Xfermode> 205 template <typename Xfermode>
206 class Sk4pxXfermode : public SkProcCoeffXfermode { 206 class Sk4pxXfermode : public SkProcCoeffXfermode {
207 public: 207 public:
208 Sk4pxXfermode(const ProcCoeff& rec, SkXfermode::Mode mode) 208 Sk4pxXfermode(const ProcCoeff& rec, SkXfermode::Mode mode)
209 : INHERITED(rec, mode) {} 209 : INHERITED(rec, mode) {}
210 210
211 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[ ]) const override { 211 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[ ]) const override {
212 if (nullptr == aa) { 212 if (nullptr == aa) {
213 Sk4px::MapDstSrc(n, dst, src, [&](const Sk4px& dst4, const Sk4px& sr c4) { 213 Sk4px::MapDstSrc(n, dst, src, Xfermode());
214 return Xfermode()(src4, dst4);
215 });
216 } else { 214 } else {
217 Sk4px::MapDstSrcAlpha(n, dst, src, aa, 215 Sk4px::MapDstSrcAlpha(n, dst, src, aa, xfer_aa<Xfermode>);
218 [&](const Sk4px& dst4, const Sk4px& src4, const Sk4px& alpha ) {
219 return xfer_aa<Xfermode>(src4, dst4, alpha);
220 });
221 } 216 }
222 } 217 }
223 218
224 void xfer16(uint16_t dst[], const SkPMColor src[], int n, const SkAlpha aa[] ) const override { 219 void xfer16(uint16_t dst[], const SkPMColor src[], int n, const SkAlpha aa[] ) const override {
225 SkPMColor dst32[4]; 220 SkPMColor dst32[4];
226 while (n >= 4) { 221 while (n >= 4) {
227 dst32[0] = SkPixel16ToPixel32(dst[0]); 222 dst32[0] = SkPixel16ToPixel32(dst[0]);
228 dst32[1] = SkPixel16ToPixel32(dst[1]); 223 dst32[1] = SkPixel16ToPixel32(dst[1]);
229 dst32[2] = SkPixel16ToPixel32(dst[2]); 224 dst32[2] = SkPixel16ToPixel32(dst[2]);
230 dst32[3] = SkPixel16ToPixel32(dst[3]); 225 dst32[3] = SkPixel16ToPixel32(dst[3]);
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 #undef CASE 337 #undef CASE
343 338
344 default: break; 339 default: break;
345 } 340 }
346 return nullptr; 341 return nullptr;
347 } 342 }
348 343
349 } // namespace SK_OPTS_NS 344 } // namespace SK_OPTS_NS
350 345
351 #endif//Sk4pxXfermode_DEFINED 346 #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