OLD | NEW |
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 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 auto srcover = s + d*isa, | 134 auto srcover = s + d*isa, |
135 dstover = d + s*ida, | 135 dstover = d + s*ida, |
136 otherwise = sa*(da-Sk4f::Min(da, (da-d)*sa*s.approxInvert())) + s*ida +
d*isa; | 136 otherwise = sa*(da-Sk4f::Min(da, (da-d)*sa*s.approxInvert())) + s*ida +
d*isa; |
137 | 137 |
138 // Order matters here, preferring d==da over s==0. | 138 // Order matters here, preferring d==da over s==0. |
139 auto colors = (d == da).thenElse(dstover, | 139 auto colors = (d == da).thenElse(dstover, |
140 (s == Sk4f(0)).thenElse(srcover, | 140 (s == Sk4f(0)).thenElse(srcover, |
141 otherwise)); | 141 otherwise)); |
142 return srcover * SkPMFloat(1,0,0,0) + colors * SkPMFloat(0,1,1,1); | 142 return srcover * SkPMFloat(1,0,0,0) + colors * SkPMFloat(0,1,1,1); |
143 } | 143 } |
144 XFERMODE(SoftLight) { | |
145 auto sa = s.alphas(), | |
146 da = d.alphas(), | |
147 isa = Sk4f(1)-sa, | |
148 ida = Sk4f(1)-da; | |
149 | |
150 // Some common terms. | |
151 auto m = (da > Sk4f(0)).thenElse(d / da, Sk4f(0)), | |
152 s2 = Sk4f(2)*s, | |
153 m4 = Sk4f(4)*m; | |
154 | |
155 // The logic forks three ways: | |
156 // 1. dark src? | |
157 // 2. light src, dark dst? | |
158 // 3. light src, light dst? | |
159 auto darkSrc = d*(sa + (s2 - sa)*(Sk4f(1) - m)), // Used in case 1. | |
160 darkDst = (m4*m4 + m4)*(m - Sk4f(1)) + Sk4f(7)*m, // Used in case 2. | |
161 liteDst = m.sqrt() - m, // Used in case 3. | |
162 liteSrc = d*sa + da*(s2-sa)*(Sk4f(4)*d < da).thenElse(darkDst, liteDst)
; // Case 2 or 3? | |
163 | |
164 auto alpha = s + d*isa; | |
165 auto colors = s*ida + d*isa + (s2 < sa).thenElse(darkSrc, liteSrc);
// Case 1 or 2/3? | |
166 | |
167 return alpha * SkPMFloat(1,0,0,0) + colors * SkPMFloat(0,1,1,1); | |
168 } | |
169 #undef XFERMODE | 144 #undef XFERMODE |
170 | 145 |
171 // A reasonable fallback mode for doing AA is to simply apply the transfermode f
irst, | 146 // A reasonable fallback mode for doing AA is to simply apply the transfermode f
irst, |
172 // then linearly interpolate the AA. | 147 // then linearly interpolate the AA. |
173 template <typename Mode> | 148 template <typename Mode> |
174 static Sk4px xfer_aa(const Sk4px& s, const Sk4px& d, const Sk4px& aa) { | 149 static Sk4px xfer_aa(const Sk4px& s, const Sk4px& d, const Sk4px& aa) { |
175 Sk4px bw = Mode::Xfer(s, d); | 150 Sk4px bw = Mode::Xfer(s, d); |
176 return (bw * aa + d * aa.inv()).div255(); | 151 return (bw * aa + d * aa.inv()).div255(); |
177 } | 152 } |
178 | 153 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 case SkXfermode::kDifference_Mode: return SkT4pxXfermode<Difference>::Cr
eate(rec); | 237 case SkXfermode::kDifference_Mode: return SkT4pxXfermode<Difference>::Cr
eate(rec); |
263 case SkXfermode::kExclusion_Mode: return SkT4pxXfermode<Exclusion>::Cre
ate(rec); | 238 case SkXfermode::kExclusion_Mode: return SkT4pxXfermode<Exclusion>::Cre
ate(rec); |
264 #if !defined(SK_SUPPORT_LEGACY_XFERMODES) // For staging in Chrome (layout test
s). | 239 #if !defined(SK_SUPPORT_LEGACY_XFERMODES) // For staging in Chrome (layout test
s). |
265 case SkXfermode::kHardLight_Mode: return SkT4pxXfermode<HardLight>::Cre
ate(rec); | 240 case SkXfermode::kHardLight_Mode: return SkT4pxXfermode<HardLight>::Cre
ate(rec); |
266 case SkXfermode::kOverlay_Mode: return SkT4pxXfermode<Overlay>::Creat
e(rec); | 241 case SkXfermode::kOverlay_Mode: return SkT4pxXfermode<Overlay>::Creat
e(rec); |
267 case SkXfermode::kDarken_Mode: return SkT4pxXfermode<Darken>::Create
(rec); | 242 case SkXfermode::kDarken_Mode: return SkT4pxXfermode<Darken>::Create
(rec); |
268 case SkXfermode::kLighten_Mode: return SkT4pxXfermode<Lighten>::Creat
e(rec); | 243 case SkXfermode::kLighten_Mode: return SkT4pxXfermode<Lighten>::Creat
e(rec); |
269 | 244 |
270 case SkXfermode::kColorDodge_Mode: return SkTPMFloatXfermode<ColorDodge>
::Create(rec); | 245 case SkXfermode::kColorDodge_Mode: return SkTPMFloatXfermode<ColorDodge>
::Create(rec); |
271 case SkXfermode::kColorBurn_Mode: return SkTPMFloatXfermode<ColorBurn>:
:Create(rec); | 246 case SkXfermode::kColorBurn_Mode: return SkTPMFloatXfermode<ColorBurn>:
:Create(rec); |
272 case SkXfermode::kSoftLight_Mode: return SkTPMFloatXfermode<SoftLight>:
:Create(rec); | |
273 #endif | 247 #endif |
274 default: break; | 248 default: break; |
275 } | 249 } |
276 #endif | 250 #endif |
277 return nullptr; | 251 return nullptr; |
278 } | 252 } |
279 | 253 |
280 } // namespace | 254 } // namespace |
281 | 255 |
282 #endif//Sk4pxXfermode_DEFINED | 256 #endif//Sk4pxXfermode_DEFINED |
OLD | NEW |