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