aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2018-01-09 08:07:14 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-01-09 13:29:12 +0000
commit71cba8f311f18e671ed99e6a553e2ca7e3d17466 (patch)
tree96227a530f3db8883f5240bdf9ae1cdb686a57b9 /experimental
parent1df39ebecb9be20b54bac4ffb78ef7e84512a41a (diff)
[skotty] Layer in/out support
TBR= Change-Id: I79a9f5f15c051fc2d08bc2d6788ff059ec2d36f0 Reviewed-on: https://skia-review.googlesource.com/92460 Reviewed-by: Florin Malita <fmalita@chromium.org> Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'experimental')
-rw-r--r--experimental/skotty/Skotty.cpp44
1 files changed, 38 insertions, 6 deletions
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<sksg::RenderNode> 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<sksg::OpacityEffect> 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<sksg::OpacityEffect> 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<Activator>(layerControl, in, out));
- return AttachOpacity(jlayer["ks"], layerCtx->fCtx, std::move(transformed));
+ return layerControl;
}
sk_sp<sksg::RenderNode> AttachComposition(const Json::Value& comp, AttachContext* ctx) {