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