1111#include " flutter/flow/testing/layer_test.h"
1212#include " flutter/flow/testing/mock_layer.h"
1313#include " flutter/fml/macros.h"
14- #include " flutter/testing/mock_canvas.h"
15- #include " third_party/skia/include/core/SkImageFilter.h"
16- #include " third_party/skia/include/effects/SkImageFilters.h"
1714
1815namespace flutter {
1916namespace testing {
@@ -72,15 +69,30 @@ TEST_F(BackdropFilterLayerTest, EmptyFilter) {
7269 EXPECT_TRUE (layer->needs_painting (paint_context ()));
7370 EXPECT_EQ (mock_layer->parent_matrix (), initial_transform);
7471
75- layer->Paint (paint_context ());
76- EXPECT_EQ (
77- mock_canvas ().draw_calls (),
78- std::vector ({MockCanvas::DrawCall{
79- 0 , MockCanvas::SaveLayerData{child_bounds, DlPaint (),
80- nullptr , 1 }},
81- MockCanvas::DrawCall{
82- 1 , MockCanvas::DrawPathData{child_path, child_paint}},
83- MockCanvas::DrawCall{1 , MockCanvas::RestoreData{0 }}}));
72+ parent->Paint (display_list_paint_context ());
73+ DisplayListBuilder expected_builder;
74+ /* (ClipRect)parent::Paint */ {
75+ expected_builder.Save ();
76+ {
77+ expected_builder.ClipRect (child_bounds, DlCanvas::ClipOp::kIntersect ,
78+ false );
79+ /* (BackdropFilter)layer::Paint */ {
80+ expected_builder.Save ();
81+ {
82+ expected_builder.SaveLayer (&child_bounds, nullptr , nullptr );
83+ {
84+ /* mock_layer::Paint */ {
85+ expected_builder.DrawPath (child_path, child_paint);
86+ }
87+ }
88+ expected_builder.Restore ();
89+ }
90+ expected_builder.Restore ();
91+ }
92+ }
93+ expected_builder.Restore ();
94+ }
95+ EXPECT_TRUE (DisplayListsEQ_Verbose (display_list (), expected_builder.Build ()));
8496}
8597
8698TEST_F (BackdropFilterLayerTest, SimpleFilter) {
@@ -104,15 +116,31 @@ TEST_F(BackdropFilterLayerTest, SimpleFilter) {
104116 EXPECT_TRUE (layer->needs_painting (paint_context ()));
105117 EXPECT_EQ (mock_layer->parent_matrix (), initial_transform);
106118
107- layer->Paint (paint_context ());
108- EXPECT_EQ (
109- mock_canvas ().draw_calls (),
110- std::vector ({MockCanvas::DrawCall{
111- 0 , MockCanvas::SaveLayerData{child_bounds, DlPaint (),
112- layer_filter, 1 }},
113- MockCanvas::DrawCall{
114- 1 , MockCanvas::DrawPathData{child_path, child_paint}},
115- MockCanvas::DrawCall{1 , MockCanvas::RestoreData{0 }}}));
119+ parent->Paint (display_list_paint_context ());
120+ DisplayListBuilder expected_builder;
121+ /* (ClipRect)parent::Paint */ {
122+ expected_builder.Save ();
123+ {
124+ expected_builder.ClipRect (child_bounds, DlCanvas::ClipOp::kIntersect ,
125+ false );
126+ /* (BackdropFilter)layer::Paint */ {
127+ expected_builder.Save ();
128+ {
129+ expected_builder.SaveLayer (&child_bounds, nullptr ,
130+ layer_filter.get ());
131+ {
132+ /* mock_layer::Paint */ {
133+ expected_builder.DrawPath (child_path, child_paint);
134+ }
135+ }
136+ expected_builder.Restore ();
137+ }
138+ expected_builder.Restore ();
139+ }
140+ }
141+ expected_builder.Restore ();
142+ }
143+ EXPECT_TRUE (DisplayListsEQ_Verbose (display_list (), expected_builder.Build ()));
116144}
117145
118146TEST_F (BackdropFilterLayerTest, NonSrcOverBlend) {
@@ -139,15 +167,32 @@ TEST_F(BackdropFilterLayerTest, NonSrcOverBlend) {
139167 DlPaint filter_paint = DlPaint ();
140168 filter_paint.setBlendMode (DlBlendMode::kSrc );
141169
142- layer->Paint (paint_context ());
143- EXPECT_EQ (
144- mock_canvas ().draw_calls (),
145- std::vector ({MockCanvas::DrawCall{
146- 0 , MockCanvas::SaveLayerData{child_bounds, filter_paint,
147- layer_filter, 1 }},
148- MockCanvas::DrawCall{
149- 1 , MockCanvas::DrawPathData{child_path, child_paint}},
150- MockCanvas::DrawCall{1 , MockCanvas::RestoreData{0 }}}));
170+ parent->Paint (display_list_paint_context ());
171+ DisplayListBuilder expected_builder;
172+ /* (ClipRect)parent::Paint */ {
173+ expected_builder.Save ();
174+ {
175+ expected_builder.ClipRect (child_bounds, DlCanvas::ClipOp::kIntersect ,
176+ false );
177+ /* (BackdropFilter)layer::Paint */ {
178+ expected_builder.Save ();
179+ {
180+ DlPaint save_paint = DlPaint ().setBlendMode (DlBlendMode::kSrc );
181+ expected_builder.SaveLayer (&child_bounds, &save_paint,
182+ layer_filter.get ());
183+ {
184+ /* mock_layer::Paint */ {
185+ expected_builder.DrawPath (child_path, child_paint);
186+ }
187+ }
188+ expected_builder.Restore ();
189+ }
190+ expected_builder.Restore ();
191+ }
192+ }
193+ expected_builder.Restore ();
194+ }
195+ EXPECT_TRUE (DisplayListsEQ_Verbose (display_list (), expected_builder.Build ()));
151196}
152197
153198TEST_F (BackdropFilterLayerTest, MultipleChildren) {
@@ -184,17 +229,34 @@ TEST_F(BackdropFilterLayerTest, MultipleChildren) {
184229 EXPECT_EQ (mock_layer1->parent_matrix (), initial_transform);
185230 EXPECT_EQ (mock_layer2->parent_matrix (), initial_transform);
186231
187- layer->Paint (paint_context ());
188- EXPECT_EQ (
189- mock_canvas ().draw_calls (),
190- std::vector ({MockCanvas::DrawCall{
191- 0 , MockCanvas::SaveLayerData{children_bounds, DlPaint (),
192- layer_filter, 1 }},
193- MockCanvas::DrawCall{
194- 1 , MockCanvas::DrawPathData{child_path1, child_paint1}},
195- MockCanvas::DrawCall{
196- 1 , MockCanvas::DrawPathData{child_path2, child_paint2}},
197- MockCanvas::DrawCall{1 , MockCanvas::RestoreData{0 }}}));
232+ parent->Paint (display_list_paint_context ());
233+ DisplayListBuilder expected_builder;
234+ /* (ClipRect)parent::Paint */ {
235+ expected_builder.Save ();
236+ {
237+ expected_builder.ClipRect (children_bounds, DlCanvas::ClipOp::kIntersect ,
238+ false );
239+ /* (BackdropFilter)layer::Paint */ {
240+ expected_builder.Save ();
241+ {
242+ expected_builder.SaveLayer (&children_bounds, nullptr ,
243+ layer_filter.get ());
244+ {
245+ /* mock_layer1::Paint */ {
246+ expected_builder.DrawPath (child_path1, child_paint1);
247+ }
248+ /* mock_layer2::Paint */ {
249+ expected_builder.DrawPath (child_path2, child_paint2);
250+ }
251+ }
252+ expected_builder.Restore ();
253+ }
254+ expected_builder.Restore ();
255+ }
256+ }
257+ expected_builder.Restore ();
258+ }
259+ EXPECT_TRUE (DisplayListsEQ_Verbose (display_list (), expected_builder.Build ()));
198260}
199261
200262TEST_F (BackdropFilterLayerTest, Nested) {
@@ -238,21 +300,45 @@ TEST_F(BackdropFilterLayerTest, Nested) {
238300 EXPECT_EQ (mock_layer1->parent_matrix (), initial_transform);
239301 EXPECT_EQ (mock_layer2->parent_matrix (), initial_transform);
240302
241- layer1->Paint (paint_context ());
242- EXPECT_EQ (
243- mock_canvas ().draw_calls (),
244- std::vector ({MockCanvas::DrawCall{
245- 0 , MockCanvas::SaveLayerData{children_bounds, DlPaint (),
246- layer_filter1, 1 }},
247- MockCanvas::DrawCall{
248- 1 , MockCanvas::DrawPathData{child_path1, child_paint1}},
249- MockCanvas::DrawCall{
250- 1 , MockCanvas::SaveLayerData{children_bounds, DlPaint (),
251- layer_filter2, 2 }},
252- MockCanvas::DrawCall{
253- 2 , MockCanvas::DrawPathData{child_path2, child_paint2}},
254- MockCanvas::DrawCall{2 , MockCanvas::RestoreData{1 }},
255- MockCanvas::DrawCall{1 , MockCanvas::RestoreData{0 }}}));
303+ parent->Paint (display_list_paint_context ());
304+ DisplayListBuilder expected_builder;
305+ /* (ClipRect)parent::Paint */ {
306+ expected_builder.Save ();
307+ {
308+ expected_builder.ClipRect (children_bounds, DlCanvas::ClipOp::kIntersect ,
309+ false );
310+ /* (BackdropFilter)layer1::Paint */ {
311+ expected_builder.Save ();
312+ {
313+ expected_builder.SaveLayer (&children_bounds, nullptr ,
314+ layer_filter1.get ());
315+ {
316+ /* mock_layer1::Paint */ {
317+ expected_builder.DrawPath (child_path1, child_paint1);
318+ }
319+ /* (BackdropFilter)layer2::Paint */ {
320+ expected_builder.Save ();
321+ {
322+ expected_builder.SaveLayer (&children_bounds, nullptr ,
323+ layer_filter2.get ());
324+ {
325+ /* mock_layer2::Paint */ {
326+ expected_builder.DrawPath (child_path2, child_paint2);
327+ }
328+ }
329+ expected_builder.Restore ();
330+ }
331+ expected_builder.Restore ();
332+ }
333+ }
334+ expected_builder.Restore ();
335+ }
336+ expected_builder.Restore ();
337+ }
338+ }
339+ expected_builder.Restore ();
340+ }
341+ EXPECT_TRUE (DisplayListsEQ_Verbose (display_list (), expected_builder.Build ()));
256342}
257343
258344TEST_F (BackdropFilterLayerTest, Readback) {
0 commit comments