aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/skotty/Skotty.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'experimental/skotty/Skotty.cpp')
-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) {