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