diff options
author | 2015-06-24 14:30:43 -0700 | |
---|---|---|
committer | 2015-06-24 14:30:43 -0700 | |
commit | 0cc1f0a8d5ed69c76d75061bc2dee3b1d0ce0605 (patch) | |
tree | f3978f17559721a0e69c556d975d057986678e70 /src/core/Sk4pxXfermode.h | |
parent | b9d4163bebab0f5639f9c5928bb5fc15f472dddc (diff) |
Revert of Implement four more xfermodes with Sk4px. (patchset #16 id:290001 of https://codereview.chromium.org/1196713004/)
Reason for revert:
64-bit ARM build failures.
Original issue's description:
> Implement four more xfermodes with Sk4px.
>
> HardLight, Overlay, Darken, and Lighten are all
> ~2x faster with SSE, ~25% faster with NEON.
>
> This covers all previously-implemented NEON xfermodes.
> 3 previous SSE xfermodes remain. Those need division
> and sqrt, so I'm planning on using SkPMFloat for them.
> It'll help the readability and NEON speed if I move that
> into [0,1] space first.
>
> The main new concept here is c.thenElse(t,e), which behaves like
> (c ? t : e) except, of course, both t and e are evaluated. This allows
> us to emulate conditionals with vectors.
>
> This also removes the concept of SkNb. Instead of a standalone bool
> vector, each SkNi or SkNf will just return their own types for
> comparisons. Turns out to be a lot more manageable this way.
>
> BUG=skia:
>
> Committed: https://skia.googlesource.com/skia/+/b9d4163bebab0f5639f9c5928bb5fc15f472dddc
TBR=reed@google.com,mtklein@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Review URL: https://codereview.chromium.org/1205703008
Diffstat (limited to 'src/core/Sk4pxXfermode.h')
-rw-r--r-- | src/core/Sk4pxXfermode.h | 60 |
1 files changed, 9 insertions, 51 deletions
diff --git a/src/core/Sk4pxXfermode.h b/src/core/Sk4pxXfermode.h index 09490dc990..b4ebd850e3 100644 --- a/src/core/Sk4pxXfermode.h +++ b/src/core/Sk4pxXfermode.h @@ -60,44 +60,6 @@ XFERMODE(Exclusion) { return (s - p) + (d - p.zeroAlphas()); } -XFERMODE(HardLight) { - auto alphas = SrcOver::Xfer(s,d); - - auto sa = s.alphas(), - da = d.alphas(); - - auto isDark = s < (sa-s); - - auto dark = s*d << 1, - lite = sa*da - ((da-d)*(sa-s) << 1), - both = s*da.inv() + d*sa.inv(); - - // TODO: do isDark in 16-bit so we only have to div255() once. - auto colors = isDark.thenElse((dark + both).div255(), - (lite + both).div255()); - return alphas.zeroColors() + colors.zeroAlphas(); -} -XFERMODE(Overlay) { return HardLight::Xfer(d,s); } - -XFERMODE(Darken) { - auto sda = s.approxMulDiv255(d.alphas()), - dsa = d.approxMulDiv255(s.alphas()); - auto srcover = s + (d - dsa), - dstover = d + (s - sda); - auto alphas = srcover, - colors = (sda < dsa).thenElse(srcover, dstover); - return alphas.zeroColors() + colors.zeroAlphas(); -} -XFERMODE(Lighten) { - auto sda = s.approxMulDiv255(d.alphas()), - dsa = d.approxMulDiv255(s.alphas()); - auto srcover = s + (d - dsa), - dstover = d + (s - sda); - auto alphas = srcover, - colors = (sda < dsa).thenElse(dstover, srcover); - return alphas.zeroColors() + colors.zeroAlphas(); -} - #undef XFERMODE // A reasonable fallback mode for doing AA is to simply apply the transfermode first, @@ -109,15 +71,17 @@ static Sk4px xfer_aa(const Sk4px& s, const Sk4px& d, const Sk4px& aa) { } // For some transfermodes we specialize AA, either for correctness or performance. -#define XFERMODE_AA(Name) \ - template <> Sk4px xfer_aa<Name>(const Sk4px& s, const Sk4px& d, const Sk4px& aa) +#ifndef SK_NO_SPECIALIZED_AA_XFERMODES + #define XFERMODE_AA(Name) \ + template <> Sk4px xfer_aa<Name>(const Sk4px& s, const Sk4px& d, const Sk4px& aa) -// Plus' clamp needs to happen after AA. skia:3852 -XFERMODE_AA(Plus) { // [ clamp( (1-AA)D + (AA)(S+D) ) == clamp(D + AA*S) ] - return d.saturatedAdd(s.approxMulDiv255(aa)); -} + // Plus' clamp needs to happen after AA. skia:3852 + XFERMODE_AA(Plus) { // [ clamp( (1-AA)D + (AA)(S+D) ) == clamp(D + AA*S) ] + return d.saturatedAdd(s.approxMulDiv255(aa)); + } -#undef XFERMODE_AA + #undef XFERMODE_AA +#endif template <typename ProcType> class SkT4pxXfermode : public SkProcCoeffXfermode { @@ -166,12 +130,6 @@ static SkProcCoeffXfermode* SkCreate4pxXfermode(const ProcCoeff& rec, SkXfermode case SkXfermode::kMultiply_Mode: return SkT4pxXfermode<Multiply>::Create(rec); case SkXfermode::kDifference_Mode: return SkT4pxXfermode<Difference>::Create(rec); case SkXfermode::kExclusion_Mode: return SkT4pxXfermode<Exclusion>::Create(rec); -#if !defined(SK_SUPPORT_LEGACY_XFERMODES) // For staging in Chrome (layout tests). - case SkXfermode::kHardLight_Mode: return SkT4pxXfermode<HardLight>::Create(rec); - case SkXfermode::kOverlay_Mode: return SkT4pxXfermode<Overlay>::Create(rec); - case SkXfermode::kDarken_Mode: return SkT4pxXfermode<Darken>::Create(rec); - case SkXfermode::kLighten_Mode: return SkT4pxXfermode<Lighten>::Create(rec); -#endif default: break; } #endif |