1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2018 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef SkottieProperty_DEFINED 9cb93a386Sopenharmony_ci#define SkottieProperty_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 12cb93a386Sopenharmony_ci#include "include/core/SkPoint.h" 13cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 14cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 15cb93a386Sopenharmony_ci#include "include/utils/SkTextUtils.h" 16cb93a386Sopenharmony_ci#include "modules/skottie/src/text/SkottieShaper.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci#include <functional> 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ciclass SkMatrix; 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_cinamespace sksg { 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ciclass Color; 25cb93a386Sopenharmony_ciclass OpacityEffect; 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci} // namespace sksg 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_cinamespace skottie { 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ciusing ColorPropertyValue = SkColor; 32cb93a386Sopenharmony_ciusing OpacityPropertyValue = float; 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_cienum class TextPaintOrder : uint8_t { 35cb93a386Sopenharmony_ci kFillStroke, 36cb93a386Sopenharmony_ci kStrokeFill, 37cb93a386Sopenharmony_ci}; 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_cistruct TextPropertyValue { 40cb93a386Sopenharmony_ci sk_sp<SkTypeface> fTypeface; 41cb93a386Sopenharmony_ci SkString fText; 42cb93a386Sopenharmony_ci float fTextSize = 0, 43cb93a386Sopenharmony_ci fMinTextSize = 0, // when auto-sizing 44cb93a386Sopenharmony_ci fMaxTextSize = std::numeric_limits<float>::max(), // when auto-sizing 45cb93a386Sopenharmony_ci fStrokeWidth = 0, 46cb93a386Sopenharmony_ci fLineHeight = 0, 47cb93a386Sopenharmony_ci fLineShift = 0, 48cb93a386Sopenharmony_ci fAscent = 0; 49cb93a386Sopenharmony_ci SkTextUtils::Align fHAlign = SkTextUtils::kLeft_Align; 50cb93a386Sopenharmony_ci Shaper::VAlign fVAlign = Shaper::VAlign::kTop; 51cb93a386Sopenharmony_ci Shaper::ResizePolicy fResize = Shaper::ResizePolicy::kNone; 52cb93a386Sopenharmony_ci Shaper::LinebreakPolicy fLineBreak = Shaper::LinebreakPolicy::kExplicit; 53cb93a386Sopenharmony_ci Shaper::Direction fDirection = Shaper::Direction::kLTR; 54cb93a386Sopenharmony_ci Shaper::Capitalization fCapitalization = Shaper::Capitalization::kNone; 55cb93a386Sopenharmony_ci SkRect fBox = SkRect::MakeEmpty(); 56cb93a386Sopenharmony_ci SkColor fFillColor = SK_ColorTRANSPARENT, 57cb93a386Sopenharmony_ci fStrokeColor = SK_ColorTRANSPARENT; 58cb93a386Sopenharmony_ci TextPaintOrder fPaintOrder = TextPaintOrder::kFillStroke; 59cb93a386Sopenharmony_ci bool fHasFill = false, 60cb93a386Sopenharmony_ci fHasStroke = false; 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci bool operator==(const TextPropertyValue& other) const; 63cb93a386Sopenharmony_ci bool operator!=(const TextPropertyValue& other) const; 64cb93a386Sopenharmony_ci}; 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_cistruct TransformPropertyValue { 67cb93a386Sopenharmony_ci SkPoint fAnchorPoint, 68cb93a386Sopenharmony_ci fPosition; 69cb93a386Sopenharmony_ci SkVector fScale; 70cb93a386Sopenharmony_ci SkScalar fRotation, 71cb93a386Sopenharmony_ci fSkew, 72cb93a386Sopenharmony_ci fSkewAxis; 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci bool operator==(const TransformPropertyValue& other) const; 75cb93a386Sopenharmony_ci bool operator!=(const TransformPropertyValue& other) const; 76cb93a386Sopenharmony_ci}; 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_cinamespace internal { class AnimationBuilder; } 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ci/** 81cb93a386Sopenharmony_ci * Property handles are adapters between user-facing AE model/values 82cb93a386Sopenharmony_ci * and the internal scene-graph representation. 83cb93a386Sopenharmony_ci */ 84cb93a386Sopenharmony_citemplate <typename ValueT, typename NodeT> 85cb93a386Sopenharmony_ciclass SK_API PropertyHandle final { 86cb93a386Sopenharmony_cipublic: 87cb93a386Sopenharmony_ci explicit PropertyHandle(sk_sp<NodeT> node) : fNode(std::move(node)) {} 88cb93a386Sopenharmony_ci ~PropertyHandle(); 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ci ValueT get() const; 91cb93a386Sopenharmony_ci void set(const ValueT&); 92cb93a386Sopenharmony_ci 93cb93a386Sopenharmony_ciprivate: 94cb93a386Sopenharmony_ci const sk_sp<NodeT> fNode; 95cb93a386Sopenharmony_ci}; 96cb93a386Sopenharmony_ci 97cb93a386Sopenharmony_cinamespace internal { 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_ciclass TextAdapter; 100cb93a386Sopenharmony_ciclass TransformAdapter2D; 101cb93a386Sopenharmony_ci 102cb93a386Sopenharmony_ci} // namespace internal 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_ciusing ColorPropertyHandle = PropertyHandle<ColorPropertyValue, 105cb93a386Sopenharmony_ci sksg::Color>; 106cb93a386Sopenharmony_ciusing OpacityPropertyHandle = PropertyHandle<OpacityPropertyValue, 107cb93a386Sopenharmony_ci sksg::OpacityEffect>; 108cb93a386Sopenharmony_ciusing TextPropertyHandle = PropertyHandle<TextPropertyValue, 109cb93a386Sopenharmony_ci internal::TextAdapter>; 110cb93a386Sopenharmony_ciusing TransformPropertyHandle = PropertyHandle<TransformPropertyValue, 111cb93a386Sopenharmony_ci internal::TransformAdapter2D>; 112cb93a386Sopenharmony_ci 113cb93a386Sopenharmony_ci/** 114cb93a386Sopenharmony_ci * A PropertyObserver can be used to track and manipulate certain properties of "interesting" 115cb93a386Sopenharmony_ci * Lottie nodes. 116cb93a386Sopenharmony_ci * 117cb93a386Sopenharmony_ci * When registered with an animation builder, PropertyObserver receives notifications for 118cb93a386Sopenharmony_ci * various properties of layer and shape nodes. The |node_name| argument corresponds to the 119cb93a386Sopenharmony_ci * name ("nm") node property. 120cb93a386Sopenharmony_ci */ 121cb93a386Sopenharmony_ciclass SK_API PropertyObserver : public SkRefCnt { 122cb93a386Sopenharmony_cipublic: 123cb93a386Sopenharmony_ci enum class NodeType {COMPOSITION, LAYER, EFFECT, OTHER}; 124cb93a386Sopenharmony_ci 125cb93a386Sopenharmony_ci template <typename T> 126cb93a386Sopenharmony_ci using LazyHandle = std::function<std::unique_ptr<T>()>; 127cb93a386Sopenharmony_ci 128cb93a386Sopenharmony_ci virtual void onColorProperty (const char node_name[], 129cb93a386Sopenharmony_ci const LazyHandle<ColorPropertyHandle>&); 130cb93a386Sopenharmony_ci virtual void onOpacityProperty (const char node_name[], 131cb93a386Sopenharmony_ci const LazyHandle<OpacityPropertyHandle>&); 132cb93a386Sopenharmony_ci virtual void onTextProperty (const char node_name[], 133cb93a386Sopenharmony_ci const LazyHandle<TextPropertyHandle>&); 134cb93a386Sopenharmony_ci virtual void onTransformProperty(const char node_name[], 135cb93a386Sopenharmony_ci const LazyHandle<TransformPropertyHandle>&); 136cb93a386Sopenharmony_ci virtual void onEnterNode(const char node_name[], NodeType node_type); 137cb93a386Sopenharmony_ci virtual void onLeavingNode(const char node_name[], NodeType node_type); 138cb93a386Sopenharmony_ci}; 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_ci} // namespace skottie 141cb93a386Sopenharmony_ci 142cb93a386Sopenharmony_ci#endif // SkottieProperty_DEFINED 143