Skip to content

Commit 69f69cf

Browse files
authored
tp: Account for width/height in ViewCapture visibility computation. (#5850)
Bug: 512075191 Test: tools/ninja -C out/linux_clang_debug perfetto_unittests && out/linux_clang_debug/perfetto_unittests --gtest_filter=ViewCapture*
1 parent 6e43f4b commit 69f69cf

3 files changed

Lines changed: 92 additions & 23 deletions

File tree

src/trace_processor/importers/proto/winscope/viewcapture_test_utils.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,21 @@ class View {
4747
return *this;
4848
}
4949

50+
View& SetWidth(int32_t value) {
51+
width_ = value;
52+
return *this;
53+
}
54+
55+
View& SetHeight(int32_t value) {
56+
height_ = value;
57+
return *this;
58+
}
59+
5060
std::optional<int32_t> id_;
5161
std::optional<int32_t> parent_id_;
5262
std::optional<int32_t> visibility_;
63+
std::optional<int32_t> width_;
64+
std::optional<int32_t> height_;
5365
};
5466

5567
class SnapshotProtoBuilder {
@@ -78,6 +90,14 @@ class SnapshotProtoBuilder {
7890
if (view.visibility_.has_value()) {
7991
view_proto->set_visibility(view.visibility_.value());
8092
}
93+
94+
if (view.width_.has_value()) {
95+
view_proto->set_width(view.width_.value());
96+
}
97+
98+
if (view.height_.has_value()) {
99+
view_proto->set_height(view.height_.value());
100+
}
81101
}
82102

83103
return snapshot_proto.SerializeAsString();

src/trace_processor/importers/proto/winscope/viewcapture_visibility_computation.cc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,20 @@ VisibilityComputation::VisibilityComputation(
3030

3131
std::unordered_map<int32_t, bool> VisibilityComputation::Compute() {
3232
std::unordered_map<int32_t, bool> computed_visibility;
33+
std::unordered_map<int32_t, bool> visibility_flag_set;
3334
for (auto it = views_top_to_bottom_.begin(); it != views_top_to_bottom_.end();
3435
it++) {
3536
const auto& view = *it;
3637
auto node_id = view.id();
37-
auto is_visible = view.visibility() == IS_VISIBLE;
3838

39-
auto parent = computed_visibility.find(view.parent_id());
40-
if (is_visible && parent != computed_visibility.end()) {
41-
is_visible = parent->second;
39+
auto visibility_set = view.visibility() == IS_VISIBLE;
40+
auto parent = visibility_flag_set.find(view.parent_id());
41+
if (visibility_set && parent != visibility_flag_set.end()) {
42+
visibility_set = parent->second;
4243
}
44+
visibility_flag_set[node_id] = visibility_set;
4345

46+
auto is_visible = visibility_set && view.width() > 0 && view.height() > 0;
4447
computed_visibility[node_id] = is_visible;
4548
}
4649
return computed_visibility;

src/trace_processor/importers/proto/winscope/viewcapture_visibility_computation_unittest.cc

Lines changed: 65 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,50 +38,96 @@ std::unordered_map<int32_t, bool> ComputeVisibility(
3838
} // namespace
3939

4040
TEST(ViewCaptureVisibilityComputation, RootNodeVisible) {
41-
const auto snapshot = SnapshotProtoBuilder()
42-
.AddView(View().SetVisibility(0).SetParentId(-1))
43-
.Build();
41+
const auto snapshot =
42+
SnapshotProtoBuilder()
43+
.AddView(
44+
View().SetVisibility(0).SetHeight(1).SetWidth(1).SetParentId(-1))
45+
.Build();
4446

4547
auto result = ComputeVisibility(snapshot);
4648
ASSERT_TRUE(result.at(0));
4749
}
4850

4951
TEST(ViewCaptureVisibilityComputation, ChildNodeVisible) {
50-
const auto snapshot = SnapshotProtoBuilder()
51-
.AddView(View().SetVisibility(0).SetParentId(-1))
52-
.AddView(View().SetVisibility(0).SetParentId(0))
53-
.Build();
52+
const auto snapshot =
53+
SnapshotProtoBuilder()
54+
.AddView(
55+
View().SetVisibility(0).SetHeight(1).SetWidth(1).SetParentId(-1))
56+
.AddView(
57+
View().SetVisibility(0).SetHeight(1).SetWidth(1).SetParentId(0))
58+
.Build();
5459

5560
auto result = ComputeVisibility(snapshot);
5661
ASSERT_TRUE(result.at(0));
5762
ASSERT_TRUE(result.at(1));
5863
}
5964

60-
TEST(ViewCaptureVisibilityComputation, RootNodeNotVisible) {
61-
const auto snapshot = SnapshotProtoBuilder()
62-
.AddView(View().SetVisibility(4).SetParentId(-1))
63-
.Build();
65+
TEST(ViewCaptureVisibilityComputation, RootNodeNotVisibleDueToVisibility) {
66+
const auto snapshot =
67+
SnapshotProtoBuilder()
68+
.AddView(
69+
View().SetVisibility(4).SetHeight(1).SetWidth(1).SetParentId(-1))
70+
.Build();
71+
72+
auto result = ComputeVisibility(snapshot);
73+
ASSERT_FALSE(result.at(0));
74+
}
75+
76+
TEST(ViewCaptureVisibilityComputation, RootNodeVisibleDueToZeroWidth) {
77+
const auto snapshot =
78+
SnapshotProtoBuilder()
79+
.AddView(View().SetVisibility(0).SetWidth(1).SetParentId(-1))
80+
.Build();
81+
82+
auto result = ComputeVisibility(snapshot);
83+
ASSERT_FALSE(result.at(0));
84+
}
85+
86+
TEST(ViewCaptureVisibilityComputation, RootNodeVisibleDueToZeroHeight) {
87+
const auto snapshot =
88+
SnapshotProtoBuilder()
89+
.AddView(View().SetVisibility(0).SetHeight(1).SetParentId(-1))
90+
.Build();
6491

6592
auto result = ComputeVisibility(snapshot);
6693
ASSERT_FALSE(result.at(0));
6794
}
6895

6996
TEST(ViewCaptureVisibilityComputation, ChildNodeNotVisibleDueToParent) {
70-
const auto snapshot = SnapshotProtoBuilder()
71-
.AddView(View().SetVisibility(4).SetParentId(-1))
72-
.AddView(View().SetVisibility(0).SetParentId(0))
73-
.Build();
97+
const auto snapshot =
98+
SnapshotProtoBuilder()
99+
.AddView(
100+
View().SetVisibility(4).SetHeight(1).SetWidth(1).SetParentId(-1))
101+
.AddView(
102+
View().SetVisibility(0).SetHeight(1).SetWidth(1).SetParentId(0))
103+
.Build();
74104

75105
auto result = ComputeVisibility(snapshot);
76106
ASSERT_FALSE(result.at(0));
77107
ASSERT_FALSE(result.at(1));
78108
}
79109

110+
TEST(ViewCaptureVisibilityComputation, ChildNodeVisibleWithZeroSizeParent) {
111+
const auto snapshot =
112+
SnapshotProtoBuilder()
113+
.AddView(View().SetVisibility(0).SetParentId(-1))
114+
.AddView(
115+
View().SetVisibility(0).SetHeight(1).SetWidth(1).SetParentId(0))
116+
.Build();
117+
118+
auto result = ComputeVisibility(snapshot);
119+
ASSERT_FALSE(result.at(0));
120+
ASSERT_TRUE(result.at(1));
121+
}
122+
80123
TEST(ViewCaptureVisibilityComputation, ChildNodeNotVisibleButParentVisible) {
81-
const auto snapshot = SnapshotProtoBuilder()
82-
.AddView(View().SetVisibility(0).SetParentId(-1))
83-
.AddView(View().SetVisibility(4).SetParentId(0))
84-
.Build();
124+
const auto snapshot =
125+
SnapshotProtoBuilder()
126+
.AddView(
127+
View().SetVisibility(0).SetHeight(1).SetWidth(1).SetParentId(-1))
128+
.AddView(
129+
View().SetVisibility(4).SetHeight(1).SetWidth(1).SetParentId(0))
130+
.Build();
85131

86132
auto result = ComputeVisibility(snapshot);
87133
ASSERT_TRUE(result.at(0));

0 commit comments

Comments
 (0)