/*
* Copyright 2018 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkottieProperty_DEFINED
#define SkottieProperty_DEFINED
#include "SkColor.h"
#include "SkPoint.h"
#include "SkRefCnt.h"
#include <functional>
class SkMatrix;
namespace sksg {
class Color;
class OpacityEffect;
} // namespace sksg
namespace skottie {
using ColorPropertyValue = SkColor;
using OpacityPropertyValue = float;
struct TransformPropertyValue {
SkPoint fAnchorPoint,
fPosition;
SkVector fScale;
SkScalar fRotation,
fSkew,
fSkewAxis;
bool operator==(const TransformPropertyValue& other) const;
bool operator!=(const TransformPropertyValue& other) const;
};
namespace internal { class AnimationBuilder; }
/**
* Property handles are adapters between user-facing AE model/values
* and the internal scene-graph representation.
*/
template <typename ValueT, typename NodeT>
class SK_API PropertyHandle final {
public:
~PropertyHandle();
ValueT get() const;
void set(const ValueT&);
private:
explicit PropertyHandle(sk_sp<NodeT> node) : fNode(std::move(node)) {}
friend class skottie::internal::AnimationBuilder;
const sk_sp<NodeT> fNode;
};
class TransformAdapter2D;
using ColorPropertyHandle = PropertyHandle<ColorPropertyValue , sksg::Color >;
using OpacityPropertyHandle = PropertyHandle<OpacityPropertyValue , sksg::OpacityEffect >;
using TransformPropertyHandle = PropertyHandle<TransformPropertyValue, TransformAdapter2D >;
/**
* A PropertyObserver can be used to track and manipulate certain properties of "interesting"
* Lottie nodes.
*
* When registered with an animation builder, PropertyObserver receives notifications for
* various properties of layer and shape nodes. The |node_name| argument corresponds to the
* name ("nm") node property.
*/
class SK_API PropertyObserver : public SkRefCnt {
public:
template <typename T>
using LazyHandle = std::function<std::unique_ptr<T>()>;
virtual void onColorProperty (const char node_name[],
const LazyHandle<ColorPropertyHandle>&);
virtual void onOpacityProperty (const char node_name[],
const LazyHandle<OpacityPropertyHandle>&);
virtual void onTransformProperty(const char node_name[],
const LazyHandle<TransformPropertyHandle>&);
};
} // namespace skottie
#endif // SkottieProperty_DEFINED