/* * 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 "include/core/SkColor.h" #include "include/core/SkPoint.h" #include "include/core/SkRefCnt.h" #include "include/core/SkTypeface.h" #include "include/utils/SkTextUtils.h" #include "modules/skottie/src/text/SkottieShaper.h" #include class SkMatrix; namespace sksg { class Color; class OpacityEffect; } // namespace sksg namespace skottie { using ColorPropertyValue = SkColor; using OpacityPropertyValue = float; enum class TextPaintOrder : uint8_t { kFillStroke, kStrokeFill, }; struct TextPropertyValue { sk_sp fTypeface; SkString fText; float fTextSize = 0, fMinTextSize = 0, // when auto-sizing fMaxTextSize = std::numeric_limits::max(), // when auto-sizing fStrokeWidth = 0, fLineHeight = 0, fLineShift = 0, fAscent = 0; size_t fMaxLines = 0; // when auto-sizing SkTextUtils::Align fHAlign = SkTextUtils::kLeft_Align; Shaper::VAlign fVAlign = Shaper::VAlign::kTop; Shaper::ResizePolicy fResize = Shaper::ResizePolicy::kNone; Shaper::LinebreakPolicy fLineBreak = Shaper::LinebreakPolicy::kExplicit; Shaper::Direction fDirection = Shaper::Direction::kLTR; Shaper::Capitalization fCapitalization = Shaper::Capitalization::kNone; SkRect fBox = SkRect::MakeEmpty(); SkColor fFillColor = SK_ColorTRANSPARENT, fStrokeColor = SK_ColorTRANSPARENT; TextPaintOrder fPaintOrder = TextPaintOrder::kFillStroke; bool fHasFill = false, fHasStroke = false; bool operator==(const TextPropertyValue& other) const; bool operator!=(const TextPropertyValue& other) const; }; 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 class SK_API PropertyHandle final { public: explicit PropertyHandle(sk_sp node) : fNode(std::move(node)) {} ~PropertyHandle(); ValueT get() const; void set(const ValueT&); private: const sk_sp fNode; }; namespace internal { class TextAdapter; class TransformAdapter2D; } // namespace internal using ColorPropertyHandle = PropertyHandle; using OpacityPropertyHandle = PropertyHandle; using TextPropertyHandle = PropertyHandle; using TransformPropertyHandle = PropertyHandle; /** * 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: enum class NodeType {COMPOSITION, LAYER, EFFECT, OTHER}; template using LazyHandle = std::function()>; virtual void onColorProperty (const char node_name[], const LazyHandle&); virtual void onOpacityProperty (const char node_name[], const LazyHandle&); virtual void onTextProperty (const char node_name[], const LazyHandle&); virtual void onTransformProperty(const char node_name[], const LazyHandle&); virtual void onEnterNode(const char node_name[], NodeType node_type); virtual void onLeavingNode(const char node_name[], NodeType node_type); }; } // namespace skottie #endif // SkottieProperty_DEFINED