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 } |
144 #undef XFERMODE | 169 #undef XFERMODE |
145 | 170 |
146 // A reasonable fallback mode for doing AA is to simply apply the transfermode f
irst, | 171 // A reasonable fallback mode for doing AA is to simply apply the transfermode f
irst, |
147 // then linearly interpolate the AA. | 172 // then linearly interpolate the AA. |
148 template <typename Mode> | 173 template <typename Mode> |
149 static Sk4px xfer_aa(const Sk4px& s, const Sk4px& d, const Sk4px& aa) { | 174 static Sk4px xfer_aa(const Sk4px& s, const Sk4px& d, const Sk4px& aa) { |
150 Sk4px bw = Mode::Xfer(s, d); | 175 Sk4px bw = Mode::Xfer(s, d); |
151 return (bw * aa + d * aa.inv()).div255(); | 176 return (bw * aa + d * aa.inv()).div255(); |
152 } | 177 } |
153 | 178 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 case SkXfermode::kDifference_Mode: return SkT4pxXfermode<Difference>::Cr
eate(rec); | 262 case SkXfermode::kDifference_Mode: return SkT4pxXfermode<Difference>::Cr
eate(rec); |
238 case SkXfermode::kExclusion_Mode: return SkT4pxXfermode<Exclusion>::Cre
ate(rec); | 263 case SkXfermode::kExclusion_Mode: return SkT4pxXfermode<Exclusion>::Cre
ate(rec); |
239 #if !defined(SK_SUPPORT_LEGACY_XFERMODES) // For staging in Chrome (layout test
s). | 264 #if !defined(SK_SUPPORT_LEGACY_XFERMODES) // For staging in Chrome (layout test
s). |
240 case SkXfermode::kHardLight_Mode: return SkT4pxXfermode<HardLight>::Cre
ate(rec); | 265 case SkXfermode::kHardLight_Mode: return SkT4pxXfermode<HardLight>::Cre
ate(rec); |
241 case SkXfermode::kOverlay_Mode: return SkT4pxXfermode<Overlay>::Creat
e(rec); | 266 case SkXfermode::kOverlay_Mode: return SkT4pxXfermode<Overlay>::Creat
e(rec); |
242 case SkXfermode::kDarken_Mode: return SkT4pxXfermode<Darken>::Create
(rec); | 267 case SkXfermode::kDarken_Mode: return SkT4pxXfermode<Darken>::Create
(rec); |
243 case SkXfermode::kLighten_Mode: return SkT4pxXfermode<Lighten>::Creat
e(rec); | 268 case SkXfermode::kLighten_Mode: return SkT4pxXfermode<Lighten>::Creat
e(rec); |
244 | 269 |
245 case SkXfermode::kColorDodge_Mode: return SkTPMFloatXfermode<ColorDodge>
::Create(rec); | 270 case SkXfermode::kColorDodge_Mode: return SkTPMFloatXfermode<ColorDodge>
::Create(rec); |
246 case SkXfermode::kColorBurn_Mode: return SkTPMFloatXfermode<ColorBurn>:
:Create(rec); | 271 case SkXfermode::kColorBurn_Mode: return SkTPMFloatXfermode<ColorBurn>:
:Create(rec); |
| 272 case SkXfermode::kSoftLight_Mode: return SkTPMFloatXfermode<SoftLight>:
:Create(rec); |
247 #endif | 273 #endif |
248 default: break; | 274 default: break; |
249 } | 275 } |
250 #endif | 276 #endif |
251 return nullptr; | 277 return nullptr; |
252 } | 278 } |
253 | 279 |
254 } // namespace | 280 } // namespace |
255 | 281 |
256 #endif//Sk4pxXfermode_DEFINED | 282 #endif//Sk4pxXfermode_DEFINED |
OLD | NEW |