15#include "gtest/gtest.h"
27 auto layer = std::make_shared<ImageFilterLayer>(
nullptr);
29 layer->Preroll(preroll_context());
30 EXPECT_EQ(layer->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);
41 auto layer = std::make_shared<ImageFilterLayer>(
nullptr);
42 layer->Add(mock_layer);
44 EXPECT_EQ(layer->paint_bounds(),
DlRect());
45 EXPECT_EQ(layer->child_paint_bounds(),
DlRect());
46 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
47 "needs_painting\\(context\\)");
56 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
57 auto layer = std::make_shared<ImageFilterLayer>(
nullptr);
58 layer->Add(mock_layer);
60 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
61 layer->Preroll(preroll_context());
62 EXPECT_EQ(layer->paint_bounds(), child_bounds);
63 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
64 EXPECT_TRUE(layer->needs_painting(paint_context()));
65 EXPECT_EQ(mock_layer->parent_matrix(), initial_transform);
67 layer->Paint(display_list_paint_context());
68 DisplayListBuilder expected_builder;
70 expected_builder.Save();
72 expected_builder.DrawPath(child_path, child_paint);
74 expected_builder.Restore();
86 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
87 auto layer = std::make_shared<ImageFilterLayer>(dl_image_filter);
88 layer->Add(mock_layer);
90 const DlRect child_rounded_bounds =
93 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
94 layer->Preroll(preroll_context());
95 EXPECT_EQ(layer->paint_bounds(), child_rounded_bounds);
96 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
97 EXPECT_TRUE(layer->needs_painting(paint_context()));
98 EXPECT_EQ(mock_layer->parent_matrix(), initial_transform);
100 DisplayListBuilder expected_builder;
104 expected_builder.SaveLayer(child_bounds, &dl_paint);
111 expected_builder.Restore();
112 auto expected_display_list = expected_builder.Build();
114 layer->Paint(display_list_paint_context());
127 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
129 std::make_shared<ImageFilterLayer>(dl_image_filter, layer_offset);
130 layer->Add(mock_layer);
134 const DlRect child_rounded_bounds =
137 preroll_context()->state_stack.set_preroll_delegate(initial_cull_rect,
139 layer->Preroll(preroll_context());
140 EXPECT_EQ(layer->paint_bounds(), child_rounded_bounds);
141 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
142 EXPECT_TRUE(layer->needs_painting(paint_context()));
143 EXPECT_EQ(mock_layer->parent_matrix(), child_matrix);
144 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
149 expected_builder.
Save();
151 expected_builder.
Translate(layer_offset.
x, layer_offset.
y);
154 expected_builder.
SaveLayer(child_bounds, &dl_paint);
164 auto expected_display_list = expected_builder.
Build();
166 layer->Paint(display_list_paint_context());
179 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
180 auto layer = std::make_shared<ImageFilterLayer>(dl_image_filter);
181 layer->Add(mock_layer);
185 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
186 layer->Preroll(preroll_context());
187 EXPECT_EQ(layer->paint_bounds(), filter_bounds);
188 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
189 EXPECT_TRUE(layer->needs_painting(paint_context()));
190 EXPECT_EQ(mock_layer->parent_matrix(), initial_transform);
196 expected_builder.
SaveLayer(child_bounds, &dl_paint);
204 auto expected_display_list = expected_builder.
Build();
206 layer->Paint(display_list_paint_context());
214 const DlPath child_path2 =
DlPath::MakeRect(child_bounds.Shift(3.0f, 0.0f));
219 auto mock_layer1 = std::make_shared<MockLayer>(child_path1, child_paint1);
220 auto mock_layer2 = std::make_shared<MockLayer>(child_path2, child_paint2);
221 auto layer = std::make_shared<ImageFilterLayer>(dl_image_filter);
222 layer->Add(mock_layer1);
223 layer->Add(mock_layer2);
225 const DlRect children_bounds =
226 child_path1.GetBounds().
Union(child_path2.GetBounds());
227 DlRect children_rounded_bounds =
230 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
231 layer->Preroll(preroll_context());
232 EXPECT_EQ(mock_layer1->paint_bounds(), child_path1.GetBounds());
233 EXPECT_EQ(mock_layer2->paint_bounds(), child_path2.GetBounds());
234 EXPECT_EQ(layer->paint_bounds(), children_rounded_bounds);
235 EXPECT_EQ(layer->child_paint_bounds(), children_bounds);
236 EXPECT_TRUE(mock_layer1->needs_painting(paint_context()));
237 EXPECT_TRUE(mock_layer2->needs_painting(paint_context()));
238 EXPECT_TRUE(layer->needs_painting(paint_context()));
239 EXPECT_EQ(mock_layer1->parent_matrix(), initial_transform);
240 EXPECT_EQ(mock_layer2->parent_matrix(), initial_transform);
242 DisplayListBuilder expected_builder;
246 expected_builder.SaveLayer(children_bounds, &dl_paint);
256 expected_builder.Restore();
257 auto expected_display_list = expected_builder.Build();
259 layer->Paint(display_list_paint_context());
274 auto mock_layer1 = std::make_shared<MockLayer>(child_path1, child_paint1);
275 auto mock_layer2 = std::make_shared<MockLayer>(child_path2, child_paint2);
276 auto layer1 = std::make_shared<ImageFilterLayer>(dl_image_filter1);
277 auto layer2 = std::make_shared<ImageFilterLayer>(dl_image_filter2);
278 layer2->Add(mock_layer2);
279 layer1->Add(mock_layer1);
293 const DlRect filter1_child_bounds =
294 child_path1.GetBounds().
Union(filter2_bounds);
300 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
301 layer1->Preroll(preroll_context());
302 EXPECT_EQ(mock_layer1->paint_bounds(), child_path1.GetBounds());
303 EXPECT_EQ(mock_layer2->paint_bounds(), child_path2.GetBounds());
304 EXPECT_EQ(layer1->paint_bounds(), filter1_bounds);
305 EXPECT_EQ(layer1->child_paint_bounds(), filter1_child_bounds);
306 EXPECT_EQ(layer2->paint_bounds(), filter2_bounds);
307 EXPECT_EQ(layer2->child_paint_bounds(), child_path2.GetBounds());
308 EXPECT_TRUE(mock_layer1->needs_painting(paint_context()));
309 EXPECT_TRUE(mock_layer2->needs_painting(paint_context()));
310 EXPECT_TRUE(layer1->needs_painting(paint_context()));
311 EXPECT_TRUE(layer2->needs_painting(paint_context()));
312 EXPECT_EQ(mock_layer1->parent_matrix(), initial_transform);
313 EXPECT_EQ(mock_layer2->parent_matrix(), initial_transform);
315 DisplayListBuilder expected_builder;
319 expected_builder.SaveLayer(filter1_child_bounds, &dl_paint);
327 expected_builder.SaveLayer(child_path2.GetBounds(), &child_paint);
331 expected_builder.Restore();
335 expected_builder.Restore();
336 auto expected_display_list = expected_builder.Build();
338 layer1->Paint(display_list_paint_context());
347 auto layer = std::make_shared<ImageFilterLayer>(dl_image_filter);
348 preroll_context()->surface_needs_readback =
false;
349 layer->Preroll(preroll_context());
350 EXPECT_FALSE(preroll_context()->surface_needs_readback);
353 auto mock_layer = std::make_shared<MockLayer>(
DlPath(),
DlPaint());
354 mock_layer->set_fake_reads_surface(
true);
355 layer->Add(mock_layer);
356 preroll_context()->surface_needs_readback =
false;
357 layer->Preroll(preroll_context());
358 EXPECT_FALSE(preroll_context()->surface_needs_readback);
367 auto mock_layer = std::make_shared<MockLayer>(child_path);
368 auto layer = std::make_shared<ImageFilterLayer>(dl_image_filter);
369 layer->Add(mock_layer);
371 DlMatrix cache_ctm = initial_transform;
372 DisplayListBuilder cache_canvas;
374 DisplayListBuilder other_canvas;
375 other_canvas.Transform(other_transform);
378 use_mock_raster_cache();
379 const auto* cacheable_image_filter_item = layer->raster_cache_item();
381 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
383 EXPECT_EQ(cacheable_image_filter_item->cache_state(),
385 EXPECT_FALSE(cacheable_image_filter_item->Draw(paint_context(), &paint));
387 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
388 layer->Preroll(preroll_context());
391 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)1);
394 EXPECT_EQ(cacheable_image_filter_item->cache_state(),
398 ASSERT_TRUE(cacheable_image_filter_item->GetId().has_value());
399 EXPECT_TRUE(raster_cache()->Draw(cacheable_image_filter_item->GetId().value(),
400 cache_canvas, &paint));
401 EXPECT_FALSE(raster_cache()->Draw(
402 cacheable_image_filter_item->GetId().value(), other_canvas, &paint));
413 auto mock_layer1 = std::make_shared<MockLayer>(child_path1);
414 auto mock_layer2 = std::make_shared<MockLayer>(child_path2);
416 auto layer = std::make_shared<ImageFilterLayer>(dl_image_filter, offset);
417 layer->Add(mock_layer1);
418 layer->Add(mock_layer2);
420 DlMatrix cache_ctm = initial_transform;
421 DisplayListBuilder cache_canvas;
423 DisplayListBuilder other_canvas;
424 other_canvas.Transform(other_transform);
426 use_mock_raster_cache();
428 const auto* cacheable_image_filter_item = layer->raster_cache_item();
429 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
432 EXPECT_EQ(cacheable_image_filter_item->cache_state(),
434 EXPECT_FALSE(cacheable_image_filter_item->Draw(paint_context(), &paint));
436 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
437 layer->Preroll(preroll_context());
440 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)1);
444 EXPECT_EQ(cacheable_image_filter_item->cache_state(),
448 ASSERT_TRUE(cacheable_image_filter_item->GetId().has_value());
449 EXPECT_TRUE(raster_cache()->Draw(cacheable_image_filter_item->GetId().value(),
450 cache_canvas, &paint));
451 EXPECT_FALSE(raster_cache()->Draw(
452 cacheable_image_filter_item->GetId().value(), other_canvas, &paint));
454 layer->Preroll(preroll_context());
457 DlMatrix cache_matrix = snapped_matrix * initial_transform;
458 auto transformed_filter = dl_image_filter->makeWithLocalMatrix(cache_matrix);
460 layer->Paint(display_list_paint_context());
461 DisplayListBuilder expected_builder;
463 expected_builder.Save();
465 expected_builder.
Translate(offset.x, offset.y);
470 raster_cache()->Draw(cacheable_image_filter_item->GetId().value(),
471 expected_builder, &dl_paint);
473 expected_builder.Restore();
475 expected_builder.Restore();
487 auto mock_layer = std::make_shared<MockLayer>(child_path);
488 auto offset =
DlPoint(53.8, 24.4);
489 auto layer = std::make_shared<ImageFilterLayer>(dl_image_filter, offset);
490 layer->Add(mock_layer);
492 DlMatrix cache_ctm = initial_transform;
501 use_mock_raster_cache();
502 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
503 const auto* cacheable_image_filter_item = layer->raster_cache_item();
505 layer->Preroll(preroll_context());
507 layer->Paint(display_list_paint_context());
511 expected_builder.
Save();
513 expected_builder.
Translate(offset.x, offset.y);
516 expected_builder.
Transform(snapped_matrix);
518 expected_builder.
SaveLayer(child_rect, &save_paint);
533 layer->Preroll(preroll_context());
534 layer->Paint(display_list_paint_context());
536 layer->Preroll(preroll_context());
537 layer->Paint(display_list_paint_context());
542 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)2);
545 EXPECT_EQ(cacheable_image_filter_item->cache_state(),
547 EXPECT_EQ(cacheable_image_filter_item->GetId(),
549 EXPECT_TRUE(raster_cache()->Draw(cacheable_image_filter_item->GetId().value(),
550 cache_canvas, &paint));
551 EXPECT_FALSE(raster_cache()->Draw(
552 cacheable_image_filter_item->GetId().value(), other_canvas, &paint));
554 layer->Preroll(preroll_context());
556 reset_display_list();
557 layer->Paint(display_list_paint_context());
561 expected_builder.
Save();
564 raster_cache()->Draw(cacheable_image_filter_item->GetId().value(),
565 expected_builder,
nullptr));
584 auto image_filter_layer = std::make_shared<ImageFilterLayer>(dl_image_filter);
585 image_filter_layer->Add(mock_layer);
587 PrerollContext* context = preroll_context();
588 context->state_stack.set_preroll_delegate(initial_transform);
589 image_filter_layer->Preroll(preroll_context());
592 EXPECT_EQ(context->renderable_state_flags,
596 int opacity_alpha = 0x7F;
598 auto opacity_layer = std::make_shared<OpacityLayer>(opacity_alpha, offset);
599 opacity_layer->Add(image_filter_layer);
600 context->state_stack.set_preroll_delegate(
DlMatrix());
601 opacity_layer->Preroll(context);
602 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
604 DisplayListBuilder expected_builder;
606 expected_builder.Save();
608 expected_builder.Translate(offset.x, offset.y);
613 expected_builder.SaveLayer(child_path.GetBounds(), &image_filter_paint);
615 expected_builder.DrawPath(child_path,
616 DlPaint(child_paint.getColor()));
618 expected_builder.Restore();
621 expected_builder.Restore();
624 opacity_layer->Paint(display_list_paint_context());
641 auto filter_layer = std::make_shared<ImageFilterLayer>(dl_blur_filter);
643 filter_layer->Add(std::make_shared<MockLayer>(
path));
652 scale->Add(filter_layer);
663 l3.
root()->
Add(std::make_shared<MockLayer>(path1));
664 damage = DiffLayerTree(l3, l2);
672 l4.
root()->
Add(std::make_shared<MockLayer>(path2));
673 damage = DiffLayerTree(l4, l3);
691 auto filter_layer_1_1 = std::make_shared<ImageFilterLayer>(dl_blur_filter);
692 auto filter_layer_1_2 = std::make_shared<ImageFilterLayer>(dl_blur_filter);
693 filter_layer_1_1->Add(filter_layer_1_2);
695 filter_layer_1_2->Add(
697 l1.
root()->
Add(filter_layer_1_1);
701 auto filter_layer2_1 = std::make_shared<ImageFilterLayer>(dl_blur_filter);
702 filter_layer2_1->AssignOldLayer(filter_layer_1_1.get());
703 auto filter_layer2_2 = std::make_shared<ImageFilterLayer>(dl_blur_filter);
704 filter_layer2_2->AssignOldLayer(filter_layer_1_2.get());
705 filter_layer2_1->Add(filter_layer2_2);
706 filter_layer2_2->Add(
708 l2.
root()->
Add(filter_layer2_1);
711 auto damage = DiffLayerTree(l2, l1);
721 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
723 auto layer = std::make_shared<ImageFilterLayer>(
nullptr, offset);
724 layer->Add(mock_layer);
726 layer->Preroll(preroll_context());
727 EXPECT_EQ(layer->paint_bounds(), child_bounds.
Shift(offset));
virtual void Add(std::shared_ptr< Layer > layer)
void TransformReset() 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
void Translate(DlScalar tx, DlScalar ty) override
sk_sp< DisplayList > Build()
void DrawPath(const DlPath &path, const DlPaint &paint) override
void Transform(const DlMatrix &matrix) 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 & setImageFilter(std::nullptr_t filter)
static DlPath MakeRectLTRB(DlScalar left, DlScalar top, DlScalar right, DlScalar bottom)
static DlPath MakeRect(const DlRect &rect)
static constexpr int kCallerCanApplyColorFilter
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::shared_ptr< MockLayer > Make(const DlPath &path, DlPaint paint=DlPaint())
TEST_F(DisplayListTest, Defaults)
LayerTestBase<::testing::Test > LayerTest
LayerTest ImageFilterLayerTest
bool DisplayListsEQ_Verbose(const DisplayList *a, const DisplayList *b)
impeller::Matrix DlMatrix
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
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)
constexpr Matrix Translate(const Vector3 &t) const
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)
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)