24 std::make_shared<BackdropFilterLayer>(filter, DlBlendMode::kSrcOver);
28 parent->Preroll(preroll_context());
29 EXPECT_EQ(layer->paint_bounds(),
DlRect());
30 EXPECT_EQ(layer->child_paint_bounds(),
DlRect());
31 EXPECT_FALSE(layer->needs_painting(paint_context()));
33 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
34 "needs_painting\\(context\\)");
40 auto mock_layer = std::make_shared<MockLayer>(child_path);
43 std::make_shared<BackdropFilterLayer>(filter, DlBlendMode::kSrcOver);
44 layer->Add(mock_layer);
46 EXPECT_EQ(layer->paint_bounds(),
DlRect());
47 EXPECT_EQ(layer->child_paint_bounds(),
DlRect());
48 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
49 "needs_painting\\(context\\)");
58 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
60 std::make_shared<BackdropFilterLayer>(
nullptr, DlBlendMode::kSrcOver);
61 layer->Add(mock_layer);
62 auto parent = std::make_shared<ClipRectLayer>(child_bounds,
Clip::kHardEdge);
65 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
66 parent->Preroll(preroll_context());
67 EXPECT_EQ(layer->paint_bounds(), child_bounds);
68 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
69 EXPECT_TRUE(layer->needs_painting(paint_context()));
70 EXPECT_EQ(mock_layer->parent_matrix(), initial_transform);
72 parent->Paint(display_list_paint_context());
75 expected_builder.
Save();
79 expected_builder.
Save();
81 expected_builder.
SaveLayer(child_bounds,
nullptr,
nullptr);
84 expected_builder.
DrawPath(child_path, child_paint);
103 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
104 auto layer = std::make_shared<BackdropFilterLayer>(layer_filter,
105 DlBlendMode::kSrcOver);
106 layer->Add(mock_layer);
107 auto parent = std::make_shared<ClipRectLayer>(child_bounds,
Clip::kHardEdge);
110 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
111 parent->Preroll(preroll_context());
112 EXPECT_EQ(layer->paint_bounds(), child_bounds);
113 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
114 EXPECT_TRUE(layer->needs_painting(paint_context()));
115 EXPECT_EQ(mock_layer->parent_matrix(), initial_transform);
117 parent->Paint(display_list_paint_context());
120 expected_builder.
Save();
124 expected_builder.
Save();
126 expected_builder.
SaveLayer(child_bounds,
nullptr, layer_filter.get());
129 expected_builder.
DrawPath(child_path, child_paint);
148 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
150 std::make_shared<BackdropFilterLayer>(layer_filter, DlBlendMode::kSrc);
151 layer->Add(mock_layer);
152 auto parent = std::make_shared<ClipRectLayer>(child_bounds,
Clip::kHardEdge);
155 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
156 parent->Preroll(preroll_context());
157 EXPECT_EQ(layer->paint_bounds(), child_bounds);
158 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
159 EXPECT_TRUE(layer->needs_painting(paint_context()));
160 EXPECT_EQ(mock_layer->parent_matrix(), initial_transform);
165 parent->Paint(display_list_paint_context());
168 expected_builder.
Save();
172 expected_builder.
Save();
175 expected_builder.
SaveLayer(child_bounds, &save_paint,
179 expected_builder.
DrawPath(child_path, child_paint);
199 const DlRect children_bounds =
202 auto mock_layer1 = std::make_shared<MockLayer>(child_path1, child_paint1);
203 auto mock_layer2 = std::make_shared<MockLayer>(child_path2, child_paint2);
204 auto layer = std::make_shared<BackdropFilterLayer>(layer_filter,
205 DlBlendMode::kSrcOver);
206 layer->Add(mock_layer1);
207 layer->Add(mock_layer2);
212 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
213 parent->Preroll(preroll_context());
214 EXPECT_EQ(mock_layer1->paint_bounds(), child_path1.
GetBounds());
215 EXPECT_EQ(mock_layer2->paint_bounds(), child_path2.
GetBounds());
216 EXPECT_EQ(layer->paint_bounds(), children_bounds);
217 EXPECT_EQ(layer->child_paint_bounds(), children_bounds);
218 EXPECT_TRUE(mock_layer1->needs_painting(paint_context()));
219 EXPECT_TRUE(mock_layer2->needs_painting(paint_context()));
220 EXPECT_TRUE(layer->needs_painting(paint_context()));
221 EXPECT_EQ(mock_layer1->parent_matrix(), initial_transform);
222 EXPECT_EQ(mock_layer2->parent_matrix(), initial_transform);
224 parent->Paint(display_list_paint_context());
227 expected_builder.
Save();
231 expected_builder.
Save();
233 expected_builder.
SaveLayer(children_bounds,
nullptr,
237 expected_builder.
DrawPath(child_path1, child_paint1);
240 expected_builder.
DrawPath(child_path2, child_paint2);
260 const DlRect children_bounds =
264 auto mock_layer1 = std::make_shared<MockLayer>(child_path1, child_paint1);
265 auto mock_layer2 = std::make_shared<MockLayer>(child_path2, child_paint2);
266 auto layer1 = std::make_shared<BackdropFilterLayer>(layer_filter1,
267 DlBlendMode::kSrcOver);
268 auto layer2 = std::make_shared<BackdropFilterLayer>(layer_filter2,
269 DlBlendMode::kSrcOver);
270 layer2->Add(mock_layer2);
271 layer1->Add(mock_layer1);
277 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
278 parent->Preroll(preroll_context());
280 EXPECT_EQ(mock_layer1->paint_bounds(), child_path1.
GetBounds());
281 EXPECT_EQ(mock_layer2->paint_bounds(), child_path2.
GetBounds());
282 EXPECT_EQ(layer1->paint_bounds(), children_bounds);
283 EXPECT_EQ(layer2->paint_bounds(), children_bounds);
284 EXPECT_TRUE(mock_layer1->needs_painting(paint_context()));
285 EXPECT_TRUE(mock_layer2->needs_painting(paint_context()));
286 EXPECT_TRUE(layer1->needs_painting(paint_context()));
287 EXPECT_TRUE(layer2->needs_painting(paint_context()));
288 EXPECT_EQ(mock_layer1->parent_matrix(), initial_transform);
289 EXPECT_EQ(mock_layer2->parent_matrix(), initial_transform);
291 parent->Paint(display_list_paint_context());
294 expected_builder.
Save();
298 expected_builder.
Save();
300 expected_builder.
SaveLayer(children_bounds,
nullptr,
301 layer_filter1.get());
304 expected_builder.
DrawPath(child_path1, child_paint1);
307 expected_builder.
Save();
309 expected_builder.
SaveLayer(children_bounds,
nullptr,
310 layer_filter2.get());
313 expected_builder.
DrawPath(child_path2, child_paint2);
332 std::shared_ptr<DlImageFilter> no_filter;
334 auto initial_transform =
DlMatrix();
337 auto layer1 = std::make_shared<BackdropFilterLayer>(layer_filter,
338 DlBlendMode::kSrcOver);
339 preroll_context()->surface_needs_readback =
false;
340 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
341 layer1->Preroll(preroll_context());
342 EXPECT_TRUE(preroll_context()->surface_needs_readback);
346 std::make_shared<BackdropFilterLayer>(no_filter, DlBlendMode::kSrcOver);
347 preroll_context()->surface_needs_readback =
false;
348 layer2->Preroll(preroll_context());
349 EXPECT_FALSE(preroll_context()->surface_needs_readback);
352 preroll_context()->surface_needs_readback =
true;
353 layer2->Preroll(preroll_context());
354 EXPECT_TRUE(preroll_context()->surface_needs_readback);
357 auto mock_layer = std::make_shared<MockLayer>(
DlPath(),
DlPaint());
358 mock_layer->set_fake_reads_surface(
true);
359 layer2->Add(mock_layer);
360 preroll_context()->surface_needs_readback =
false;
361 layer2->Preroll(preroll_context());
362 EXPECT_FALSE(preroll_context()->surface_needs_readback);
371 auto clip = std::make_shared<ClipRectLayer>(clip_rect,
Clip::kHardEdge);
372 auto parent = std::make_shared<OpacityLayer>(128,
DlPoint());
373 auto layer = std::make_shared<BackdropFilterLayer>(backdrop_filter,
374 DlBlendMode::kSrcOver);
375 auto child = std::make_shared<MockLayer>(mock_path, mock_paint);
380 clip->Preroll(preroll_context());
382 clip->Paint(display_list_paint_context());
386 expected_builder.
Save();
394 expected_builder.
SaveLayer(clip_rect, &save_paint,
395 backdrop_filter.get());
400 expected_builder.
DrawPath(mock_path, child_paint);
428 std::make_shared<BackdropFilterLayer>(filter, DlBlendMode::kSrcOver));
436 auto clip = std::make_shared<ClipRectLayer>(
DlRect::MakeLTRB(20, 20, 60, 60),
439 std::make_shared<BackdropFilterLayer>(filter, DlBlendMode::kSrcOver));
459 l4.
root()->
Add(std::make_shared<MockLayer>(path1));
460 damage = DiffLayerTree(l4, l3);
468 l5.
root()->
Add(std::make_shared<MockLayer>(path2));
469 damage = DiffLayerTree(l5, l4);
479 auto clip = std::make_shared<ClipRectLayer>(
DlRect::MakeLTRB(60, 60, 80, 80),
482 std::make_shared<BackdropFilterLayer>(filter, DlBlendMode::kSrcOver));
493 l2.
root()->
Add(std::make_shared<MockLayer>(path2));
494 damage = DiffLayerTree(l2, l1);
520 auto transform_layer = std::make_shared<TransformLayer>(
transform);
521 l1.
root()->
Add(transform_layer);
522 transform_layer->Add(
523 std::make_shared<BackdropFilterLayer>(filter, DlBlendMode::kSrcOver));
virtual void Add(std::shared_ptr< Layer > layer)
void ClipRect(const DlRect &rect, DlClipOp clip_op=DlClipOp::kIntersect, bool is_aa=false) override
void SaveLayer(const std::optional< DlRect > &bounds, const DlPaint *paint=nullptr, const DlImageFilter *backdrop=nullptr, std::optional< int64_t > backdrop_id=std::nullopt) override
sk_sp< DisplayList > Build()
void DrawPath(const DlPath &path, const DlPaint &paint) override
static std::shared_ptr< DlImageFilter > MakeBlur(DlScalar sigma_x, DlScalar sigma_y, DlTileMode tile_mode)
static std::shared_ptr< DlImageFilter > MakeMatrix(const DlMatrix &matrix, DlImageSampling sampling)
DlPaint & setColor(DlColor color)
DlPaint & setAlpha(uint8_t alpha)
DlPaint & setBlendMode(DlBlendMode mode)
static DlPath MakeRectLTRB(DlScalar left, DlScalar top, DlScalar right, DlScalar bottom)
static DlPath MakeRectXYWH(DlScalar x, DlScalar y, DlScalar width, DlScalar height)
static DlPath MakeRect(const DlRect &rect)
DlRect GetBounds() const override
TEST_F(DisplayListTest, Defaults)
LayerTestBase<::testing::Test > LayerTest
bool DisplayListsEQ_Verbose(const DisplayList *a, const DisplayList *b)
impeller::Matrix DlMatrix
impeller::ISize32 DlISize
static constexpr DlColor kYellow()
static constexpr DlColor kRed()
static constexpr DlColor kCyan()
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
static constexpr Matrix MakeScale(const Vector3 &s)
static constexpr TRect MakeWH(Type width, Type height)
constexpr TRect Union(const TRect &o) const
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)