blob: 7f691cd2f0d13691ddb032ee72c728f6e465d236 [file] [log] [blame]
/*
* Copyright 2017 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "modules/skottie/src/Animator.h"
#include "modules/skottie/src/SkottieJson.h"
#include "modules/skottie/src/SkottiePriv.h"
#include "modules/skottie/src/SkottieValue.h"
#include "modules/skottie/src/text/TextValue.h"
namespace skottie {
namespace internal {
namespace {
template <typename T>
class LegacyAnimatorAdapter final : public AnimatablePropertyContainer {
public:
LegacyAnimatorAdapter(const AnimationBuilder& abuilder,
const skjson::ObjectValue* jprop,
std::function<void(const T&)>&& apply)
: fApplyFunc(std::move(apply)) {
if (!this->bind<T>(abuilder, jprop, &fValue)) {
fValue = T();
}
}
const T& value() const { return fValue; }
private:
void onSync() override {
fApplyFunc(fValue);
}
const std::function<void(const T&)> fApplyFunc;
T fValue;
};
template <typename T>
bool BindLegacyPropertyImpl(const AnimationBuilder& abuilder,
const skjson::ObjectValue* jprop,
AnimatorScope* ascope,
std::function<void(const T&)>&& apply,
const T* noop) {
if (!jprop) {
return false;
}
auto adapter = sk_make_sp<LegacyAnimatorAdapter<T>>(abuilder, jprop, std::move(apply));
if (adapter->isStatic()) {
if (noop && *noop == adapter->value()) {
return false;
}
adapter->tick(0);
} else {
ascope->push_back(std::move(adapter));
}
return true;
}
} // namespace
template <>
bool AnimationBuilder::bindProperty(const skjson::Value& jv,
std::function<void(const ScalarValue&)>&& apply,
const ScalarValue* noop) const {
return BindLegacyPropertyImpl(*this, jv, fCurrentAnimatorScope, std::move(apply), noop);
}
template <>
bool AnimationBuilder::bindProperty(const skjson::Value& jv,
std::function<void(const VectorValue&)>&& apply,
const VectorValue* noop) const {
return BindLegacyPropertyImpl(*this, jv, fCurrentAnimatorScope, std::move(apply), noop);
}
template <>
bool AnimationBuilder::bindProperty(const skjson::Value& jv,
std::function<void(const ShapeValue&)>&& apply,
const ShapeValue* noop) const {
return BindLegacyPropertyImpl(*this, jv, fCurrentAnimatorScope, std::move(apply), noop);
}
template <>
bool AnimationBuilder::bindProperty(const skjson::Value& jv,
std::function<void(const TextValue&)>&& apply,
const TextValue* noop) const {
return BindLegacyPropertyImpl(*this, jv, fCurrentAnimatorScope, std::move(apply), noop);
}
} // namespace internal
} // namespace skottie