aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/Sk4pxXfermode.h
diff options
context:
space:
mode:
authorGravatar mtklein <mtklein@google.com>2015-06-24 14:30:43 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-06-24 14:30:43 -0700
commit0cc1f0a8d5ed69c76d75061bc2dee3b1d0ce0605 (patch)
treef3978f17559721a0e69c556d975d057986678e70 /src/core/Sk4pxXfermode.h
parentb9d4163bebab0f5639f9c5928bb5fc15f472dddc (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.h60
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