1 /*
2 * Copyright (c) 2021-2022 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 #include "command/rs_node_command.h"
17 #include "platform/common/rs_log.h"
18
19 namespace OHOS {
20 namespace Rosen {
21 namespace {
22 RSNodeCommandHelper::DumpNodeTreeProcessor gDumpNodeTreeProcessor = nullptr;
23 RSNodeCommandHelper::CommitDumpNodeTreeProcessor gCommitDumpNodeTreeProcessor = nullptr;
24 }
25
AddModifier(RSContext & context,NodeId nodeId,const std::shared_ptr<RSRenderModifier> & modifier)26 void RSNodeCommandHelper::AddModifier(RSContext& context, NodeId nodeId,
27 const std::shared_ptr<RSRenderModifier>& modifier)
28 {
29 auto& nodeMap = context.GetNodeMap();
30 auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
31 if (node) {
32 node->AddModifier(modifier);
33 }
34 }
35
RemoveModifier(RSContext & context,NodeId nodeId,PropertyId propertyId)36 void RSNodeCommandHelper::RemoveModifier(RSContext& context, NodeId nodeId, PropertyId propertyId)
37 {
38 auto& nodeMap = context.GetNodeMap();
39 auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
40 if (node) {
41 node->RemoveModifier(propertyId);
42 }
43 }
44
RemoveAllModifiers(RSContext & context,NodeId nodeId)45 void RSNodeCommandHelper::RemoveAllModifiers(RSContext& context, NodeId nodeId)
46 {
47 auto& nodeMap = context.GetNodeMap();
48 auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
49 if (node) {
50 node->RemoveAllModifiers();
51 }
52 }
53
SetFreeze(RSContext & context,NodeId nodeId,bool isFreeze)54 void RSNodeCommandHelper::SetFreeze(RSContext& context, NodeId nodeId, bool isFreeze)
55 {
56 auto& nodeMap = context.GetNodeMap();
57 auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
58 if (node) {
59 node->SetStaticCached(isFreeze);
60 }
61 }
62
SetNodeName(RSContext & context,NodeId nodeId,std::string & nodeName)63 void RSNodeCommandHelper::SetNodeName(RSContext& context, NodeId nodeId, std::string& nodeName)
64 {
65 auto& nodeMap = context.GetNodeMap();
66 auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
67 if (node) {
68 node->SetNodeName(nodeName);
69 }
70 }
71
MarkNodeGroup(RSContext & context,NodeId nodeId,bool isNodeGroup,bool isForced,bool includeProperty)72 void RSNodeCommandHelper::MarkNodeGroup(RSContext& context, NodeId nodeId, bool isNodeGroup, bool isForced,
73 bool includeProperty)
74 {
75 auto& nodeMap = context.GetNodeMap();
76 if (auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId)) {
77 node->MarkNodeGroup(isForced ? RSRenderNode::GROUPED_BY_USER : RSRenderNode::GROUPED_BY_UI, isNodeGroup,
78 includeProperty);
79 }
80 }
81
MarkNodeSingleFrameComposer(RSContext & context,NodeId nodeId,bool isNodeSingleFrameComposer,pid_t pid)82 void RSNodeCommandHelper::MarkNodeSingleFrameComposer(RSContext& context,
83 NodeId nodeId, bool isNodeSingleFrameComposer, pid_t pid)
84 {
85 auto& nodeMap = context.GetNodeMap();
86 if (auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId)) {
87 RSSingleFrameComposer::AddOrRemoveAppPidToMap(isNodeSingleFrameComposer, pid);
88 node->MarkNodeSingleFrameComposer(isNodeSingleFrameComposer, pid);
89 }
90 }
91
MarkSuggestOpincNode(RSContext & context,NodeId nodeId,bool isOpincNode,bool isNeedCalculate)92 void RSNodeCommandHelper::MarkSuggestOpincNode(RSContext& context, NodeId nodeId,
93 bool isOpincNode, bool isNeedCalculate)
94 {
95 auto& nodeMap = context.GetNodeMap();
96 if (auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId)) {
97 node->MarkSuggestOpincNode(isOpincNode, isNeedCalculate);
98 }
99 }
100
MarkUifirstNode(RSContext & context,NodeId nodeId,bool isUifirstNode)101 void RSNodeCommandHelper::MarkUifirstNode(RSContext& context, NodeId nodeId, bool isUifirstNode)
102 {
103 auto& nodeMap = context.GetNodeMap();
104 if (auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId)) {
105 node->MarkUifirstNode(isUifirstNode);
106 }
107 }
108
ForceUifirstNode(RSContext & context,NodeId nodeId,bool isForceFlag,bool isUifirstEnable)109 void RSNodeCommandHelper::ForceUifirstNode(RSContext& context, NodeId nodeId, bool isForceFlag,
110 bool isUifirstEnable)
111 {
112 auto& nodeMap = context.GetNodeMap();
113 if (auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId)) {
114 node->MarkUifirstNode(isForceFlag, isUifirstEnable);
115 }
116 }
117
SetDrawRegion(RSContext & context,NodeId nodeId,std::shared_ptr<RectF> rect)118 void RSNodeCommandHelper::SetDrawRegion(RSContext& context, NodeId nodeId, std::shared_ptr<RectF> rect)
119 {
120 auto& nodeMap = context.GetNodeMap();
121 auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
122 if (node) {
123 node->SetDrawRegion(rect);
124 }
125 }
126
SetOutOfParent(RSContext & context,NodeId nodeId,OutOfParentType outOfParent)127 void RSNodeCommandHelper::SetOutOfParent(RSContext& context, NodeId nodeId, OutOfParentType outOfParent)
128 {
129 auto& nodeMap = context.GetNodeMap();
130 auto node = nodeMap.GetRenderNode<RSRenderNode>(nodeId);
131 if (node) {
132 node->SetOutOfParent(outOfParent);
133 }
134 }
135
RegisterGeometryTransitionPair(RSContext & context,NodeId inNodeId,NodeId outNodeId)136 void RSNodeCommandHelper::RegisterGeometryTransitionPair(RSContext& context, NodeId inNodeId, NodeId outNodeId)
137 {
138 auto& nodeMap = context.GetNodeMap();
139 auto inNode = nodeMap.GetRenderNode<RSRenderNode>(inNodeId);
140 auto outNode = nodeMap.GetRenderNode<RSRenderNode>(outNodeId);
141 if (inNode == nullptr || outNode == nullptr) {
142 return;
143 }
144 if (inNode->GetInstanceRootNodeId() == 0 || outNode->GetInstanceRootNodeId() == 0) {
145 ROSEN_LOGE("SharedTransition:Register SharedTransition failed due to invalid instanceRootNodeId,"
146 " inNode:[%{public}" PRIu64 "], outNode:[%{public}" PRIu64 "]",
147 inNode->GetInstanceRootNodeId(), outNode->GetInstanceRootNodeId());
148 return;
149 }
150 auto sharedTransitionParam = std::make_shared<SharedTransitionParam>(inNode, outNode);
151 inNode->SetSharedTransitionParam(sharedTransitionParam);
152 outNode->SetSharedTransitionParam(sharedTransitionParam);
153 }
154
UnregisterGeometryTransitionPair(RSContext & context,NodeId inNodeId,NodeId outNodeId)155 void RSNodeCommandHelper::UnregisterGeometryTransitionPair(RSContext& context, NodeId inNodeId, NodeId outNodeId)
156 {
157 auto& nodeMap = context.GetNodeMap();
158 auto inNode = nodeMap.GetRenderNode<RSRenderNode>(inNodeId);
159 auto outNode = nodeMap.GetRenderNode<RSRenderNode>(outNodeId);
160 // Sanity check, if any check failed, RSUniRenderVisitor will auto unregister the pair, we do nothing here.
161 if (inNode && outNode && inNode->GetSharedTransitionParam() == outNode->GetSharedTransitionParam()) {
162 inNode->SetSharedTransitionParam(nullptr);
163 outNode->SetSharedTransitionParam(nullptr);
164 }
165 }
166
DumpClientNodeTree(RSContext & context,NodeId nodeId,pid_t pid,uint32_t taskId)167 void RSNodeCommandHelper::DumpClientNodeTree(RSContext& context, NodeId nodeId, pid_t pid, uint32_t taskId)
168 {
169 if (gDumpNodeTreeProcessor) {
170 gDumpNodeTreeProcessor(nodeId, pid, taskId);
171 }
172 }
173
SetDumpNodeTreeProcessor(DumpNodeTreeProcessor processor)174 void RSNodeCommandHelper::SetDumpNodeTreeProcessor(DumpNodeTreeProcessor processor)
175 {
176 gDumpNodeTreeProcessor = processor;
177 }
178
CommitDumpClientNodeTree(RSContext & context,NodeId nodeId,pid_t pid,uint32_t taskId,const std::string & result)179 void RSNodeCommandHelper::CommitDumpClientNodeTree(RSContext& context, NodeId nodeId, pid_t pid, uint32_t taskId,
180 const std::string& result)
181 {
182 if (gCommitDumpNodeTreeProcessor) {
183 gCommitDumpNodeTreeProcessor(nodeId, pid, taskId, result);
184 }
185 }
186
SetCommitDumpNodeTreeProcessor(CommitDumpNodeTreeProcessor processor)187 void RSNodeCommandHelper::SetCommitDumpNodeTreeProcessor(CommitDumpNodeTreeProcessor processor)
188 {
189 gCommitDumpNodeTreeProcessor = processor;
190 }
191 } // namespace Rosen
192 } // namespace OHOS
193