1 /*
2 * Copyright (c) 2025 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 "common/rs_optional_trace.h"
17 #include "monitor/self_drawing_node_monitor.h"
18 #include "platform/common/rs_log.h"
19 #include "rs_trace.h"
20 namespace OHOS {
21 namespace Rosen {
22
GetInstance()23 SelfDrawingNodeMonitor &SelfDrawingNodeMonitor::GetInstance()
24 {
25 static SelfDrawingNodeMonitor monitor;
26 return monitor;
27 }
28
InsertCurRectMap(NodeId id,RectI rect)29 void SelfDrawingNodeMonitor::InsertCurRectMap(NodeId id, RectI rect)
30 {
31 curRect_[id] = rect;
32 }
33
EraseCurRectMap(NodeId id)34 void SelfDrawingNodeMonitor::EraseCurRectMap(NodeId id)
35 {
36 curRect_.erase(id);
37 }
38
ClearRectMap()39 void SelfDrawingNodeMonitor::ClearRectMap()
40 {
41 curRect_.clear();
42 lastRect_.clear();
43 }
44
RegisterRectChangeCallback(pid_t pid,const RectConstraint & constraint,sptr<RSISelfDrawingNodeRectChangeCallback> callback)45 void SelfDrawingNodeMonitor::RegisterRectChangeCallback(
46 pid_t pid, const RectConstraint& constraint, sptr<RSISelfDrawingNodeRectChangeCallback> callback)
47 {
48 RS_TRACE_NAME_FMT("SelfDrawingNodeMonitor::RegisterRectChangeCallback registerPid:%d", pid);
49 rectChangeCallbackListenner_[pid] = callback;
50 rectChangeCallbackConstraint_[pid] = constraint;
51 }
52
UnRegisterRectChangeCallback(pid_t pid)53 void SelfDrawingNodeMonitor::UnRegisterRectChangeCallback(pid_t pid)
54 {
55 RS_TRACE_NAME_FMT("SelfDrawingNodeMonitor::UnRegisterRectChangeCallback unRegisterPid:%d", pid);
56 rectChangeCallbackListenner_.erase(pid);
57 rectChangeCallbackConstraint_.erase(pid);
58 if (rectChangeCallbackListenner_.empty()) {
59 ClearRectMap();
60 }
61 }
62
TriggerRectChangeCallback()63 void SelfDrawingNodeMonitor::TriggerRectChangeCallback()
64 {
65 RS_OPTIONAL_TRACE_NAME_FMT("SelfDrawingNodeMonitor::TriggerRectChangeCallback");
66 if (rectChangeCallbackListenner_.empty()) {
67 return;
68 }
69
70 if (curRect_ != lastRect_) {
71 for (const auto& iter : rectChangeCallbackListenner_) {
72 pid_t pid = iter.first;
73 bool shouldTrigger = false;
74 SelfDrawingNodeRectCallbackData callbackData;
75 auto constraintIter = rectChangeCallbackConstraint_.find(pid);
76 if (constraintIter != rectChangeCallbackConstraint_.end()) {
77 shouldTrigger = ShouldTrigger(constraintIter->second, callbackData);
78 }
79 if (shouldTrigger && iter.second) {
80 iter.second->OnSelfDrawingNodeRectChange(std::make_shared<RSSelfDrawingNodeRectData>(callbackData));
81 } else {
82 RS_LOGD("SelfDrawingNodeMonitor::TriggerRectChangeCallback callback is null or shouldnot trigger "
83 "%{public}s", shouldTrigger ? "true" : "false");
84 }
85 }
86 lastRect_ = curRect_;
87 }
88 }
89
ShouldTrigger(RectConstraint & constraint,SelfDrawingNodeRectCallbackData & callbackData)90 bool SelfDrawingNodeMonitor::ShouldTrigger(RectConstraint& constraint, SelfDrawingNodeRectCallbackData& callbackData)
91 {
92 bool ret = false;
93 for (auto& [nodeId, rect] : curRect_) {
94 if (constraint.pids.find(ExtractPid(nodeId)) == constraint.pids.end()) {
95 continue;
96 }
97 auto iter = lastRect_.find(nodeId);
98 if (iter == lastRect_.end()) {
99 if (CheckStatify(rect, constraint)) {
100 callbackData.insert(std::make_pair(nodeId, rect));
101 ret = true;
102 }
103 } else if (iter->second != rect) {
104 if (CheckStatify(rect, constraint) != CheckStatify(iter->second, constraint)) {
105 callbackData.insert(std::make_pair(nodeId, rect));
106 ret = true;
107 }
108 }
109 }
110
111 for (auto& [nodeId, lastRect] : lastRect_) {
112 if (constraint.pids.find(ExtractPid(nodeId)) == constraint.pids.end()) {
113 continue;
114 }
115 if (curRect_.find(nodeId) == curRect_.end()) {
116 if (CheckStatify(lastRect, constraint)) {
117 callbackData.insert(std::make_pair(nodeId, RectI(0, 0, 0, 0)));
118 ret = true;
119 }
120 }
121 }
122 return ret;
123 }
124
CheckStatify(RectI & rect,RectConstraint & constraint) const125 bool SelfDrawingNodeMonitor::CheckStatify(RectI& rect, RectConstraint& constraint) const
126 {
127 RS_OPTIONAL_TRACE_NAME_FMT("SelfDrawingNodeMonitor::CheckStatify rect %d %d %d %d", rect.GetTop(), rect.GetLeft(),
128 rect.GetWidth(), rect.GetHeight());
129 if (rect.GetWidth() >= constraint.range.lowLimit.width && rect.GetHeight() >= constraint.range.lowLimit.height &&
130 rect.GetWidth() <= constraint.range.highLimit.width && rect.GetHeight() <= constraint.range.highLimit.height) {
131 return true;
132 }
133 return false;
134 }
135 } // namespace Rosen
136 } // namespace OHOS