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