OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
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 #include "SkXfermode.h" | 8 #include "SkXfermode.h" |
9 #include "SkXfermode_proccoeff.h" | 9 #include "SkXfermode_proccoeff.h" |
10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 float da = d.kth<SkPM4f::A>(); | 313 float da = d.kth<SkPM4f::A>(); |
314 float dr = d.kth<SkPM4f::R>(); | 314 float dr = d.kth<SkPM4f::R>(); |
315 float dg = d.kth<SkPM4f::G>(); | 315 float dg = d.kth<SkPM4f::G>(); |
316 float db = d.kth<SkPM4f::B>(); | 316 float db = d.kth<SkPM4f::B>(); |
317 | 317 |
318 float Sr = sr; | 318 float Sr = sr; |
319 float Sg = sg; | 319 float Sg = sg; |
320 float Sb = sb; | 320 float Sb = sb; |
321 SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa); | 321 SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa); |
322 | 322 |
323 return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Sr, Sg,
Sb), | 323 Sk4f res = color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Sr,
Sg, Sb), |
324 sa + da - sa * da); | 324 sa + da - sa * da); |
| 325 // Can return tiny negative values ... |
| 326 return Sk4f::Max(res, Sk4f(0)); |
325 } | 327 } |
326 | 328 |
327 static Sk4f luminosity_4f(const Sk4f& s, const Sk4f& d) { | 329 static Sk4f luminosity_4f(const Sk4f& s, const Sk4f& d) { |
328 float sa = s.kth<SkPM4f::A>(); | 330 float sa = s.kth<SkPM4f::A>(); |
329 float sr = s.kth<SkPM4f::R>(); | 331 float sr = s.kth<SkPM4f::R>(); |
330 float sg = s.kth<SkPM4f::G>(); | 332 float sg = s.kth<SkPM4f::G>(); |
331 float sb = s.kth<SkPM4f::B>(); | 333 float sb = s.kth<SkPM4f::B>(); |
332 | 334 |
333 float da = d.kth<SkPM4f::A>(); | 335 float da = d.kth<SkPM4f::A>(); |
334 float dr = d.kth<SkPM4f::R>(); | 336 float dr = d.kth<SkPM4f::R>(); |
335 float dg = d.kth<SkPM4f::G>(); | 337 float dg = d.kth<SkPM4f::G>(); |
336 float db = d.kth<SkPM4f::B>(); | 338 float db = d.kth<SkPM4f::B>(); |
337 | 339 |
338 float Dr = dr; | 340 float Dr = dr; |
339 float Dg = dg; | 341 float Dg = dg; |
340 float Db = db; | 342 float Db = db; |
341 SetLum(&Dr, &Dg, &Db, sa * da, Lum(sr, sg, sb) * da); | 343 SetLum(&Dr, &Dg, &Db, sa * da, Lum(sr, sg, sb) * da); |
342 | 344 |
343 return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr, Dg,
Db), | 345 Sk4f res = color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr,
Dg, Db), |
344 sa + da - sa * da); | 346 sa + da - sa * da); |
| 347 // Can return tiny negative values ... |
| 348 return Sk4f::Max(res, Sk4f(0)); |
345 } | 349 } |
346 | 350 |
347 /////////////////////////////////////////////////////////////////////////////// | 351 /////////////////////////////////////////////////////////////////////////////// |
348 | 352 |
349 // kClear_Mode, //!< [0, 0] | 353 // kClear_Mode, //!< [0, 0] |
350 static SkPMColor clear_modeproc(SkPMColor src, SkPMColor dst) { | 354 static SkPMColor clear_modeproc(SkPMColor src, SkPMColor dst) { |
351 return 0; | 355 return 0; |
352 } | 356 } |
353 | 357 |
354 // kSrc_Mode, //!< [Sa, Sc] | 358 // kSrc_Mode, //!< [Sa, Sc] |
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
914 static SkPM4f as_pm4f(const Sk4f& x) { | 918 static SkPM4f as_pm4f(const Sk4f& x) { |
915 SkPM4f pm4; | 919 SkPM4f pm4; |
916 x.store(pm4.fVec); | 920 x.store(pm4.fVec); |
917 return pm4; | 921 return pm4; |
918 } | 922 } |
919 | 923 |
920 static Sk4f as_4f(const SkPM4f& pm4) { | 924 static Sk4f as_4f(const SkPM4f& pm4) { |
921 return Sk4f::Load(pm4.fVec); | 925 return Sk4f::Load(pm4.fVec); |
922 } | 926 } |
923 | 927 |
924 template <Sk4f (blend)(const Sk4f&, const Sk4f&)> SkPM4f proc_4f(const SkPM4f& s
, const SkPM4f& d) { | 928 static void assert_unit(const SkPM4f& r) { |
925 SkPM4f r = as_pm4f(blend(as_4f(s), as_4f(d))); | |
926 #ifdef SK_DEBUG | 929 #ifdef SK_DEBUG |
927 const float min = 0; | 930 const float min = 0; |
928 const float max = 1; | 931 const float max = 1; |
929 for (int i = 0; i < 4; ++i) { | 932 for (int i = 0; i < 4; ++i) { |
930 SkASSERT(r.fVec[i] >= min && r.fVec[i] <= max); | 933 SkASSERT(r.fVec[i] >= min && r.fVec[i] <= max); |
931 } | 934 } |
932 #endif | 935 #endif |
| 936 } |
| 937 |
| 938 template <Sk4f (blend)(const Sk4f&, const Sk4f&)> SkPM4f proc_4f(const SkPM4f& s
, const SkPM4f& d) { |
| 939 assert_unit(s); |
| 940 assert_unit(d); |
| 941 SkPM4f r = as_pm4f(blend(as_4f(s), as_4f(d))); |
| 942 assert_unit(r); |
933 return r; | 943 return r; |
934 } | 944 } |
935 | 945 |
936 const ProcCoeff gProcCoeffs[] = { | 946 const ProcCoeff gProcCoeffs[] = { |
937 { clear_modeproc, proc_4f<clear_4f>, SkXfermode::kZero_Coeff,
SkXfermode::kZero_Coeff }, | 947 { clear_modeproc, proc_4f<clear_4f>, SkXfermode::kZero_Coeff,
SkXfermode::kZero_Coeff }, |
938 { src_modeproc, proc_4f<src_4f>, SkXfermode::kOne_Coeff,
SkXfermode::kZero_Coeff }, | 948 { src_modeproc, proc_4f<src_4f>, SkXfermode::kOne_Coeff,
SkXfermode::kZero_Coeff }, |
939 { dst_modeproc, proc_4f<dst_4f>, SkXfermode::kZero_Coeff,
SkXfermode::kOne_Coeff }, | 949 { dst_modeproc, proc_4f<dst_4f>, SkXfermode::kZero_Coeff,
SkXfermode::kOne_Coeff }, |
940 { srcover_modeproc, proc_4f<srcover_4f>, SkXfermode::kOne_Coeff,
SkXfermode::kISA_Coeff }, | 950 { srcover_modeproc, proc_4f<srcover_4f>, SkXfermode::kOne_Coeff,
SkXfermode::kISA_Coeff }, |
941 { dstover_modeproc, proc_4f<dstover_4f>, SkXfermode::kIDA_Coeff,
SkXfermode::kOne_Coeff }, | 951 { dstover_modeproc, proc_4f<dstover_4f>, SkXfermode::kIDA_Coeff,
SkXfermode::kOne_Coeff }, |
942 { srcin_modeproc, proc_4f<srcin_4f>, SkXfermode::kDA_Coeff,
SkXfermode::kZero_Coeff }, | 952 { srcin_modeproc, proc_4f<srcin_4f>, SkXfermode::kDA_Coeff,
SkXfermode::kZero_Coeff }, |
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1389 if (!xfer) { | 1399 if (!xfer) { |
1390 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; | 1400 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; |
1391 } | 1401 } |
1392 | 1402 |
1393 return xfer->isOpaque(opacityType); | 1403 return xfer->isOpaque(opacityType); |
1394 } | 1404 } |
1395 | 1405 |
1396 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1406 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
1397 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1407 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
1398 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1408 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |