1/*
2 * Copyright 2020 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "modules/skottie/src/SkottieJson.h"
9#include "modules/skottie/src/SkottieValue.h"
10#include "modules/skottie/src/animator/Animator.h"
11#include "modules/skottie/src/animator/KeyframeAnimator.h"
12
13namespace skottie::internal {
14
15namespace {
16
17// Scalar specialization: stores scalar values (floats) inline in keyframes.
18class ScalarKeyframeAnimator final : public KeyframeAnimator {
19public:
20 class Builder final : public KeyframeAnimatorBuilder {
21 public:
22 sk_sp<KeyframeAnimator> make(const AnimationBuilder& abuilder,
23 const skjson::ArrayValue& jkfs,
24 void* target_value) override {
25 SkASSERT(jkfs.size() > 0);
26 if (!this->parseKeyframes(abuilder, jkfs)) {
27 return nullptr;
28 }
29
30 return sk_sp<ScalarKeyframeAnimator>(
31 new ScalarKeyframeAnimator(std::move(fKFs),
32 std::move(fCMs),
33 static_cast<ScalarValue*>(target_value)));
34 }
35
36 bool parseValue(const AnimationBuilder&, const skjson::Value& jv, void* v) const override {
37 return Parse(jv, static_cast<float*>(v));
38 }
39
40 private:
41 bool parseKFValue(const AnimationBuilder&,
42 const skjson::ObjectValue&,
43 const skjson::Value& jv,
44 Keyframe::Value* v) override {
45 return Parse(jv, &v->flt);
46 }
47 };
48
49private:
50 ScalarKeyframeAnimator(std::vector<Keyframe> kfs,
51 std::vector<SkCubicMap> cms,
52 ScalarValue* target_value)
53 : INHERITED(std::move(kfs), std::move(cms))
54 , fTarget(target_value) {}
55
56 StateChanged onSeek(float t) override {
57 const auto& lerp_info = this->getLERPInfo(t);
58 const auto old_value = *fTarget;
59
60 *fTarget = Lerp(lerp_info.vrec0.flt, lerp_info.vrec1.flt, lerp_info.weight);
61
62 return *fTarget != old_value;
63 }
64
65 ScalarValue* fTarget;
66
67 using INHERITED = KeyframeAnimator;
68};
69
70} // namespace
71
72template <>
73bool AnimatablePropertyContainer::bind<ScalarValue>(const AnimationBuilder& abuilder,
74 const skjson::ObjectValue* jprop,
75 ScalarValue* v) {
76 ScalarKeyframeAnimator::Builder builder;
77
78 return this->bindImpl(abuilder, jprop, builder, v);
79}
80
81} // namespace skottie::internal
82