• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 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 RENDER_SERVICE_CLIENT_CORE_ANIMATION_RS_SYMBOL_ANIMATION_H
17 #define RENDER_SERVICE_CLIENT_CORE_ANIMATION_RS_SYMBOL_ANIMATION_H
18 
19 #include <map>
20 #include <string>
21 #include <vector>
22 
23 #include "animation/rs_animation_timing_curve.h"
24 #include "animation/rs_symbol_node_config.h"
25 #include "common/rs_vector2.h"
26 #include "common/rs_vector4.h"
27 #include "draw/path.h"
28 #include "modifier/rs_property.h"
29 #include "symbol_animation_config.h"
30 #include "ui/rs_canvas_node.h"
31 #include "ui/rs_node.h"
32 
33 namespace OHOS {
34 namespace Rosen {
35 class RSC_EXPORT RSSymbolAnimation {
36 public:
37     RSSymbolAnimation();
38     virtual ~RSSymbolAnimation();
SetNode(std::shared_ptr<RSNode> & rsNode)39     void SetNode(std::shared_ptr<RSNode>& rsNode)
40     {
41         rsNode_ = rsNode;
42     }
43 
44     // set symbol animation manager
45     bool SetSymbolAnimation(const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig);
46 
47 private:
48     bool SetSymbolGeometry(const std::shared_ptr<RSNode>& rsNode, const Vector4f& bounds);
49     // SetPublicAnimation is interface for animation that can be spliced by atomizated animations
50     bool SetPublicAnimation(const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig);
51     bool GetAnimationGroupParameters(const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig,
52         std::vector<std::vector<Drawing::DrawingPiecewiseParameter>>& parameters,
53         Drawing::DrawingEffectStrategy& effectStrategy);
54     void UpdateSymbolGeometry(const std::shared_ptr<RSNode>& rsNode, const Vector4f& bounds);
55     // choose the animation is a public animation or special animation
56     bool ChooseAnimation(const std::shared_ptr<RSNode>& rsNode,
57         std::vector<Drawing::DrawingPiecewiseParameter>& parameters,
58         const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig);
59     bool SetKeyframeAlphaAnimation(const std::shared_ptr<RSNode>& rsNode,
60         std::vector<Drawing::DrawingPiecewiseParameter>& parameters,
61         const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig);
62 
63     void InitSupportAnimationTable(const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig);
64 
65     // set text flip animation
66     bool SetTextFlipAnimation(const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig);
67     void SetFlipDisappear(
68         const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig,
69         std::shared_ptr<RSNode>& rsNode);
70     bool SetFlipAppear(
71         const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig,
72         std::shared_ptr<RSNode>& rsNode, bool isStartAnimation);
73 
74     std::vector<Drawing::DrawingPiecewiseParameter> UpdateParametersDelay(
75         const std::vector<Drawing::DrawingPiecewiseParameter>& parameters, int delay);
76 
77     // Create a node that is the same as the original node
78     void CreateSameNode(uint64_t symbolId, std::shared_ptr<RSNode>& rsNode,
79         const std::shared_ptr<RSNode>& rsNodeRoot);
80 
81     // to start animations for one path group
82     void GroupAnimationStart(
83         const std::shared_ptr<RSNode>& rsNode, std::vector<std::shared_ptr<RSAnimation>>& animations);
84 
85     // Set Node Center Offset
86     void SetNodePivot(const std::shared_ptr<RSNode>& rsNode);
87 
88     // splice atomizated animation construct
89     void SpliceAnimation(const std::shared_ptr<RSNode>& rsNode,
90         const std::vector<Drawing::DrawingPiecewiseParameter>& parameters);
91 
92     // atomizated animation construct
93     void ScaleAnimationBase(const std::shared_ptr<RSNode>& rsNode,
94         std::shared_ptr<RSAnimatableProperty<Vector2f>>& scaleProperty,
95         const Drawing::DrawingPiecewiseParameter& scaleParameter,
96         std::vector<std::shared_ptr<RSAnimation>>& animations);
97 
98     void AlphaAnimationBase(const std::shared_ptr<RSNode>& rsNode,
99         std::shared_ptr<RSAnimatableProperty<float>>& alphaProperty,
100         const Drawing::DrawingPiecewiseParameter& alphaParameter,
101         std::vector<std::shared_ptr<RSAnimation>>& animations);
102 
103     void TranslateAnimationBase(const std::shared_ptr<RSNode>& rsNode,
104         std::shared_ptr<RSAnimatableProperty<Vector2f>>& property,
105         const Drawing::DrawingPiecewiseParameter& parameter,
106         std::vector<std::shared_ptr<RSAnimation>>& animations);
107 
108     void BlurAnimationBase(const std::shared_ptr<RSNode>& rsNode,
109         std::shared_ptr<RSAnimatableProperty<float>>& property,
110         const Drawing::DrawingPiecewiseParameter& parameter,
111         std::vector<std::shared_ptr<RSAnimation>>& animations);
112 
113     // drawing a path group : symbol drawing or path drawing
114     void GroupDrawing(const std::shared_ptr<RSCanvasNode>& canvasNode, TextEngine::SymbolNode& symbolNode,
115         const Vector4f& offsets, bool isClip = false);
116 
117     void SetIconProperty(Drawing::Brush& brush, Drawing::Pen& pen, Drawing::DrawingSColor& color);
118 
119     Vector4f CalculateOffset(const Drawing::Path& path, const float offsetX, const float offsetY);
120 
121     void DrawPathOnCanvas(
122         ExtendRecordingCanvas* recordingCanvas, TextEngine::SymbolNode& symbolNode, const Vector4f& offsets);
123 
124     void DrawClipOnCanvas(
125         ExtendRecordingCanvas* recordingCanvas, TextEngine::SymbolNode& symbolNode, const Vector4f& offsets);
126 
127     void DrawPathOnCanvas(ExtendRecordingCanvas* recordingCanvas,
128         const TextEngine::TextEffectElement& effectNode,
129         const Drawing::Color& color, const Drawing::Point& offset);
130 
131     bool CalcTimePercents(std::vector<float>& timePercents, const uint32_t totalDuration,
132         const std::vector<Drawing::DrawingPiecewiseParameter>& oneGroupParas);
133 
134     std::shared_ptr<RSAnimation> KeyframeAlphaSymbolAnimation(const std::shared_ptr<RSNode>& rsNode,
135         const Drawing::DrawingPiecewiseParameter& oneStageParas,
136         const uint32_t duration, const std::vector<float>& timePercents);
137     bool GetKeyframeAlphaAnimationParas(std::vector<Drawing::DrawingPiecewiseParameter>& oneGroupParas,
138         uint32_t& totalDuration, std::vector<float>& timePercents);
139 
140     // Set Replace Animation which include disappear stage and appear stage
141     bool SetReplaceAnimation(const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig);
142     // Set Disappear stage of replace animation
143     bool SetReplaceDisappear(const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig,
144         const std::shared_ptr<RSNode>& rsNode);
145     // Set appear stage of replace animation
146     bool SetReplaceAppear(const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig,
147     const std::shared_ptr<RSNode>& rsNode,
148         bool isStartAnimation=true);
149     // Set Disappear config of replace animation
150     bool SetDisappearConfig(const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig,
151         std::shared_ptr<TextEngine::SymbolAnimationConfig>& disappearConfig,
152         const std::shared_ptr<RSNode>& rsNode);
153 
154     // Determine whether to create a node based on the existing canvasNodesListMap node
155     bool CreateSymbolReplaceNode(const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig,
156         const Vector4f& bounds, uint32_t index, const std::shared_ptr<RSNode>& rsNode,
157         std::shared_ptr<RSCanvasNode>& canvasNode);
158 
159     bool CreateSymbolNode(const Vector4f& bounds, uint64_t symbolSpanId, uint32_t index,
160     const std::shared_ptr<RSNode>& rsNode, std::shared_ptr<RSCanvasNode>& canvasNode);
161 
162     // set Disable Animation
163     bool SetDisableAnimation(const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig);
164     bool SetDisableAnimation(const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig,
165         std::vector<std::vector<Drawing::DrawingPiecewiseParameter>>& parameters,
166         const std::shared_ptr<RSNode>& rsNodeRoot);
167 
168     void SetDisableParameter(std::vector<Drawing::DrawingPiecewiseParameter>& parameter,
169         const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig);
170 
171     bool SetDisableBaseLayer(const std::shared_ptr<RSNode>& rsNode,
172         const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig,
173         const std::vector<std::vector<Drawing::DrawingPiecewiseParameter>>& parameters,
174         const Vector4f& offsets);
175 
176     bool SetClipAnimation(const std::shared_ptr<RSNode>& rsNode,
177         const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig,
178         const std::vector<Drawing::DrawingPiecewiseParameter>& parameter,
179         uint32_t index, const Vector4f& offsets);
180 
181     void SetSymbolShadow(
182         const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig,
183         std::shared_ptr<RSNode>& rsNode,
184         const std::shared_ptr<RSNode>& rsNodeRoot);
185     void SetSymbolShadow(const SymbolShadow& symbolShadow, std::shared_ptr<RSNode>& rsNode);
186 
187     // process node before animation include clean invalid node and config info
188     void NodeProcessBeforeAnimation(
189         const std::shared_ptr<TextEngine::SymbolAnimationConfig>& symbolAnimationConfig);
190     // pop invalid node before replace animation, replace animation have special rsnode lifecycle.
191     void PopNodeFromReplaceList(uint64_t symbolSpanId);
192     void PopNodeFromReplaceList(uint64_t symbolSpanId, const std::shared_ptr<RSNode>& rsNode);
193 
194     void PopNodeFromFlipList(uint64_t symbolSpanId);
195 
196     std::shared_ptr<RSNode> rsNode_ = nullptr;
197     // scale symbol animation
198     std::shared_ptr<RSAnimatableProperty<Vector2f>> scaleProperty_ = nullptr;
199     std::shared_ptr<RSAnimatableProperty<Vector2f>> pivotProperty_ = nullptr;
200 
201     // variableColor symbol animation
202     std::vector<std::shared_ptr<RSAnimatableProperty<float>>> alphaPropertyStages_;
203 
204     // animation support splice base animation
205     std::vector<Drawing::DrawingEffectStrategy> publicSupportAnimations_ = {};
206     // animation support up&down interface
207     std::vector<Drawing::DrawingEffectStrategy> upAndDownSupportAnimations_ = {};
208 
209     // true that it contains at least one mask layer, false there is none
210     bool isMaskSymbol_ = false;
211     Vector4f symbolBounds_;
212     std::optional<FrameRateRange> range_;
213 };
214 } // namespace Rosen
215 } // namespace OHOS
216 
217 #endif
218