SkottieAdapter.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /*
  2. * Copyright 2018 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #ifndef SkottieAdapter_DEFINED
  8. #define SkottieAdapter_DEFINED
  9. #include "include/core/SkPoint.h"
  10. #include "include/core/SkRefCnt.h"
  11. #include "include/core/SkSize.h"
  12. #include "modules/skottie/src/SkottieValue.h"
  13. namespace sksg {
  14. class BlurImageFilter;
  15. class Color;
  16. class Draw;
  17. class DropShadowImageFilter;
  18. class ExternalColorFilter;
  19. class Gradient;
  20. class Group;
  21. class LinearGradient;
  22. template <typename>
  23. class Matrix;
  24. class Path;
  25. class RadialGradient;
  26. class RenderNode;
  27. class RRect;
  28. class ShaderEffect;
  29. class Transform;
  30. class TransformEffect;
  31. class TrimEffect;
  32. };
  33. namespace skjson {
  34. class ObjectValue;
  35. }
  36. namespace skottie {
  37. #define ADAPTER_PROPERTY(p_name, p_type, p_default) \
  38. const p_type& get##p_name() const { \
  39. return f##p_name; \
  40. } \
  41. void set##p_name(const p_type& p) { \
  42. if (p == f##p_name) return; \
  43. f##p_name = p; \
  44. this->apply(); \
  45. } \
  46. private: \
  47. p_type f##p_name = p_default; \
  48. public:
  49. class RRectAdapter final : public SkNVRefCnt<RRectAdapter> {
  50. public:
  51. explicit RRectAdapter(sk_sp<sksg::RRect>);
  52. ~RRectAdapter();
  53. ADAPTER_PROPERTY(Position, SkPoint , SkPoint::Make(0, 0))
  54. ADAPTER_PROPERTY(Size , SkSize , SkSize::Make(0, 0))
  55. ADAPTER_PROPERTY(Radius , SkSize , SkSize::Make(0, 0))
  56. private:
  57. void apply();
  58. sk_sp<sksg::RRect> fRRectNode;
  59. };
  60. class PolyStarAdapter final : public SkNVRefCnt<PolyStarAdapter> {
  61. public:
  62. enum class Type {
  63. kStar, kPoly,
  64. };
  65. PolyStarAdapter(sk_sp<sksg::Path>, Type);
  66. ~PolyStarAdapter();
  67. ADAPTER_PROPERTY(Position , SkPoint , SkPoint::Make(0, 0))
  68. ADAPTER_PROPERTY(PointCount , SkScalar, 0)
  69. ADAPTER_PROPERTY(InnerRadius , SkScalar, 0)
  70. ADAPTER_PROPERTY(OuterRadius , SkScalar, 0)
  71. ADAPTER_PROPERTY(InnerRoundness, SkScalar, 0)
  72. ADAPTER_PROPERTY(OuterRoundness, SkScalar, 0)
  73. ADAPTER_PROPERTY(Rotation , SkScalar, 0)
  74. private:
  75. void apply();
  76. sk_sp<sksg::Path> fPathNode;
  77. Type fType;
  78. };
  79. class TransformAdapter2D final : public SkNVRefCnt<TransformAdapter2D> {
  80. public:
  81. explicit TransformAdapter2D(sk_sp<sksg::Matrix<SkMatrix>>);
  82. ~TransformAdapter2D();
  83. ADAPTER_PROPERTY(AnchorPoint, SkPoint , SkPoint::Make(0, 0))
  84. ADAPTER_PROPERTY(Position , SkPoint , SkPoint::Make(0, 0))
  85. ADAPTER_PROPERTY(Scale , SkVector, SkPoint::Make(100, 100))
  86. ADAPTER_PROPERTY(Rotation , SkScalar, 0)
  87. ADAPTER_PROPERTY(Skew , SkScalar, 0)
  88. ADAPTER_PROPERTY(SkewAxis , SkScalar, 0)
  89. SkMatrix totalMatrix() const;
  90. private:
  91. void apply();
  92. sk_sp<sksg::Matrix<SkMatrix>> fMatrixNode;
  93. };
  94. class TransformAdapter3D : public SkRefCnt {
  95. public:
  96. TransformAdapter3D();
  97. ~TransformAdapter3D() override;
  98. struct Vec3 {
  99. float fX, fY, fZ;
  100. explicit Vec3(const VectorValue&);
  101. bool operator==(const Vec3& other) const {
  102. return fX == other.fX && fY == other.fY && fZ == other.fZ;
  103. }
  104. bool operator!=(const Vec3& other) const { return !(*this == other); }
  105. };
  106. ADAPTER_PROPERTY(AnchorPoint, Vec3, Vec3({ 0, 0, 0}))
  107. ADAPTER_PROPERTY(Position , Vec3, Vec3({ 0, 0, 0}))
  108. ADAPTER_PROPERTY(Rotation , Vec3, Vec3({ 0, 0, 0}))
  109. ADAPTER_PROPERTY(Scale , Vec3, Vec3({100, 100, 100}))
  110. sk_sp<sksg::Transform> refTransform() const;
  111. protected:
  112. void apply();
  113. private:
  114. virtual SkMatrix44 totalMatrix() const;
  115. sk_sp<sksg::Matrix<SkMatrix44>> fMatrixNode;
  116. using INHERITED = SkRefCnt;
  117. };
  118. class CameraAdapter final : public TransformAdapter3D {
  119. public:
  120. explicit CameraAdapter(const SkSize& viewport_size);
  121. ~CameraAdapter() override;
  122. ADAPTER_PROPERTY(Zoom, SkScalar, 0)
  123. private:
  124. SkMatrix44 totalMatrix() const override;
  125. const SkSize fViewportSize;
  126. using INHERITED = TransformAdapter3D;
  127. };
  128. class RepeaterAdapter final : public SkNVRefCnt<RepeaterAdapter> {
  129. public:
  130. enum class Composite { kAbove, kBelow };
  131. RepeaterAdapter(sk_sp<sksg::RenderNode>, Composite);
  132. ~RepeaterAdapter();
  133. // Repeater props
  134. ADAPTER_PROPERTY(Count , SkScalar, 0)
  135. ADAPTER_PROPERTY(Offset , SkScalar, 0)
  136. // Transform props
  137. ADAPTER_PROPERTY(AnchorPoint , SkPoint , SkPoint::Make(0, 0))
  138. ADAPTER_PROPERTY(Position , SkPoint , SkPoint::Make(0, 0))
  139. ADAPTER_PROPERTY(Scale , SkVector, SkPoint::Make(100, 100))
  140. ADAPTER_PROPERTY(Rotation , SkScalar, 0)
  141. ADAPTER_PROPERTY(StartOpacity, SkScalar, 100)
  142. ADAPTER_PROPERTY(EndOpacity , SkScalar, 100)
  143. const sk_sp<sksg::Group>& root() const { return fRoot; }
  144. private:
  145. void apply();
  146. const sk_sp<sksg::RenderNode> fRepeaterNode;
  147. const Composite fComposite;
  148. sk_sp<sksg::Group> fRoot;
  149. };
  150. class GradientAdapter : public SkRefCnt {
  151. public:
  152. ADAPTER_PROPERTY(StartPoint, SkPoint , SkPoint::Make(0, 0) )
  153. ADAPTER_PROPERTY(EndPoint , SkPoint , SkPoint::Make(0, 0) )
  154. ADAPTER_PROPERTY(ColorStops, VectorValue , VectorValue() )
  155. protected:
  156. GradientAdapter(sk_sp<sksg::Gradient>, size_t stopCount);
  157. const SkPoint& startPoint() const { return fStartPoint; }
  158. const SkPoint& endPoint() const { return fEndPoint; }
  159. sk_sp<sksg::Gradient> fGradient;
  160. size_t fStopCount;
  161. virtual void onApply() = 0;
  162. private:
  163. void apply();
  164. };
  165. class LinearGradientAdapter final : public GradientAdapter {
  166. public:
  167. LinearGradientAdapter(sk_sp<sksg::LinearGradient>, size_t stopCount);
  168. private:
  169. void onApply() override;
  170. using INHERITED = GradientAdapter;
  171. };
  172. class RadialGradientAdapter final : public GradientAdapter {
  173. public:
  174. RadialGradientAdapter(sk_sp<sksg::RadialGradient>, size_t stopCount);
  175. private:
  176. void onApply() override;
  177. using INHERITED = GradientAdapter;
  178. };
  179. class TrimEffectAdapter final : public SkNVRefCnt<TrimEffectAdapter> {
  180. public:
  181. explicit TrimEffectAdapter(sk_sp<sksg::TrimEffect>);
  182. ~TrimEffectAdapter();
  183. ADAPTER_PROPERTY(Start , SkScalar, 0)
  184. ADAPTER_PROPERTY(End , SkScalar, 100)
  185. ADAPTER_PROPERTY(Offset, SkScalar, 0)
  186. private:
  187. void apply();
  188. sk_sp<sksg::TrimEffect> fTrimEffect;
  189. };
  190. } // namespace skottie
  191. #endif // SkottieAdapter_DEFINED