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