Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
view_slicer_unittests.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <unordered_map>
9#include "gtest/gtest.h"
10
11namespace flutter {
12namespace testing {
13
14namespace {
15bool ContainsClipDifferenceRect(const sk_sp<DisplayList>& display_list) {
16 for (DlIndex i = 0; i < display_list->op_count(); i++) {
17 if (display_list->GetOpType(i) == DisplayListOpType::kClipDifferenceRect) {
18 return true;
19 }
20 }
21 return false;
22}
23
24void AddSliceOfSize(
25 std::unordered_map<int64_t, std::unique_ptr<EmbedderViewSlice>>& slices,
26 int64_t id,
27 DlRect rect) {
28 slices[id] = std::make_unique<DisplayListEmbedderViewSlice>(rect);
29 DlPaint paint;
31 slices[id]->canvas()->DrawRect(rect, paint);
32}
33} // namespace
34
35TEST(ViewSlicerTest, CanSlicerNonOverlappingViews) {
36 DisplayListBuilder builder(DlRect::MakeLTRB(0, 0, 100, 100));
37
38 std::vector<int64_t> composition_order = {1};
39 std::unordered_map<int64_t, std::unique_ptr<EmbedderViewSlice>> slices;
40 AddSliceOfSize(slices, 1, DlRect::MakeLTRB(99, 99, 100, 100));
41
42 std::unordered_map<int64_t, DlRect> view_rects = {
43 {1, DlRect::MakeLTRB(50, 50, 60, 60)}};
44
45 auto computed_overlays =
46 SliceViews(&builder, composition_order, slices, view_rects, {});
47
48 EXPECT_TRUE(computed_overlays.empty());
49}
50
51TEST(ViewSlicerTest, IgnoresFractionalOverlaps) {
52 DisplayListBuilder builder(DlRect::MakeLTRB(0, 0, 100, 100));
53
54 std::vector<int64_t> composition_order = {1};
55 std::unordered_map<int64_t, std::unique_ptr<EmbedderViewSlice>> slices;
56 AddSliceOfSize(slices, 1, DlRect::MakeLTRB(0, 0, 50.49, 50.49));
57
58 std::unordered_map<int64_t, DlRect> view_rects = {
59 {1, DlRect::MakeLTRB(50.5, 50.5, 100, 100)}};
60
61 auto computed_overlays =
62 SliceViews(&builder, composition_order, slices, view_rects, {});
63
64 EXPECT_TRUE(computed_overlays.empty());
65}
66
67TEST(ViewSlicerTest, ComputesOverlapWith1PV) {
68 DisplayListBuilder builder(DlRect::MakeLTRB(0, 0, 100, 100));
69
70 std::vector<int64_t> composition_order = {1};
71 std::unordered_map<int64_t, std::unique_ptr<EmbedderViewSlice>> slices;
72 AddSliceOfSize(slices, 1, DlRect::MakeLTRB(0, 0, 50, 50));
73
74 std::unordered_map<int64_t, DlRect> view_rects = {
75 {1, DlRect::MakeLTRB(0, 0, 100, 100)}};
76
77 auto computed_overlays =
78 SliceViews(&builder, composition_order, slices, view_rects, {});
79
80 EXPECT_EQ(computed_overlays.size(), 1u);
81 auto overlay = computed_overlays.find(1);
82 ASSERT_NE(overlay, computed_overlays.end());
83
84 EXPECT_EQ(overlay->second, DlRect::MakeLTRB(0, 0, 50, 50));
85}
86
87TEST(ViewSlicerTest, ComputesOverlapWith2PV) {
88 DisplayListBuilder builder(DlRect::MakeLTRB(0, 0, 100, 100));
89
90 std::vector<int64_t> composition_order = {1, 2};
91 std::unordered_map<int64_t, std::unique_ptr<EmbedderViewSlice>> slices;
92 AddSliceOfSize(slices, 1, DlRect::MakeLTRB(0, 0, 50, 50));
93 AddSliceOfSize(slices, 2, DlRect::MakeLTRB(50, 50, 100, 100));
94
95 std::unordered_map<int64_t, DlRect> view_rects = {
96 {1, DlRect::MakeLTRB(0, 0, 50, 50)}, //
97 {2, DlRect::MakeLTRB(50, 50, 100, 100)}, //
98 };
99
100 auto computed_overlays =
101 SliceViews(&builder, composition_order, slices, view_rects, {});
102
103 EXPECT_EQ(computed_overlays.size(), 2u);
104
105 auto overlay = computed_overlays.find(1);
106 ASSERT_NE(overlay, computed_overlays.end());
107
108 EXPECT_EQ(overlay->second, DlRect::MakeLTRB(0, 0, 50, 50));
109
110 overlay = computed_overlays.find(2);
111 ASSERT_NE(overlay, computed_overlays.end());
112 EXPECT_EQ(overlay->second, DlRect::MakeLTRB(50, 50, 100, 100));
113}
114
115TEST(ViewSlicerTest, OverlappingTwoPVs) {
116 DisplayListBuilder builder(DlRect::MakeLTRB(0, 0, 100, 100));
117
118 std::vector<int64_t> composition_order = {1, 2};
119 std::unordered_map<int64_t, std::unique_ptr<EmbedderViewSlice>> slices;
120 // This embeded view overlaps both platform views:
121 //
122 // [ A [ ]]
123 // [_____[ C ]]
124 // [ B [ ]]
125 // [ ]
126 AddSliceOfSize(slices, 1, DlRect::MakeLTRB(0, 0, 0, 0));
127 AddSliceOfSize(slices, 2, DlRect::MakeLTRB(0, 0, 100, 100));
128
129 std::unordered_map<int64_t, DlRect> view_rects = {
130 {1, DlRect::MakeLTRB(0, 0, 50, 50)}, //
131 {2, DlRect::MakeLTRB(50, 50, 100, 100)}, //
132 };
133
134 auto computed_overlays =
135 SliceViews(&builder, composition_order, slices, view_rects, {});
136
137 EXPECT_EQ(computed_overlays.size(), 1u);
138
139 auto overlay = computed_overlays.find(2);
140 ASSERT_NE(overlay, computed_overlays.end());
141
142 // We create a single overlay for both overlapping sections.
143 EXPECT_EQ(overlay->second, DlRect::MakeLTRB(0, 0, 100, 100));
144}
145
146TEST(ViewSlicerTest, PreservesUnderlayForSelectedViews) {
147 std::vector<int64_t> composition_order = {1};
148 std::unordered_map<int64_t, DlRect> view_rects = {
149 {1, DlRect::MakeLTRB(0, 0, 100, 100)}};
150
151 std::unordered_map<int64_t, std::unique_ptr<EmbedderViewSlice>>
152 baseline_slices;
153 AddSliceOfSize(baseline_slices, 1, DlRect::MakeLTRB(0, 0, 50, 50));
154 DisplayListBuilder baseline_builder(DlRect::MakeLTRB(0, 0, 100, 100));
155 auto baseline_overlays = SliceViews(&baseline_builder, composition_order,
156 baseline_slices, view_rects, {});
157 EXPECT_EQ(baseline_overlays.size(), 1u);
158 auto baseline_dl = baseline_builder.Build();
159 EXPECT_TRUE(ContainsClipDifferenceRect(baseline_dl));
160
161 std::unordered_map<int64_t, std::unique_ptr<EmbedderViewSlice>>
162 preserve_slices;
163 AddSliceOfSize(preserve_slices, 1, DlRect::MakeLTRB(0, 0, 50, 50));
164 std::unordered_set<int64_t> views_with_underlay_preserved = {1};
165 DisplayListBuilder preserve_builder(DlRect::MakeLTRB(0, 0, 100, 100));
166 auto preserve_overlays =
167 SliceViews(&preserve_builder, composition_order, preserve_slices,
168 view_rects, views_with_underlay_preserved);
169 EXPECT_EQ(preserve_overlays.size(), 1u);
170 auto preserve_dl = preserve_builder.Build();
171 EXPECT_FALSE(ContainsClipDifferenceRect(preserve_dl));
172}
173
174} // namespace testing
175} // namespace flutter
sk_sp< DisplayList > Build()
DlPaint & setColor(DlColor color)
Definition dl_paint.h:70
TEST(NativeAssetsManagerTest, NoAvailableAssets)
uint32_t DlIndex
impeller::Rect DlRect
std::unordered_map< int64_t, DlRect > SliceViews(DlCanvas *background_canvas, const std::vector< int64_t > &composition_order, const std::unordered_map< int64_t, std::unique_ptr< EmbedderViewSlice > > &slices, const std::unordered_map< int64_t, DlRect > &view_rects, const std::unordered_set< int64_t > &views_with_underlay_preserved)
Compute the required overlay layers and clip the view slices according to the size and position of th...
flutter::DlPaint DlPaint
static constexpr DlColor kBlack()
Definition dl_color.h:69
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
Definition rect.h:129
const uintptr_t id