1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_TRANSFORM_TRANSFORM_COMPONENT_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_TRANSFORM_TRANSFORM_COMPONENT_H
18 
19 #include "base/geometry/dimension_offset.h"
20 #include "base/geometry/matrix4.h"
21 #include "base/geometry/transform_util.h"
22 #include "core/animation/animatable_transform_operation.h"
23 #include "core/components/common/properties/alignment.h"
24 #include "core/components/transform/render_transform.h"
25 #include "core/pipeline/base/component_group.h"
26 #include "core/pipeline/base/sole_child_component.h"
27 
28 namespace OHOS::Ace {
29 
30 inline constexpr int32_t INDEX_TWO = 2;
31 inline constexpr int32_t INDEX_THREE = 3;
32 inline constexpr float PERSPECTIVE = 0.0005f;
33 inline constexpr Dimension HALF_PERCENT = 0.5_pct;
34 
35 enum class TransformStateAttribute {
36     ROTATE,
37     ROTATEX,
38     ROTATEY,
39     SCALE,
40     SCALEX,
41     SCALEY,
42     TRANSLATE,
43     TRANSLATEX,
44     TRANSLATEY,
45 };
46 
47 class ACE_EXPORT TransformComponent : public SoleChildComponent {
48     DECLARE_ACE_TYPE(TransformComponent, SoleChildComponent)
49 
50 public:
51     RefPtr<Element> CreateElement() override;
52     RefPtr<RenderNode> CreateRenderNode() override;
53     // translate
54     void Translate(const Dimension& x, const Dimension& y, const AnimationOption& animationOption = AnimationOption());
55     void Translate(const Dimension& x, const Dimension& y, const Dimension& z,
56         const AnimationOption& animationOption = AnimationOption());
57     void TranslateX(const Dimension& x, const AnimationOption& animationOption = AnimationOption());
58     void TranslateY(const Dimension& y, const AnimationOption& animationOption = AnimationOption());
59     void TranslateZ(const Dimension& z, const AnimationOption& animationOption = AnimationOption());
60     // scale
61     void Scale(float value, const AnimationOption& animationOption = AnimationOption());
62     void Scale(float x, float y, const AnimationOption& animationOption = AnimationOption());
63     void Scale(float x, float y, float z, const AnimationOption& animationOption = AnimationOption());
64     void ScaleX(float x, const AnimationOption& animationOption = AnimationOption());
65     void ScaleY(float y, const AnimationOption& animationOption = AnimationOption());
66     void ScaleZ(float z, const AnimationOption& animationOption = AnimationOption());
67     // rotate
68     void Rotate(float dx, float dy, float dz, float angle, const AnimationOption& animationOption = AnimationOption());
69     void RotateX(float angle, const AnimationOption& animationOption = AnimationOption());
70     void RotateY(float angle, const AnimationOption& animationOption = AnimationOption());
71     void RotateZ(float angle, const AnimationOption& animationOption = AnimationOption());
72     // skew
73     void Skew(float xAngle, float yAngle, const AnimationOption& animationOption = AnimationOption());
74     void SkewX(float angle, const AnimationOption& = AnimationOption());
75     void SkewY(float angle, const AnimationOption& = AnimationOption());
76     // perspective
77     void Perspective(const Dimension& value, const AnimationOption& = AnimationOption());
78     // matrix2d
79     void Matrix(float a, float b, float c, float d, float dx, float dy, const AnimationOption& = AnimationOption());
80     // matrix3d in the column-major order.
81     void Matrix3d(float a1, float b1, float c1, float d1, float a2, float b2, float c2, float d2, float a3, float b3,
82         float c3, float d3, float a4, float b4, float c4, float d4, const AnimationOption& = AnimationOption());
83     void Matrix3d(Matrix4 m, const AnimationOption& = AnimationOption());
84 
GetOriginDimension()85     const DimensionOffset& GetOriginDimension() const
86     {
87         return originDimension_;
88     }
89 
SetOriginDimension(const DimensionOffset & origin)90     void SetOriginDimension(const DimensionOffset& origin)
91     {
92         originDimension_ = origin;
93     }
94 
GetTransformEffects()95     const AnimatableTransformOperations& GetTransformEffects() const
96     {
97         return transformEffects;
98     }
99 
GetTransform()100     const Matrix4& GetTransform() const
101     {
102         return transform_;
103     }
104 
SetTransform(const Matrix4 & transform)105     void SetTransform(const Matrix4& transform)
106     {
107         transform_ = transform;
108     }
109 
ResetTransform()110     void ResetTransform()
111     {
112         transform_ = Matrix4::CreateIdentity();
113         transformEffects.Clear();
114     }
115 
SetClickSpringEffectType(ClickSpringEffectType type)116     void SetClickSpringEffectType(ClickSpringEffectType type)
117     {
118         clickSpringEffectType_ = type;
119     }
120 
GetClickSpringEffectType()121     ClickSpringEffectType GetClickSpringEffectType() const
122     {
123         return clickSpringEffectType_;
124     }
125 
SetTransitionEffect(TransitionEffect transitionEffect)126     void SetTransitionEffect(TransitionEffect transitionEffect)
127     {
128         transitionEffect_ = transitionEffect;
129     }
130 
GetTransitionEffect()131     TransitionEffect GetTransitionEffect() const
132     {
133         return transitionEffect_;
134     }
135 
SetShadow(const Shadow & shadow)136     void SetShadow(const Shadow& shadow)
137     {
138         shadow_ = shadow;
139     }
140 
GetShadow()141     const Shadow& GetShadow() const
142     {
143         return shadow_;
144     }
145 
GetTransformEffectsAppearing()146     const std::vector<TransformOperation>& GetTransformEffectsAppearing() const
147     {
148         return transformEffectsAppearing_;
149     }
150 
GetTransformEffectsDisappearing()151     const std::vector<TransformOperation>& GetTransformEffectsDisappearing() const
152     {
153         return transformEffectsDisappearing_;
154     }
155 
HasDisappearTransition()156     bool HasDisappearTransition() const
157     {
158         return hasDisappearTransition_;
159     }
160 
HasAppearTransition()161     bool HasAppearTransition() const
162     {
163         return hasAppearTransition_;
164     }
165 
166     void SetScaleTransition(TransitionType type, float x, float y, float z);
167     void SetTranslateTransition(TransitionType type, const Dimension& x, const Dimension& y, const Dimension& z);
168     void SetRotateTransition(TransitionType type, double x, double y, double z, double angle);
169 
GetStateAttributes()170     RefPtr<StateAttributes<TransformStateAttribute>> GetStateAttributes()
171     {
172         if (stateAttributeList_ == nullptr) {
173             stateAttributeList_ = MakeRefPtr<StateAttributes<TransformStateAttribute>>();
174         }
175         return stateAttributeList_;
176     }
177 
HasStateAttributes()178     bool HasStateAttributes()
179     {
180         return stateAttributeList_ != nullptr;
181     }
182 
183 
184 private:
185     Matrix4 transform_;
186     AnimatableTransformOperations transformEffects;
187     DimensionOffset originDimension_ = DimensionOffset(HALF_PERCENT, HALF_PERCENT);
188     std::vector<TransformOperation> transformEffectsAppearing_;
189     std::vector<TransformOperation> transformEffectsDisappearing_;
190     bool hasDisappearTransition_ = false;
191     bool hasAppearTransition_ = false;
192     ClickSpringEffectType clickSpringEffectType_ = ClickSpringEffectType::NONE;
193     TransitionEffect transitionEffect_ = TransitionEffect::NONE;
194     Shadow shadow_;
195     RefPtr<StateAttributes<TransformStateAttribute>> stateAttributeList_ = nullptr;
196 };
197 
198 } // namespace OHOS::Ace
199 
200 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_TRANSFORM_TRANSFORM_COMPONENT_H
201