20#include "gtest/gtest.h"
32 auto mock_layer = std::make_shared<MockLayer>(
DlPath());
35 layer->Add(mock_layer);
37 layer->Preroll(preroll_context());
38 EXPECT_EQ(mock_layer->paint_bounds(),
DlPath().GetBounds());
39 EXPECT_EQ(layer->paint_bounds(), mock_layer->paint_bounds());
40 EXPECT_EQ(layer->child_paint_bounds(), mock_layer->paint_bounds());
41 EXPECT_FALSE(mock_layer->needs_painting(paint_context()));
42 EXPECT_FALSE(layer->needs_painting(paint_context()));
44 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
45 "needs_painting\\(context\\)");
50 auto mock_layer = std::make_shared<MockLayer>(child_path);
53 layer->Add(mock_layer);
55 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
56 "needs_painting\\(context\\)");
65 auto mock_layer1 = std::make_shared<MockLayer>(child_path1, child_paint1);
66 layer->Add(mock_layer1);
69 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
70 layer->Preroll(preroll_context());
73 mock_layer1->parent_matrix());
83 auto mock_layer = std::make_shared<MockLayer>(child_path);
84 auto layer = std::make_shared<OpacityLayer>(alpha_half,
DlPoint());
85 layer->Add(mock_layer);
88 DlMatrix cache_ctm = initial_transform;
89 DisplayListBuilder cache_canvas;
91 DisplayListBuilder other_canvas;
92 other_canvas.Transform(other_transform);
94 use_mock_raster_cache();
96 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
98 const auto* cacheable_opacity_item = layer->raster_cache_item();
100 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
101 EXPECT_EQ(cacheable_opacity_item->cache_state(),
103 EXPECT_FALSE(cacheable_opacity_item->GetId().has_value());
105 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
106 layer->Preroll(preroll_context());
109 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)1);
111 EXPECT_EQ(cacheable_opacity_item->cache_state(),
114 cacheable_opacity_item->GetId().value(),
117 EXPECT_FALSE(raster_cache()->Draw(cacheable_opacity_item->GetId().value(),
118 other_canvas, &paint));
119 EXPECT_TRUE(raster_cache()->Draw(cacheable_opacity_item->GetId().value(),
120 cache_canvas, &paint));
130 auto mock_layer1 = std::make_shared<MockLayer>(child_path1);
131 auto mock_layer2 = std::make_shared<MockLayer>(child_path2);
132 auto layer = std::make_shared<OpacityLayer>(alpha_half,
DlPoint());
133 layer->Add(mock_layer1);
134 layer->Add(mock_layer2);
136 DlMatrix cache_ctm = initial_transform;
137 DisplayListBuilder cache_canvas;
139 DisplayListBuilder other_canvas;
140 other_canvas.Transform(other_transform);
142 use_mock_raster_cache();
144 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
146 const auto* cacheable_opacity_item = layer->raster_cache_item();
148 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
149 EXPECT_EQ(cacheable_opacity_item->cache_state(),
151 EXPECT_FALSE(cacheable_opacity_item->GetId().has_value());
153 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
154 layer->Preroll(preroll_context());
157 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)1);
159 EXPECT_EQ(cacheable_opacity_item->cache_state(),
162 cacheable_opacity_item->GetId().value(),
165 EXPECT_FALSE(raster_cache()->Draw(cacheable_opacity_item->GetId().value(),
166 other_canvas, &paint));
167 EXPECT_TRUE(raster_cache()->Draw(cacheable_opacity_item->GetId().value(),
168 cache_canvas, &paint));
173 auto opacity_layer = std::make_shared<OpacityLayer>(128,
DlPoint(20, 20));
175 opacity_layer->Add(mock_layer);
179 use_mock_raster_cache();
181 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
183 const auto* cacheable_opacity_item = opacity_layer->raster_cache_item();
185 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
186 EXPECT_EQ(cacheable_opacity_item->cache_state(),
188 EXPECT_FALSE(cacheable_opacity_item->GetId().has_value());
190 opacity_layer->Preroll(preroll_context());
194 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
196 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
197 EXPECT_EQ(cacheable_opacity_item->cache_state(),
199 EXPECT_FALSE(cacheable_opacity_item->Draw(paint_context(), &paint));
208 const DlRect expected_layer_bounds =
210 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
213 layer->Add(mock_layer);
215 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
216 layer->Preroll(preroll_context());
217 EXPECT_EQ(mock_layer->paint_bounds(), child_path.
GetBounds());
218 EXPECT_EQ(layer->paint_bounds(), expected_layer_bounds);
219 EXPECT_EQ(layer->child_paint_bounds(), child_path.
GetBounds());
220 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
221 EXPECT_TRUE(layer->needs_painting(paint_context()));
222 EXPECT_EQ(mock_layer->parent_matrix(), initial_transform * layer_transform);
223 EXPECT_EQ(mock_layer->parent_mutators(),
224 std::vector({Mutator(layer_transform)}));
228 expected_builder.
Save();
230 expected_builder.
Translate(layer_offset.
x, layer_offset.
y);
233 expected_builder.
DrawPath(child_path, child_paint);
238 layer->Paint(display_list_paint_context());
249 const DlRect expected_layer_bounds =
251 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
252 auto layer = std::make_shared<OpacityLayer>(0u, layer_offset);
253 layer->Add(mock_layer);
255 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
256 layer->Preroll(preroll_context());
257 EXPECT_EQ(mock_layer->paint_bounds(), child_path.
GetBounds());
258 EXPECT_EQ(layer->paint_bounds(), expected_layer_bounds);
259 EXPECT_EQ(layer->child_paint_bounds(), child_path.
GetBounds());
260 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
261 EXPECT_TRUE(layer->needs_painting(paint_context()));
262 EXPECT_EQ(mock_layer->parent_matrix(), initial_transform * layer_transform);
263 EXPECT_EQ(mock_layer->parent_mutators(),
264 std::vector({Mutator(layer_transform), Mutator(0u)}));
268 expected_builder.
Save();
270 expected_builder.
Translate(layer_offset.
x, layer_offset.
y);
273 expected_builder.
SaveLayer(child_bounds, &save_paint);
275 expected_builder.
DrawPath(child_path, child_paint);
282 layer->Paint(display_list_paint_context());
292 const DlRect expected_layer_bounds =
295 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
296 auto layer = std::make_shared<OpacityLayer>(alpha_half, layer_offset);
297 layer->Add(mock_layer);
299 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
300 layer->Preroll(preroll_context());
301 EXPECT_EQ(mock_layer->paint_bounds(), child_path.
GetBounds());
302 EXPECT_EQ(layer->paint_bounds(), expected_layer_bounds);
303 EXPECT_EQ(layer->child_paint_bounds(), child_path.
GetBounds());
304 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
305 EXPECT_TRUE(layer->needs_painting(paint_context()));
306 EXPECT_EQ(mock_layer->parent_matrix(), initial_transform * layer_transform);
307 EXPECT_EQ(mock_layer->parent_mutators(),
308 std::vector({Mutator(layer_transform), Mutator(alpha_half)}));
317 expected_builder.Save();
318 expected_builder.Translate(layer_offset.
x, layer_offset.
y);
320 expected_builder.SaveLayer(opacity_bounds, &save_paint);
322 expected_builder.DrawPath(child_path, child_dl_paint);
324 expected_builder.Restore();
326 expected_builder.Restore();
328 sk_sp<DisplayList> expected_display_list = expected_builder.Build();
330 layer->Paint(display_list_paint_context());
346 const uint8_t alpha1 = 155u;
347 const uint8_t alpha2 = 224u;
348 auto mock_layer1 = std::make_shared<MockLayer>(child1_path, child1_paint);
349 auto mock_layer2 = std::make_shared<MockLayer>(child2_path, child2_paint);
350 auto mock_layer3 = std::make_shared<MockLayer>(child3_path, child3_paint);
351 auto layer1 = std::make_shared<OpacityLayer>(alpha1, layer1_offset);
352 auto layer2 = std::make_shared<OpacityLayer>(alpha2, layer2_offset);
353 layer2->Add(mock_layer2);
354 layer1->Add(mock_layer1);
356 layer1->Add(mock_layer3);
358 const DlRect expected_layer2_bounds =
360 const DlRect layer1_child_bounds =
361 expected_layer2_bounds
364 const DlRect expected_layer1_bounds =
366 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
367 layer1->Preroll(preroll_context());
368 EXPECT_EQ(mock_layer1->paint_bounds(), child1_path.
GetBounds());
369 EXPECT_EQ(mock_layer2->paint_bounds(), child2_path.
GetBounds());
370 EXPECT_EQ(mock_layer3->paint_bounds(), child3_path.
GetBounds());
371 EXPECT_EQ(layer1->paint_bounds(), expected_layer1_bounds);
372 EXPECT_EQ(layer1->child_paint_bounds(), layer1_child_bounds);
373 EXPECT_EQ(layer2->paint_bounds(), expected_layer2_bounds);
374 EXPECT_EQ(layer2->child_paint_bounds(), child2_path.
GetBounds());
375 EXPECT_TRUE(mock_layer1->needs_painting(paint_context()));
376 EXPECT_TRUE(mock_layer2->needs_painting(paint_context()));
377 EXPECT_TRUE(mock_layer3->needs_painting(paint_context()));
378 EXPECT_TRUE(layer1->needs_painting(paint_context()));
379 EXPECT_TRUE(layer2->needs_painting(paint_context()));
380 EXPECT_EQ(mock_layer1->parent_matrix(), initial_transform * layer1_transform);
381 EXPECT_EQ(mock_layer1->parent_mutators(),
382 std::vector({Mutator(layer1_transform), Mutator(alpha1)}));
383 EXPECT_EQ(mock_layer2->parent_matrix(),
384 (initial_transform * layer1_transform) * layer2_transform);
385 EXPECT_EQ(mock_layer2->parent_mutators(),
386 std::vector({Mutator(layer1_transform), Mutator(alpha1),
387 Mutator(layer2_transform), Mutator(alpha2)}));
388 EXPECT_EQ(mock_layer3->parent_matrix(), initial_transform * layer1_transform);
389 EXPECT_EQ(mock_layer3->parent_mutators(),
390 std::vector({Mutator(layer1_transform), Mutator(alpha1)}));
392 DlRect opacity1_bounds = expected_layer1_bounds.
Shift(-layer1_offset);
393 DlRect opacity2_bounds = expected_layer2_bounds.
Shift(-layer2_offset);
394 DlPaint opacity1_paint = DlPaint().
setAlpha(alpha1);
395 DlPaint opacity2_paint = DlPaint().
setAlpha(alpha2);
397 DisplayListBuilder expected_builder;
399 expected_builder.Save();
401 expected_builder.Translate(layer1_offset.
x, layer1_offset.
y);
403 expected_builder.SaveLayer(opacity1_bounds, &opacity1_paint);
405 expected_builder.DrawPath(child1_path, child1_paint);
408 expected_builder.Save();
410 expected_builder.Translate(layer2_offset.
x, layer2_offset.
y);
412 expected_builder.SaveLayer(opacity2_bounds, &opacity2_paint);
415 expected_builder.DrawPath(child2_path, child2_paint);
418 expected_builder.Restore();
421 expected_builder.Restore();
424 expected_builder.DrawPath(child3_path, child3_paint);
426 expected_builder.Restore();
429 expected_builder.Restore();
431 layer1->Paint(display_list_paint_context());
436 auto layer = std::make_shared<OpacityLayer>(0xff,
DlPoint());
437 layer->Add(std::make_shared<MockLayer>(
DlPath()));
440 preroll_context()->surface_needs_readback =
false;
441 layer->Preroll(preroll_context());
442 EXPECT_FALSE(preroll_context()->surface_needs_readback);
445 auto mock_layer = std::make_shared<MockLayer>(
DlPath(),
DlPaint());
446 mock_layer->set_fake_reads_surface(
true);
447 layer->Add(mock_layer);
448 preroll_context()->surface_needs_readback =
false;
449 layer->Preroll(preroll_context());
450 EXPECT_FALSE(preroll_context()->surface_needs_readback);
454 auto clip_rect_layer = std::make_shared<ClipRectLayer>(
456 auto opacity_layer = std::make_shared<OpacityLayer>(128u,
DlPoint(20, 20));
457 auto mock_layer = std::make_shared<MockLayer>(
DlPath());
458 clip_rect_layer->Add(opacity_layer);
459 opacity_layer->Add(mock_layer);
460 clip_rect_layer->Preroll(preroll_context());
461 EXPECT_EQ(mock_layer->parent_cull_rect().GetLeft(), -20);
462 EXPECT_EQ(mock_layer->parent_cull_rect().GetTop(), -20);
466 auto opacity_layer = std::make_shared<OpacityLayer>(128u,
DlPoint(20, 20));
468 opacity_layer->Add(mock_layer);
471 opacity_layer->Preroll(context);
474 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
478 auto opacity_layer = std::make_shared<OpacityLayer>(128u,
DlPoint(20, 20));
480 opacity_layer->Add(mock_layer);
483 opacity_layer->Preroll(context);
486 EXPECT_FALSE(opacity_layer->children_can_accept_opacity());
490 auto opacity_layer = std::make_shared<OpacityLayer>(128u,
DlPoint(20, 20));
491 auto container_layer = std::make_shared<ContainerLayer>();
493 container_layer->Add(mock_layer);
494 opacity_layer->Add(container_layer);
497 opacity_layer->Preroll(context);
500 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
504 auto opacity_layer = std::make_shared<OpacityLayer>(128u,
DlPoint(20, 20));
505 auto transformLayer =
508 transformLayer->Add(mock_layer);
509 opacity_layer->Add(transformLayer);
512 opacity_layer->Preroll(context);
515 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
519 auto opacity_layer = std::make_shared<OpacityLayer>(128u,
DlPoint(20, 20));
520 auto filter_layer = std::make_shared<ImageFilterLayer>(
523 filter_layer->Add(mock_layer);
524 opacity_layer->Add(filter_layer);
527 opacity_layer->Preroll(context);
530 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
537 auto opacity_layer_1 = std::make_shared<OpacityLayer>(128u, offset1);
538 auto opacity_layer_2 = std::make_shared<OpacityLayer>(64u, offset2);
540 opacity_layer_2->Add(mock_layer);
541 opacity_layer_1->Add(opacity_layer_2);
544 opacity_layer_1->Preroll(context);
547 EXPECT_TRUE(opacity_layer_1->children_can_accept_opacity());
548 EXPECT_TRUE(opacity_layer_2->children_can_accept_opacity());
553 savelayer_paint.
setOpacity(inherited_opacity);
557 expected_builder.
Save();
561 expected_builder.
Save();
565 expected_builder.
DrawPath(mock_path,
566 DlPaint().setOpacity(inherited_opacity));
575 opacity_layer_1->Paint(display_list_paint_context());
583 auto opacity_layer_1 = std::make_shared<OpacityLayer>(128u, offset1);
584 auto opacity_layer_2 = std::make_shared<OpacityLayer>(64u, offset2);
586 opacity_layer_2->Add(mock_layer);
587 opacity_layer_1->Add(opacity_layer_2);
590 opacity_layer_1->Preroll(context);
593 EXPECT_TRUE(opacity_layer_1->children_can_accept_opacity());
594 EXPECT_FALSE(opacity_layer_2->children_can_accept_opacity());
599 savelayer_paint.
setOpacity(inherited_opacity);
603 expected_builder.
Save();
607 expected_builder.
Save();
610 expected_builder.
SaveLayer(mock_layer->paint_bounds(),
622 opacity_layer_1->Paint(display_list_paint_context());
629 auto picture = CreateDisplayListLayer(
631 auto layer = CreateOpacityLater({picture}, 128u,
DlPoint(0.5f, 0.5f));
642 auto picture = CreateDisplayListLayer(
644 auto layer = CreateOpacityLater({picture}, 128u,
DlPoint(0.5f, 0.5f));
647 tree1.root()->Add(layer);
649 auto damage = DiffLayerTree(tree1, MockLayerTree(),
DlIRect(), 0, 0,
655 use_mock_raster_cache();
661 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
662 auto layer = std::make_shared<OpacityLayer>(0xff, layer_offset);
663 layer->Add(mock_layer);
665 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
666 layer->Preroll(preroll_context());
670 expected_builder.Save();
671 expected_builder.Translate(layer_offset.
x, layer_offset.
y);
674 expected_builder.TransformReset();
675 expected_builder.Transform2DAffine(1, 0, std::round(layer_offset.
x),
676 0, 1, std::round(layer_offset.
y));
678 expected_builder.DrawPath(child_path, child_paint);
680 expected_builder.Restore();
682 sk_sp<DisplayList> expected_display_list = expected_builder.Build();
684 layer->Paint(display_list_paint_context());
694 std::make_shared<PlatformViewLayer>(view_offset, view_size,
view_id);
696 auto opacity = std::make_shared<OpacityLayer>(0u, opacity_offset);
701 embedder.AddCanvas(&fake_overlay_builder);
702 preroll_context()->view_embedder = &embedder;
703 paint_context().view_embedder = &embedder;
705 opacity->Preroll(preroll_context());
706 EXPECT_EQ(embedder.prerolled_views(), std::vector<int64_t>({view_id}));
708 opacity->Paint(paint_context());
709 EXPECT_EQ(embedder.painted_views(), std::vector<int64_t>({view_id}));
virtual void Add(std::shared_ptr< Layer > layer)
void SaveLayer(const std::optional< DlRect > &bounds, const DlPaint *paint=nullptr, const DlImageFilter *backdrop=nullptr, std::optional< int64_t > backdrop_id=std::nullopt) override
void Translate(DlScalar tx, DlScalar ty) 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)
DlPaint & setAlpha(uint8_t alpha)
DlPaint & setOpacity(DlScalar opacity)
static DlPath MakeRectLTRB(DlScalar left, DlScalar top, DlScalar right, DlScalar bottom)
static DlPath MakeRect(const DlRect &rect)
DlRect GetBounds() const override
static constexpr int kCallerCanApplyOpacity
static void TryToRasterCache(const std::vector< RasterCacheItem * > &raster_cached_entries, const PaintContext *paint_context, bool ignore_raster_cache=false)
static std::optional< std::vector< RasterCacheKeyID > > LayerChildrenIds(const Layer *layer)
static std::shared_ptr< MockLayer > Make(const DlPath &path, DlPaint paint=DlPaint())
static std::shared_ptr< MockLayer > MakeOpacityCompatible(const DlPath &path)
G_BEGIN_DECLS FlutterViewId view_id
TEST_F(DisplayListTest, Defaults)
LayerTestBase<::testing::Test > LayerTest
DiffContextTest OpacityLayerDiffTest
bool DisplayListsEQ_Verbose(const DisplayList *a, const DisplayList *b)
LayerTest OpacityLayerTest
impeller::Scalar DlScalar
impeller::Matrix DlMatrix
impeller::IRect32 DlIRect
static constexpr DlColor kBlue()
static constexpr DlScalar toOpacity(uint8_t alpha)
static constexpr DlColor kMidGrey()
static uint8_t toAlpha(DlScalar opacity)
static constexpr DlColor kRed()
static constexpr DlColor kGreen()
int renderable_state_flags
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
constexpr Quad Transform(const Quad &quad) const
static constexpr Matrix MakeScale(const Vector3 &s)
static constexpr TRect MakeWH(Type width, Type height)
constexpr TRect Union(const TRect &o) const
RoundOut(const TRect< U > &r)
static constexpr TRect MakeXYWH(Type x, Type y, Type width, Type height)
constexpr TRect TransformAndClipBounds(const Matrix &transform) const
Creates a new bounding box that contains this transformed rectangle, clipped against the near clippin...
constexpr TRect< T > Shift(T dx, T dy) const
Returns a new rectangle translated by the given offset.
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)