From 71cba8f311f18e671ed99e6a553e2ca7e3d17466 Mon Sep 17 00:00:00 2001 From: Florin Malita Date: Tue, 9 Jan 2018 08:07:14 -0500 Subject: [skotty] Layer in/out support TBR= Change-Id: I79a9f5f15c051fc2d08bc2d6788ff059ec2d36f0 Reviewed-on: https://skia-review.googlesource.com/92460 Reviewed-by: Florin Malita Commit-Queue: Florin Malita --- experimental/skotty/Skotty.cpp | 44 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) (limited to 'experimental') diff --git a/experimental/skotty/Skotty.cpp b/experimental/skotty/Skotty.cpp index f89e975ce8..9a14ac141e 100644 --- a/experimental/skotty/Skotty.cpp +++ b/experimental/skotty/Skotty.cpp @@ -719,13 +719,45 @@ sk_sp AttachLayer(const Json::Value& jlayer, return nullptr; } - auto layer = gLayerAttachers[type](jlayer, layerCtx->fCtx); - auto layerMatrix = layerCtx->AttachLayerMatrix(jlayer); - auto transformed = layerMatrix - ? sksg::Transform::Make(std::move(layer), std::move(layerMatrix)) - : layer; + // Layer content. + auto layer = gLayerAttachers[type](jlayer, layerCtx->fCtx); + if (auto layerMatrix = layerCtx->AttachLayerMatrix(jlayer)) { + // Optional layer transform. + layer = sksg::Transform::Make(std::move(layer), std::move(layerMatrix)); + } + // Optional layer opacity. + layer = AttachOpacity(jlayer["ks"], layerCtx->fCtx, std::move(layer)); + + // TODO: we should also disable related/inactive animators. + class Activator final : public AnimatorBase { + public: + Activator(sk_sp controlNode, float in, float out) + : fControlNode(std::move(controlNode)) + , fIn(in) + , fOut(out) {} + + void tick(SkMSec t) override { + // Keep the layer fully transparent except for its [in..out] lifespan. + // (note: opacity == 0 disables rendering, while opacity == 1 is a noop) + fControlNode->setOpacity(t >= fIn && t <= fOut ? 1 : 0); + } + + private: + const sk_sp fControlNode; + const float fIn, + fOut; + }; + + auto layerControl = sksg::OpacityEffect::Make(std::move(layer)); + const auto in = ParseScalar(jlayer["ip"], 0), + out = ParseScalar(jlayer["op"], in); + + if (in >= out || ! layerControl) + return nullptr; + + layerCtx->fCtx->fAnimators.push_back(skstd::make_unique(layerControl, in, out)); - return AttachOpacity(jlayer["ks"], layerCtx->fCtx, std::move(transformed)); + return layerControl; } sk_sp AttachComposition(const Json::Value& comp, AttachContext* ctx) { -- cgit v1.2.3