/* * 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 SkottieAdapter_DEFINED #define SkottieAdapter_DEFINED #include "SkPoint.h" #include "SkRefCnt.h" #include "SkSize.h" #include "SkottieValue.h" namespace sksg { class Color; class Draw; class Gradient; class Group; class LinearGradient; template class Matrix; class Path; class RadialGradient; class RenderNode; class RRect; class TextBlob; class TransformEffect; class TrimEffect; }; namespace skottie { #define ADAPTER_PROPERTY(p_name, p_type, p_default) \ const p_type& get##p_name() const { \ return f##p_name; \ } \ void set##p_name(const p_type& p) { \ if (p == f##p_name) return; \ f##p_name = p; \ this->apply(); \ } \ private: \ p_type f##p_name = p_default; \ public: class RRectAdapter final : public SkNVRefCnt { public: explicit RRectAdapter(sk_sp); ~RRectAdapter(); ADAPTER_PROPERTY(Position, SkPoint , SkPoint::Make(0, 0)) ADAPTER_PROPERTY(Size , SkSize , SkSize::Make(0, 0)) ADAPTER_PROPERTY(Radius , SkSize , SkSize::Make(0, 0)) private: void apply(); sk_sp fRRectNode; }; class PolyStarAdapter final : public SkNVRefCnt { public: enum class Type { kStar, kPoly, }; PolyStarAdapter(sk_sp, Type); ~PolyStarAdapter(); ADAPTER_PROPERTY(Position , SkPoint , SkPoint::Make(0, 0)) ADAPTER_PROPERTY(PointCount , SkScalar, 0) ADAPTER_PROPERTY(InnerRadius , SkScalar, 0) ADAPTER_PROPERTY(OuterRadius , SkScalar, 0) ADAPTER_PROPERTY(InnerRoundness, SkScalar, 0) ADAPTER_PROPERTY(OuterRoundness, SkScalar, 0) ADAPTER_PROPERTY(Rotation , SkScalar, 0) private: void apply(); sk_sp fPathNode; Type fType; }; class TransformAdapter2D final : public SkNVRefCnt { public: explicit TransformAdapter2D(sk_sp>); ~TransformAdapter2D(); ADAPTER_PROPERTY(AnchorPoint, SkPoint , SkPoint::Make(0, 0)) ADAPTER_PROPERTY(Position , SkPoint , SkPoint::Make(0, 0)) ADAPTER_PROPERTY(Scale , SkVector, SkPoint::Make(100, 100)) ADAPTER_PROPERTY(Rotation , SkScalar, 0) ADAPTER_PROPERTY(Skew , SkScalar, 0) ADAPTER_PROPERTY(SkewAxis , SkScalar, 0) SkMatrix totalMatrix() const; private: void apply(); sk_sp> fMatrixNode; }; class TransformAdapter3D final : public SkNVRefCnt { public: explicit TransformAdapter3D(sk_sp>); ~TransformAdapter3D(); struct Vec3 { float fX, fY, fZ; explicit Vec3(const VectorValue&); bool operator==(const Vec3& other) const { return fX == other.fX && fY == other.fY && fZ == other.fZ; } bool operator!=(const Vec3& other) const { return !(*this == other); } }; ADAPTER_PROPERTY(AnchorPoint, Vec3, Vec3({ 0, 0, 0})) ADAPTER_PROPERTY(Position , Vec3, Vec3({ 0, 0, 0})) ADAPTER_PROPERTY(Rotation , Vec3, Vec3({ 0, 0, 0})) ADAPTER_PROPERTY(Scale , Vec3, Vec3({100, 100, 100})) SkMatrix44 totalMatrix() const; private: void apply(); sk_sp> fMatrixNode; }; class RepeaterAdapter final : public SkNVRefCnt { public: enum class Composite { kAbove, kBelow }; RepeaterAdapter(sk_sp, Composite); ~RepeaterAdapter(); // Repeater props ADAPTER_PROPERTY(Count , SkScalar, 0) ADAPTER_PROPERTY(Offset , SkScalar, 0) // Transform props ADAPTER_PROPERTY(AnchorPoint , SkPoint , SkPoint::Make(0, 0)) ADAPTER_PROPERTY(Position , SkPoint , SkPoint::Make(0, 0)) ADAPTER_PROPERTY(Scale , SkVector, SkPoint::Make(100, 100)) ADAPTER_PROPERTY(Rotation , SkScalar, 0) ADAPTER_PROPERTY(StartOpacity, SkScalar, 100) ADAPTER_PROPERTY(EndOpacity , SkScalar, 100) const sk_sp& root() const { return fRoot; } private: void apply(); const sk_sp fRepeaterNode; const Composite fComposite; sk_sp fRoot; }; class GradientAdapter : public SkRefCnt { public: ADAPTER_PROPERTY(StartPoint, SkPoint , SkPoint::Make(0, 0) ) ADAPTER_PROPERTY(EndPoint , SkPoint , SkPoint::Make(0, 0) ) ADAPTER_PROPERTY(ColorStops, VectorValue , VectorValue() ) protected: GradientAdapter(sk_sp, size_t stopCount); const SkPoint& startPoint() const { return fStartPoint; } const SkPoint& endPoint() const { return fEndPoint; } sk_sp fGradient; size_t fStopCount; virtual void onApply() = 0; private: void apply(); }; class LinearGradientAdapter final : public GradientAdapter { public: LinearGradientAdapter(sk_sp, size_t stopCount); private: void onApply() override; using INHERITED = GradientAdapter; }; class RadialGradientAdapter final : public GradientAdapter { public: RadialGradientAdapter(sk_sp, size_t stopCount); private: void onApply() override; using INHERITED = GradientAdapter; }; class TrimEffectAdapter final : public SkNVRefCnt { public: explicit TrimEffectAdapter(sk_sp); ~TrimEffectAdapter(); ADAPTER_PROPERTY(Start , SkScalar, 0) ADAPTER_PROPERTY(End , SkScalar, 100) ADAPTER_PROPERTY(Offset, SkScalar, 0) private: void apply(); sk_sp fTrimEffect; }; class TextAdapter final : public SkNVRefCnt { public: explicit TextAdapter(sk_sp root); ~TextAdapter(); ADAPTER_PROPERTY(Text, TextValue, TextValue()) const sk_sp& root() const { return fRoot; } private: void apply(); sk_sp makeBlob() const; sk_sp fRoot; sk_sp fTextNode; sk_sp fFillColor, fStrokeColor; sk_sp fFillNode, fStrokeNode; bool fHadFill : 1, // - state cached from the prev apply() fHadStroke : 1; // / }; #undef ADAPTER_PROPERTY } // namespace skottie #endif // SkottieAdapter_DEFINED