Chromium Code Reviews| Index: src/core/SkXfermode.cpp |
| diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp |
| index 86e3ed5dcf8e579b9e3742b9026c551758a90731..85d25cd1c58111998c6875d98f969f4c736842fe 100644 |
| --- a/src/core/SkXfermode.cpp |
| +++ b/src/core/SkXfermode.cpp |
| @@ -47,21 +47,45 @@ static inline int clamp_div255round(int prod) { |
| } |
| /////////////////////////////////////////////////////////////////////////////// |
| +#include "SkNx.h" |
| + |
| +static SkPM4f as_pm4f(const Sk4f& x) { |
| + SkPM4f pm4; |
| + x.store(pm4.fVec); |
| + return pm4; |
| +} |
| + |
| +static Sk4f as_4f(const SkPM4f& pm4) { |
| + return Sk4f::Load(pm4.fVec); |
| +} |
| + |
| +static SkPM4f not_implemented_yet_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return {{ 0.5f, 1.0f, 0.25f, 0.5f }}; |
| +} |
| // kClear_Mode, //!< [0, 0] |
| static SkPMColor clear_modeproc(SkPMColor src, SkPMColor dst) { |
| return 0; |
| } |
| +static SkPM4f clear_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return{{ 0, 0, 0, 0 }}; |
| +} |
| // kSrc_Mode, //!< [Sa, Sc] |
| static SkPMColor src_modeproc(SkPMColor src, SkPMColor dst) { |
| return src; |
| } |
| +static SkPM4f src_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return src; |
| +} |
| // kDst_Mode, //!< [Da, Dc] |
| static SkPMColor dst_modeproc(SkPMColor src, SkPMColor dst) { |
| return dst; |
| } |
| +static SkPM4f dst_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return dst; |
| +} |
| // kSrcOver_Mode, //!< [Sa + Da - Sa*Da, Sc + (1 - Sa)*Dc] |
| static SkPMColor srcover_modeproc(SkPMColor src, SkPMColor dst) { |
| @@ -75,6 +99,9 @@ static SkPMColor srcover_modeproc(SkPMColor src, SkPMColor dst) { |
| return src + SkAlphaMulQ(dst, 256 - SkGetPackedA32(src)); |
| #endif |
| } |
| +static SkPM4f srcover_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
|
mtklein
2016/02/08 18:27:22
Maybe we can make these easier to read with some l
reed1
2016/02/08 19:52:49
Done.
|
| + return as_pm4f(as_4f(src) + as_4f(dst) * Sk4f(1 - src.a())); |
| +} |
| // kDstOver_Mode, //!< [Sa + Da - Sa*Da, Dc + (1 - Da)*Sc] |
| static SkPMColor dstover_modeproc(SkPMColor src, SkPMColor dst) { |
| @@ -82,26 +109,41 @@ static SkPMColor dstover_modeproc(SkPMColor src, SkPMColor dst) { |
| // see srcover's comment about the 256 for opaqueness guarantees |
| return dst + SkAlphaMulQ(src, 256 - SkGetPackedA32(dst)); |
| } |
| +static SkPM4f dstover_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return as_pm4f(as_4f(dst) + as_4f(src) * Sk4f(1 - dst.a())); |
|
mtklein
2016/02/08 18:27:22
return srcover_proc4f(dst, src); etc ?
|
| +} |
| // kSrcIn_Mode, //!< [Sa * Da, Sc * Da] |
| static SkPMColor srcin_modeproc(SkPMColor src, SkPMColor dst) { |
| return SkAlphaMulQ(src, SkAlpha255To256(SkGetPackedA32(dst))); |
| } |
| +static SkPM4f srcin_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return as_pm4f(as_4f(src) * Sk4f(dst.a())); |
| +} |
| // kDstIn_Mode, //!< [Sa * Da, Sa * Dc] |
| static SkPMColor dstin_modeproc(SkPMColor src, SkPMColor dst) { |
| return SkAlphaMulQ(dst, SkAlpha255To256(SkGetPackedA32(src))); |
| } |
| +static SkPM4f dstin_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return as_pm4f(as_4f(dst) * Sk4f(src.a())); |
| +} |
| // kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)] |
| static SkPMColor srcout_modeproc(SkPMColor src, SkPMColor dst) { |
| return SkAlphaMulQ(src, SkAlpha255To256(255 - SkGetPackedA32(dst))); |
| } |
| +static SkPM4f srcout_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return as_pm4f(as_4f(src) * Sk4f(1 - dst.a())); |
| +} |
| // kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)] |
| static SkPMColor dstout_modeproc(SkPMColor src, SkPMColor dst) { |
| return SkAlphaMulQ(dst, SkAlpha255To256(255 - SkGetPackedA32(src))); |
| } |
| +static SkPM4f dstout_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return as_pm4f(as_4f(dst) * Sk4f(1 - src.a())); |
| +} |
| // kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] |
| static SkPMColor srcatop_modeproc(SkPMColor src, SkPMColor dst) { |
| @@ -117,6 +159,9 @@ static SkPMColor srcatop_modeproc(SkPMColor src, SkPMColor dst) { |
| SkAlphaMulAlpha(da, SkGetPackedB32(src)) + |
| SkAlphaMulAlpha(isa, SkGetPackedB32(dst))); |
| } |
| +static SkPM4f srcatop_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return as_pm4f(as_4f(src) * Sk4f(dst.a()) + as_4f(dst) * Sk4f(1 - src.a())); |
| +} |
| // kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)] |
| static SkPMColor dstatop_modeproc(SkPMColor src, SkPMColor dst) { |
| @@ -132,6 +177,9 @@ static SkPMColor dstatop_modeproc(SkPMColor src, SkPMColor dst) { |
| SkAlphaMulAlpha(ida, SkGetPackedB32(src)) + |
| SkAlphaMulAlpha(sa, SkGetPackedB32(dst))); |
| } |
| +static SkPM4f dstatop_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return as_pm4f(as_4f(dst) * Sk4f(src.a()) + as_4f(src) * Sk4f(1 - dst.a())); |
| +} |
| // kXor_Mode [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] |
| static SkPMColor xor_modeproc(SkPMColor src, SkPMColor dst) { |
| @@ -148,6 +196,9 @@ static SkPMColor xor_modeproc(SkPMColor src, SkPMColor dst) { |
| SkAlphaMulAlpha(ida, SkGetPackedB32(src)) + |
| SkAlphaMulAlpha(isa, SkGetPackedB32(dst))); |
| } |
| +static SkPM4f xor_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return as_pm4f(as_4f(src) * Sk4f(1 - dst.a()) + as_4f(dst) * Sk4f(1 - src.a())); |
| +} |
| /////////////////////////////////////////////////////////////////////////////// |
| @@ -159,6 +210,9 @@ static SkPMColor plus_modeproc(SkPMColor src, SkPMColor dst) { |
| unsigned a = saturated_add(SkGetPackedA32(src), SkGetPackedA32(dst)); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f plus_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return as_pm4f(Sk4f::Min(as_4f(src) + as_4f(dst), Sk4f(1))); |
| +} |
| // kModulate_Mode |
| static SkPMColor modulate_modeproc(SkPMColor src, SkPMColor dst) { |
| @@ -168,6 +222,9 @@ static SkPMColor modulate_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = SkAlphaMulAlpha(SkGetPackedB32(src), SkGetPackedB32(dst)); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f modulate_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return as_pm4f(as_4f(src) * as_4f(dst)); |
| +} |
| static inline int srcover_byte(int a, int b) { |
| return a + b - SkAlphaMulAlpha(a, b); |
| @@ -189,6 +246,12 @@ static SkPMColor multiply_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = blendfunc_multiply_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f multiply_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + const Sk4f s4 = as_4f(src); |
| + const Sk4f d4 = as_4f(dst); |
| + const Sk4f r4 = s4 * Sk4f(1 - dst.a()) + d4 * Sk4f(1 - src.a()) + s4 * d4; |
| + return as_pm4f(Sk4f::Min(r4, Sk4f(1))); |
| +} |
| // kScreen_Mode |
| static SkPMColor screen_modeproc(SkPMColor src, SkPMColor dst) { |
| @@ -198,6 +261,11 @@ static SkPMColor screen_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = srcover_byte(SkGetPackedB32(src), SkGetPackedB32(dst)); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f screen_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + const Sk4f s4 = as_4f(src); |
| + const Sk4f d4 = as_4f(dst); |
| + return as_pm4f(s4 + d4 - s4 * d4); |
| +} |
| // kOverlay_Mode |
| static inline int overlay_byte(int sc, int dc, int sa, int da) { |
| @@ -219,6 +287,9 @@ static SkPMColor overlay_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = overlay_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f overlay_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return not_implemented_yet_proc4f(src, dst); |
| +} |
| // kDarken_Mode |
| static inline int darken_byte(int sc, int dc, int sa, int da) { |
| @@ -241,6 +312,9 @@ static SkPMColor darken_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = darken_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f darken_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return not_implemented_yet_proc4f(src, dst); |
| +} |
| // kLighten_Mode |
| static inline int lighten_byte(int sc, int dc, int sa, int da) { |
| @@ -263,6 +337,9 @@ static SkPMColor lighten_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = lighten_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f lighten_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return not_implemented_yet_proc4f(src, dst); |
| +} |
| // kColorDodge_Mode |
| static inline int colordodge_byte(int sc, int dc, int sa, int da) { |
| @@ -287,6 +364,9 @@ static SkPMColor colordodge_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = colordodge_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f colordodge_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return not_implemented_yet_proc4f(src, dst); |
| +} |
| // kColorBurn_Mode |
| static inline int colorburn_byte(int sc, int dc, int sa, int da) { |
| @@ -311,6 +391,9 @@ static SkPMColor colorburn_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = colorburn_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f colorburn_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return not_implemented_yet_proc4f(src, dst); |
| +} |
| // kHardLight_Mode |
| static inline int hardlight_byte(int sc, int dc, int sa, int da) { |
| @@ -331,6 +414,9 @@ static SkPMColor hardlight_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = hardlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f hardlight_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return not_implemented_yet_proc4f(src, dst); |
| +} |
| // returns 255 * sqrt(n/255) |
| static U8CPU sqrt_unit_byte(U8CPU n) { |
| @@ -361,6 +447,9 @@ static SkPMColor softlight_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = softlight_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f softlight_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return not_implemented_yet_proc4f(src, dst); |
| +} |
| // kDifference_Mode |
| static inline int difference_byte(int sc, int dc, int sa, int da) { |
| @@ -376,6 +465,9 @@ static SkPMColor difference_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = difference_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f difference_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return not_implemented_yet_proc4f(src, dst); |
| +} |
| // kExclusion_Mode |
| static inline int exclusion_byte(int sc, int dc, int, int) { |
| @@ -395,6 +487,9 @@ static SkPMColor exclusion_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = exclusion_byte(SkGetPackedB32(src), SkGetPackedB32(dst), sa, da); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f exclusion_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return not_implemented_yet_proc4f(src, dst); |
| +} |
| // The CSS compositing spec introduces the following formulas: |
| // (See https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#blendingnonseparable) |
| @@ -510,6 +605,9 @@ static SkPMColor hue_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f hue_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return not_implemented_yet_proc4f(src, dst); |
| +} |
| // kSaturation_Mode |
| // B(Cb, Cs) = SetLum(SetSat(Cb, Sat(Cs)), Lum(Cb)) |
| @@ -544,6 +642,9 @@ static SkPMColor saturation_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f saturation_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return not_implemented_yet_proc4f(src, dst); |
| +} |
| // kColor_Mode |
| // B(Cb, Cs) = SetLum(Cs, Lum(Cb)) |
| @@ -577,6 +678,9 @@ static SkPMColor color_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = blendfunc_nonsep_byte(sb, db, sa, da, Sb); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f color_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return not_implemented_yet_proc4f(src, dst); |
| +} |
| // kLuminosity_Mode |
| // B(Cb, Cs) = SetLum(Cb, Lum(Cs)) |
| @@ -610,38 +714,41 @@ static SkPMColor luminosity_modeproc(SkPMColor src, SkPMColor dst) { |
| int b = blendfunc_nonsep_byte(sb, db, sa, da, Db); |
| return SkPackARGB32(a, r, g, b); |
| } |
| +static SkPM4f luminosity_proc4f(const SkPM4f& src, const SkPM4f& dst) { |
| + return not_implemented_yet_proc4f(src, dst); |
| +} |
| const ProcCoeff gProcCoeffs[] = { |
| - { clear_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kZero_Coeff }, |
| - { src_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kZero_Coeff }, |
| - { dst_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kOne_Coeff }, |
| - { srcover_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kISA_Coeff }, |
| - { dstover_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kOne_Coeff }, |
| - { srcin_modeproc, SkXfermode::kDA_Coeff, SkXfermode::kZero_Coeff }, |
| - { dstin_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kSA_Coeff }, |
| - { srcout_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kZero_Coeff }, |
| - { dstout_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kISA_Coeff }, |
| - { srcatop_modeproc, SkXfermode::kDA_Coeff, SkXfermode::kISA_Coeff }, |
| - { dstatop_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kSA_Coeff }, |
| - { xor_modeproc, SkXfermode::kIDA_Coeff, SkXfermode::kISA_Coeff }, |
| - |
| - { plus_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kOne_Coeff }, |
| - { modulate_modeproc,SkXfermode::kZero_Coeff, SkXfermode::kSC_Coeff }, |
| - { screen_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kISC_Coeff }, |
| - { overlay_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| - { darken_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| - { lighten_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| - { colordodge_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| - { colorburn_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| - { hardlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| - { softlight_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| - { difference_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| - { exclusion_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| - { multiply_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| - { hue_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| - { saturation_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| - { color_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| - { luminosity_modeproc, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { clear_modeproc, clear_proc4f, SkXfermode::kZero_Coeff, SkXfermode::kZero_Coeff }, |
| + { src_modeproc, src_proc4f, SkXfermode::kOne_Coeff, SkXfermode::kZero_Coeff }, |
| + { dst_modeproc, dst_proc4f, SkXfermode::kZero_Coeff, SkXfermode::kOne_Coeff }, |
| + { srcover_modeproc, srcover_proc4f, SkXfermode::kOne_Coeff, SkXfermode::kISA_Coeff }, |
| + { dstover_modeproc, dstover_proc4f, SkXfermode::kIDA_Coeff, SkXfermode::kOne_Coeff }, |
| + { srcin_modeproc, srcin_proc4f, SkXfermode::kDA_Coeff, SkXfermode::kZero_Coeff }, |
| + { dstin_modeproc, dstin_proc4f, SkXfermode::kZero_Coeff, SkXfermode::kSA_Coeff }, |
| + { srcout_modeproc, srcout_proc4f, SkXfermode::kIDA_Coeff, SkXfermode::kZero_Coeff }, |
| + { dstout_modeproc, dstout_proc4f, SkXfermode::kZero_Coeff, SkXfermode::kISA_Coeff }, |
| + { srcatop_modeproc, srcatop_proc4f, SkXfermode::kDA_Coeff, SkXfermode::kISA_Coeff }, |
| + { dstatop_modeproc, dstatop_proc4f, SkXfermode::kIDA_Coeff, SkXfermode::kSA_Coeff }, |
| + { xor_modeproc, xor_proc4f, SkXfermode::kIDA_Coeff, SkXfermode::kISA_Coeff }, |
| + |
| + { plus_modeproc, plus_proc4f, SkXfermode::kOne_Coeff, SkXfermode::kOne_Coeff }, |
| + { modulate_modeproc, modulate_proc4f, SkXfermode::kZero_Coeff, SkXfermode::kSC_Coeff }, |
| + { screen_modeproc, screen_proc4f, SkXfermode::kOne_Coeff, SkXfermode::kISC_Coeff }, |
| + { overlay_modeproc, overlay_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { darken_modeproc, darken_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { lighten_modeproc, lighten_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { colordodge_modeproc, colordodge_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { colorburn_modeproc, colorburn_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { hardlight_modeproc, hardlight_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { softlight_modeproc, softlight_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { difference_modeproc, difference_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { exclusion_modeproc, exclusion_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { multiply_modeproc, multiply_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { hue_modeproc, hue_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { saturation_modeproc, saturation_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { color_modeproc, color_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| + { luminosity_modeproc, luminosity_proc4f, CANNOT_USE_COEFF, CANNOT_USE_COEFF }, |
| }; |
| /////////////////////////////////////////////////////////////////////////////// |
| @@ -1006,6 +1113,14 @@ SkXfermodeProc SkXfermode::GetProc(Mode mode) { |
| return proc; |
| } |
| +SkXfermodeProc4f SkXfermode::GetProc4f(Mode mode) { |
| + SkXfermodeProc4f proc = nullptr; |
| + if ((unsigned)mode < kModeCount) { |
| + proc = gProcCoeffs[mode].fProc4f; |
| + } |
| + return proc; |
| +} |
| + |
| bool SkXfermode::ModeAsCoeff(Mode mode, Coeff* src, Coeff* dst) { |
| SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); |