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 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 |
OLD | NEW |