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