• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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