1 /* 2 * Copyright (c) 2021-2023 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 ROSEN_RENDER_SERVICE_BASE_COMMAND_RS_NODE_COMMAND_H 17 #define ROSEN_RENDER_SERVICE_BASE_COMMAND_RS_NODE_COMMAND_H 18 19 #include "animation/rs_frame_rate_range.h" 20 #include "command/rs_command_templates.h" 21 #include "common/rs_macros.h" 22 #include "pipeline/rs_render_node.h" 23 #include "property/rs_properties.h" 24 25 namespace OHOS { 26 namespace Rosen { 27 28 enum RSNodeCommandType : uint16_t { 29 ADD_MODIFIER, 30 REMOVE_MODIFIER, 31 32 UPDATE_MODIFIER_BOOL, 33 UPDATE_MODIFIER_FLOAT, 34 UPDATE_MODIFIER_INT, 35 UPDATE_MODIFIER_COLOR, 36 UPDATE_MODIFIER_GRAVITY, 37 UPDATE_MODIFIER_MATRIX3F, 38 UPDATE_MODIFIER_QUATERNION, 39 UPDATE_MODIFIER_FILTER_PTR, 40 UPDATE_MODIFIER_IMAGE_PTR, 41 UPDATE_MODIFIER_MASK_PTR, 42 UPDATE_MODIFIER_PATH_PTR, 43 UPDATE_MODIFIER_DYNAMIC_BRIGHTNESS, 44 UPDATE_MODIFIER_GRADIENT_BLUR_PTR, 45 UPDATE_MODIFIER_EMITTER_UPDATER_PTR, 46 UPDATE_MODIFIER_NOISE_FIELD_PTR, 47 UPDATE_MODIFIER_SHADER_PTR, 48 UPDATE_MODIFIER_VECTOR2F, 49 UPDATE_MODIFIER_VECTOR4_BORDER_STYLE, 50 UPDATE_MODIFIER_VECTOR4_COLOR, 51 UPDATE_MODIFIER_VECTOR4F, 52 UPDATE_MODIFIER_RRECT, 53 UPDATE_MODIFIER_DRAW_CMD_LIST, 54 UPDATE_MODIFIER_DRAWING_MATRIX, 55 56 SET_FREEZE, 57 SET_DRAW_REGION, 58 SET_OUT_OF_PARENT, 59 SET_TAKE_SURFACE_CAPTURE_FOR_UI_FLAG, 60 61 REGISTER_GEOMETRY_TRANSITION, 62 UNREGISTER_GEOMETRY_TRANSITION, 63 64 MARK_NODE_GROUP, 65 MARK_NODE_SINGLE_FRAME_COMPOSER, 66 MARK_SUGGEST_OPINC_NODE, 67 68 MARK_UIFIRST_NODE, 69 70 SET_NODE_NAME, 71 UPDATE_MODIFIER_MOTION_BLUR_PTR, 72 UPDATE_MODIFIER_MAGNIFIER_PTR, 73 UPDATE_MODIFIER_WATER_RIPPLE, 74 UPDATE_MODIFIER_FLY_OUT, 75 REMOVE_ALL_MODIFIERS, 76 77 DUMP_CLIENT_NODE_TREE, 78 COMMIT_DUMP_CLIENT_NODE_TREE, 79 }; 80 81 class RSB_EXPORT RSNodeCommandHelper { 82 public: 83 static void AddModifier(RSContext& context, NodeId nodeId, const std::shared_ptr<RSRenderModifier>& modifier); 84 static void RemoveModifier(RSContext& context, NodeId nodeId, PropertyId propertyId); 85 static void RemoveAllModifiers(RSContext& context, NodeId nodeId); 86 87 template<typename T> UpdateModifier(RSContext & context,NodeId nodeId,T value,PropertyId id,PropertyUpdateType type)88 static void UpdateModifier(RSContext& context, NodeId nodeId, T value, PropertyId id, PropertyUpdateType type) 89 { 90 std::shared_ptr<RSRenderPropertyBase> prop = std::make_shared<RSRenderProperty<T>>(value, id); 91 auto& nodeMap = context.GetNodeMap(); 92 auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId); 93 if (!node) { 94 return; 95 } 96 auto modifier = node->GetModifier(id); 97 if (!modifier) { 98 return; 99 } 100 switch (type) { 101 case UPDATE_TYPE_OVERWRITE: 102 modifier->Update(prop, false); 103 break; 104 case UPDATE_TYPE_INCREMENTAL: 105 modifier->Update(prop, true); 106 break; 107 case UPDATE_TYPE_FORCE_OVERWRITE: 108 modifier->Update(prop, false); 109 node->GetAnimationManager().CancelAnimationByPropertyId(id); 110 break; 111 default: 112 break; 113 } 114 } UpdateModifierDrawCmdList(RSContext & context,NodeId nodeId,Drawing::DrawCmdListPtr value,PropertyId id,bool isDelta)115 static void UpdateModifierDrawCmdList( 116 RSContext& context, NodeId nodeId, Drawing::DrawCmdListPtr value, PropertyId id, bool isDelta) 117 { 118 std::shared_ptr<RSRenderPropertyBase> prop = 119 std::make_shared<RSRenderProperty<Drawing::DrawCmdListPtr>>(value, id); 120 auto& nodeMap = context.GetNodeMap(); 121 auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId); 122 if (!node) { 123 return; 124 } 125 auto modifier = node->GetModifier(id); 126 if (!modifier) { 127 return; 128 } 129 modifier->Update(prop, isDelta); 130 if (value) { 131 value->UpdateNodeIdToPicture(nodeId); 132 } 133 } 134 135 static void SetFreeze(RSContext& context, NodeId nodeId, bool isFreeze); 136 static void SetNodeName(RSContext& context, NodeId nodeId, std::string& nodeName); 137 static void MarkNodeGroup(RSContext& context, NodeId nodeId, bool isNodeGroup, bool isForced, 138 bool includeProperty); 139 static void MarkNodeSingleFrameComposer(RSContext& context, NodeId nodeId, bool isNodeFasterDraw, pid_t pid); 140 static void MarkSuggestOpincNode(RSContext& context, NodeId nodeId, bool isOpincNode, bool isNeedCalculate); 141 142 static void MarkUifirstNode(RSContext& context, NodeId nodeId, bool isUifirstNode); 143 144 static void SetDrawRegion(RSContext& context, NodeId nodeId, std::shared_ptr<RectF> rect); 145 static void SetOutOfParent(RSContext& context, NodeId nodeId, OutOfParentType outOfParent); 146 147 static void RegisterGeometryTransitionPair(RSContext& context, NodeId inNodeId, NodeId outNodeId); 148 static void UnregisterGeometryTransitionPair(RSContext& context, NodeId inNodeId, NodeId outNodeId); 149 150 using DumpNodeTreeProcessor = std::function<void(NodeId, pid_t, uint32_t)>; 151 static void DumpClientNodeTree(RSContext& context, NodeId nodeId, pid_t pid, uint32_t taskId); 152 static RSB_EXPORT void SetDumpNodeTreeProcessor(DumpNodeTreeProcessor processor); 153 154 using CommitDumpNodeTreeProcessor = std::function<void(NodeId, pid_t, uint32_t, const std::string&)>; 155 static void CommitDumpClientNodeTree(RSContext& context, NodeId nodeId, pid_t, uint32_t taskId, 156 const std::string& result); 157 static RSB_EXPORT void SetCommitDumpNodeTreeProcessor(CommitDumpNodeTreeProcessor processor); 158 }; 159 160 ADD_COMMAND(RSAddModifier, 161 ARG(RS_NODE, ADD_MODIFIER, RSNodeCommandHelper::AddModifier, NodeId, std::shared_ptr<RSRenderModifier>)) 162 ADD_COMMAND(RSRemoveModifier, 163 ARG(RS_NODE, REMOVE_MODIFIER, RSNodeCommandHelper::RemoveModifier, NodeId, PropertyId)) 164 165 ADD_COMMAND(RSUpdatePropertyBool, 166 ARG(RS_NODE, UPDATE_MODIFIER_BOOL, RSNodeCommandHelper::UpdateModifier<bool>, 167 NodeId, bool, PropertyId, PropertyUpdateType)) 168 ADD_COMMAND(RSUpdatePropertyFloat, 169 ARG(RS_NODE, UPDATE_MODIFIER_FLOAT, RSNodeCommandHelper::UpdateModifier<float>, 170 NodeId, float, PropertyId, PropertyUpdateType)) 171 ADD_COMMAND(RSUpdatePropertyInt, 172 ARG(RS_NODE, UPDATE_MODIFIER_INT, RSNodeCommandHelper::UpdateModifier<int>, 173 NodeId, int, PropertyId, PropertyUpdateType)) 174 ADD_COMMAND(RSUpdatePropertyColor, 175 ARG(RS_NODE, UPDATE_MODIFIER_COLOR, RSNodeCommandHelper::UpdateModifier<Color>, 176 NodeId, Color, PropertyId, PropertyUpdateType)) 177 ADD_COMMAND(RSUpdatePropertyGravity, 178 ARG(RS_NODE, UPDATE_MODIFIER_GRAVITY, RSNodeCommandHelper::UpdateModifier<Gravity>, 179 NodeId, Gravity, PropertyId, PropertyUpdateType)) 180 ADD_COMMAND(RSUpdatePropertyMatrix3f, 181 ARG(RS_NODE, UPDATE_MODIFIER_MATRIX3F, RSNodeCommandHelper::UpdateModifier<Matrix3f>, 182 NodeId, Matrix3f, PropertyId, PropertyUpdateType)) 183 ADD_COMMAND(RSUpdatePropertyQuaternion, 184 ARG(RS_NODE, UPDATE_MODIFIER_QUATERNION, RSNodeCommandHelper::UpdateModifier<Quaternion>, 185 NodeId, Quaternion, PropertyId, PropertyUpdateType)) 186 ADD_COMMAND(RSUpdatePropertyFilter, 187 ARG(RS_NODE, UPDATE_MODIFIER_FILTER_PTR, RSNodeCommandHelper::UpdateModifier<std::shared_ptr<RSFilter>>, 188 NodeId, std::shared_ptr<RSFilter>, PropertyId, PropertyUpdateType)) 189 ADD_COMMAND(RSUpdatePropertyImage, 190 ARG(RS_NODE, UPDATE_MODIFIER_IMAGE_PTR, RSNodeCommandHelper::UpdateModifier<std::shared_ptr<RSImage>>, 191 NodeId, std::shared_ptr<RSImage>, PropertyId, PropertyUpdateType)) 192 ADD_COMMAND(RSUpdatePropertyMask, 193 ARG(RS_NODE, UPDATE_MODIFIER_MASK_PTR, RSNodeCommandHelper::UpdateModifier<std::shared_ptr<RSMask>>, 194 NodeId, std::shared_ptr<RSMask>, PropertyId, PropertyUpdateType)) 195 ADD_COMMAND(RSUpdatePropertyPath, 196 ARG(RS_NODE, UPDATE_MODIFIER_PATH_PTR, RSNodeCommandHelper::UpdateModifier<std::shared_ptr<RSPath>>, 197 NodeId, std::shared_ptr<RSPath>, PropertyId, PropertyUpdateType)) 198 ADD_COMMAND(RSUpdatePropertyDynamicBrightness, 199 ARG(RS_NODE, UPDATE_MODIFIER_DYNAMIC_BRIGHTNESS, 200 RSNodeCommandHelper::UpdateModifier<RSDynamicBrightnessPara>, 201 NodeId, RSDynamicBrightnessPara, PropertyId, PropertyUpdateType)) 202 ADD_COMMAND(RSUpdatePropertyWaterRipple, 203 ARG(RS_NODE, UPDATE_MODIFIER_WATER_RIPPLE, 204 RSNodeCommandHelper::UpdateModifier<RSWaterRipplePara>, 205 NodeId, RSWaterRipplePara, PropertyId, PropertyUpdateType)) 206 ADD_COMMAND(RSUpdatePropertyFlyOut, 207 ARG(RS_NODE, UPDATE_MODIFIER_FLY_OUT, 208 RSNodeCommandHelper::UpdateModifier<RSFlyOutPara>, 209 NodeId, RSFlyOutPara, PropertyId, PropertyUpdateType)) 210 ADD_COMMAND(RSUpdatePropertyLinearGradientBlurPara, 211 ARG(RS_NODE, UPDATE_MODIFIER_GRADIENT_BLUR_PTR, 212 RSNodeCommandHelper::UpdateModifier<std::shared_ptr<RSLinearGradientBlurPara>>, 213 NodeId, std::shared_ptr<RSLinearGradientBlurPara>, PropertyId, PropertyUpdateType)) 214 ADD_COMMAND(RSUpdatePropertyMotionBlurPara, 215 ARG(RS_NODE, UPDATE_MODIFIER_MOTION_BLUR_PTR, 216 RSNodeCommandHelper::UpdateModifier<std::shared_ptr<MotionBlurParam>>, 217 NodeId, std::shared_ptr<MotionBlurParam>, PropertyId, PropertyUpdateType)) 218 ADD_COMMAND(RSUpdatePropertyMagnifierPara, 219 ARG(RS_NODE, UPDATE_MODIFIER_MAGNIFIER_PTR, 220 RSNodeCommandHelper::UpdateModifier<std::shared_ptr<RSMagnifierParams>>, 221 NodeId, std::shared_ptr<RSMagnifierParams>, PropertyId, PropertyUpdateType)) 222 ADD_COMMAND(RSUpdatePropertyEmitterUpdater, 223 ARG(RS_NODE, UPDATE_MODIFIER_EMITTER_UPDATER_PTR, 224 RSNodeCommandHelper::UpdateModifier<std::vector<std::shared_ptr<EmitterUpdater>>>, 225 NodeId, std::vector<std::shared_ptr<EmitterUpdater>>, PropertyId, PropertyUpdateType)) 226 ADD_COMMAND(RSUpdatePropertyParticleNoiseFields, 227 ARG(RS_NODE, UPDATE_MODIFIER_NOISE_FIELD_PTR, 228 RSNodeCommandHelper::UpdateModifier<std::shared_ptr<ParticleNoiseFields>>, 229 NodeId, std::shared_ptr<ParticleNoiseFields>, PropertyId, PropertyUpdateType)) 230 ADD_COMMAND(RSUpdatePropertyShader, 231 ARG(RS_NODE, UPDATE_MODIFIER_SHADER_PTR, RSNodeCommandHelper::UpdateModifier<std::shared_ptr<RSShader>>, 232 NodeId, std::shared_ptr<RSShader>, PropertyId, PropertyUpdateType)) 233 ADD_COMMAND(RSUpdatePropertyVector2f, 234 ARG(RS_NODE, UPDATE_MODIFIER_VECTOR2F, RSNodeCommandHelper::UpdateModifier<Vector2f>, 235 NodeId, Vector2f, PropertyId, PropertyUpdateType)) 236 ADD_COMMAND(RSUpdatePropertyBorderStyle, 237 ARG(RS_NODE, UPDATE_MODIFIER_VECTOR4_BORDER_STYLE, RSNodeCommandHelper::UpdateModifier<Vector4<uint32_t>>, 238 NodeId, Vector4<uint32_t>, PropertyId, PropertyUpdateType)) 239 ADD_COMMAND(RSUpdatePropertyVector4Color, 240 ARG(RS_NODE, UPDATE_MODIFIER_VECTOR4_COLOR, RSNodeCommandHelper::UpdateModifier<Vector4<Color>>, 241 NodeId, Vector4<Color>, PropertyId, PropertyUpdateType)) 242 ADD_COMMAND(RSUpdatePropertyVector4f, 243 ARG(RS_NODE, UPDATE_MODIFIER_VECTOR4F, RSNodeCommandHelper::UpdateModifier<Vector4f>, 244 NodeId, Vector4f, PropertyId, PropertyUpdateType)) 245 ADD_COMMAND(RSUpdatePropertyRRect, 246 ARG(RS_NODE, UPDATE_MODIFIER_RRECT, RSNodeCommandHelper::UpdateModifier<RRect>, 247 NodeId, RRect, PropertyId, PropertyUpdateType)) 248 ADD_COMMAND(RSUpdatePropertyDrawCmdList, 249 ARG(RS_NODE, UPDATE_MODIFIER_DRAW_CMD_LIST, RSNodeCommandHelper::UpdateModifierDrawCmdList, 250 NodeId, Drawing::DrawCmdListPtr, PropertyId, PropertyUpdateType)) 251 ADD_COMMAND(RSUpdatePropertyDrawingMatrix, 252 ARG(RS_NODE, UPDATE_MODIFIER_DRAWING_MATRIX, RSNodeCommandHelper::UpdateModifier<Drawing::Matrix>, 253 NodeId, Drawing::Matrix, PropertyId, PropertyUpdateType)) 254 255 ADD_COMMAND(RSSetFreeze, 256 ARG(RS_NODE, SET_FREEZE, RSNodeCommandHelper::SetFreeze, NodeId, bool)) 257 ADD_COMMAND(RSSetNodeName, 258 ARG(RS_NODE, SET_NODE_NAME, RSNodeCommandHelper::SetNodeName, NodeId, std::string)) 259 ADD_COMMAND(RSMarkNodeGroup, 260 ARG(RS_NODE, MARK_NODE_GROUP, RSNodeCommandHelper::MarkNodeGroup, NodeId, bool, bool, bool)) 261 ADD_COMMAND(RSMarkNodeSingleFrameComposer, 262 ARG(RS_NODE, MARK_NODE_SINGLE_FRAME_COMPOSER, RSNodeCommandHelper::MarkNodeSingleFrameComposer, 263 NodeId, bool, pid_t)) 264 ADD_COMMAND(RSMarkSuggestOpincNode, 265 ARG(RS_NODE, MARK_SUGGEST_OPINC_NODE, RSNodeCommandHelper::MarkSuggestOpincNode, NodeId, bool, bool)) 266 267 ADD_COMMAND(RSMarkUifirstNode, 268 ARG(RS_NODE, MARK_UIFIRST_NODE, RSNodeCommandHelper::MarkUifirstNode, NodeId, bool)) 269 270 ADD_COMMAND(RSSetDrawRegion, 271 ARG(RS_NODE, SET_DRAW_REGION, RSNodeCommandHelper::SetDrawRegion, 272 NodeId, std::shared_ptr<RectF>)) 273 ADD_COMMAND(RSSetOutOfParent, 274 ARG(RS_NODE, SET_OUT_OF_PARENT, RSNodeCommandHelper::SetOutOfParent, 275 NodeId, OutOfParentType)) 276 277 ADD_COMMAND(RSRegisterGeometryTransitionNodePair, 278 ARG(RS_NODE, REGISTER_GEOMETRY_TRANSITION, RSNodeCommandHelper::RegisterGeometryTransitionPair, NodeId, NodeId)) 279 ADD_COMMAND(RSUnregisterGeometryTransitionNodePair, 280 ARG(RS_NODE, UNREGISTER_GEOMETRY_TRANSITION, RSNodeCommandHelper::UnregisterGeometryTransitionPair, NodeId, NodeId)) 281 ADD_COMMAND(RSRemoveAllModifiers, 282 ARG(RS_NODE, REMOVE_ALL_MODIFIERS, RSNodeCommandHelper::RemoveAllModifiers, NodeId)) 283 284 ADD_COMMAND(RSDumpClientNodeTree, 285 ARG(RS_NODE, DUMP_CLIENT_NODE_TREE, RSNodeCommandHelper::DumpClientNodeTree, NodeId, pid_t, uint32_t)) 286 ADD_COMMAND(RSCommitDumpClientNodeTree, 287 ARG(RS_NODE, COMMIT_DUMP_CLIENT_NODE_TREE, 288 RSNodeCommandHelper::CommitDumpClientNodeTree, NodeId, pid_t, uint32_t, std::string)) 289 } // namespace Rosen 290 } // namespace OHOS 291 292 #endif // ROSEN_RENDER_SERVICE_BASE_COMMAND_RS_NODE_COMMAND_H 293