• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_base_node_command.h"
17 
18 #include "pipeline/rs_base_render_node.h"
19 #include "platform/common/rs_log.h"
20 #include "rs_trace.h"
21 
22 namespace OHOS {
23 namespace Rosen {
24 
Destroy(RSContext & context,NodeId nodeId)25 void BaseNodeCommandHelper::Destroy(RSContext& context, NodeId nodeId)
26 {
27     auto& nodeMap = context.GetMutableNodeMap();
28     auto node = nodeMap.GetRenderNode(nodeId);
29     if (node == nullptr) {
30         return;
31     }
32     auto parent = node->GetParent().lock();
33     node->ClearChildren();
34     node->RemoveFromTree();
35     nodeMap.UnregisterRenderNode(node->GetId());
36     if (parent) {
37         parent->RemoveChildFromFulllist(node->GetId());
38     }
39 }
40 
AddChild(RSContext & context,NodeId nodeId,NodeId childNodeId,int32_t index)41 void BaseNodeCommandHelper::AddChild(RSContext& context, NodeId nodeId, NodeId childNodeId, int32_t index)
42 {
43     auto& nodeMap = context.GetNodeMap();
44     auto node = nodeMap.GetRenderNode(nodeId);
45     auto child = nodeMap.GetRenderNode(childNodeId);
46     if (node && child) {
47         node->AddChild(child, index);
48     } else if (child == nullptr) {
49         RS_LOGE("BaseNodeCommandHelper::AddChild child:%{public}" PRIu64 " not found in map", childNodeId);
50         RS_TRACE_NAME_FMT("BaseNodeCommandHelper::AddChild child:%" PRIu64 " not found in map", childNodeId);
51         context.GetMutableNodeMap().RegisterUnTreeNode(childNodeId);
52     }
53 }
54 
MoveChild(RSContext & context,NodeId nodeId,NodeId childNodeId,int32_t index)55 void BaseNodeCommandHelper::MoveChild(RSContext& context, NodeId nodeId, NodeId childNodeId, int32_t index)
56 {
57     auto& nodeMap = context.GetNodeMap();
58     auto node = nodeMap.GetRenderNode(nodeId);
59     auto child = nodeMap.GetRenderNode(childNodeId);
60     if (node && child) {
61         node->MoveChild(child, index);
62     }
63 }
64 
RemoveChild(RSContext & context,NodeId nodeId,NodeId childNodeId)65 void BaseNodeCommandHelper::RemoveChild(RSContext& context, NodeId nodeId, NodeId childNodeId)
66 {
67     auto& nodeMap = context.GetNodeMap();
68     auto node = nodeMap.GetRenderNode(nodeId);
69     auto child = nodeMap.GetRenderNode(childNodeId);
70     if (node && child) {
71         node->RemoveChild(child);
72     }
73 }
74 
AddCrossParentChild(RSContext & context,NodeId id,NodeId childId,int32_t index)75 void BaseNodeCommandHelper::AddCrossParentChild(RSContext& context, NodeId id, NodeId childId, int32_t index)
76 {
77     auto& nodeMap = context.GetNodeMap();
78     auto node = nodeMap.GetRenderNode(id);
79     auto child = nodeMap.GetRenderNode(childId);
80     if (node && child) {
81         node->AddCrossParentChild(child, index);
82     }
83 }
84 
RemoveCrossParentChild(RSContext & context,NodeId nodeId,NodeId childNodeId,NodeId newParentId)85 void BaseNodeCommandHelper::RemoveCrossParentChild(RSContext& context, NodeId nodeId, NodeId childNodeId,
86     NodeId newParentId)
87 {
88     auto& nodeMap = context.GetNodeMap();
89     auto node = nodeMap.GetRenderNode(nodeId);
90     auto child = nodeMap.GetRenderNode(childNodeId);
91     auto newParent = nodeMap.GetRenderNode(newParentId);
92     if (node && child && newParent) {
93         node->RemoveCrossParentChild(child, newParent);
94     }
95 }
96 
SetIsCrossNode(RSContext & context,NodeId nodeId,bool isCrossNode)97 void BaseNodeCommandHelper::SetIsCrossNode(RSContext& context, NodeId nodeId, bool isCrossNode)
98 {
99     if (auto node = context.GetNodeMap().GetRenderNode(nodeId)) {
100         node->SetIsCrossNode(isCrossNode);
101     }
102 }
103 
AddCrossScreenChild(RSContext & context,NodeId id,NodeId childId,NodeId cloneNodeId,int32_t index,bool autoClearCloneNode)104 void BaseNodeCommandHelper::AddCrossScreenChild(RSContext& context, NodeId id, NodeId childId,
105     NodeId cloneNodeId, int32_t index, bool autoClearCloneNode)
106 {
107     auto& nodeMap = context.GetNodeMap();
108     auto node = nodeMap.GetRenderNode(id);
109     auto child = nodeMap.GetRenderNode(childId);
110     if (node) {
111         node->AddCrossScreenChild(child, cloneNodeId, index, autoClearCloneNode);
112     }
113 }
114 
RemoveCrossScreenChild(RSContext & context,NodeId nodeId,NodeId childNodeId)115 void BaseNodeCommandHelper::RemoveCrossScreenChild(RSContext& context, NodeId nodeId, NodeId childNodeId)
116 {
117     auto& nodeMap = context.GetNodeMap();
118     auto node = nodeMap.GetRenderNode(nodeId);
119     auto child = nodeMap.GetRenderNode(childNodeId);
120     if (node) {
121         node->RemoveCrossScreenChild(child);
122     }
123 }
124 
RemoveFromTree(RSContext & context,NodeId nodeId)125 void BaseNodeCommandHelper::RemoveFromTree(RSContext& context, NodeId nodeId)
126 {
127     auto& nodeMap = context.GetNodeMap();
128     auto node = nodeMap.GetRenderNode(nodeId);
129     if (node == nullptr) {
130         return;
131     }
132     node->RemoveFromTree();
133 }
134 
ClearChildren(RSContext & context,NodeId nodeId)135 void BaseNodeCommandHelper::ClearChildren(RSContext& context, NodeId nodeId)
136 {
137     auto& nodeMap = context.GetNodeMap();
138     auto node = nodeMap.GetRenderNode(nodeId);
139     if (node) {
140         node->ClearChildren();
141     }
142 }
143 } // namespace Rosen
144 } // namespace OHOS
145