26 EXPECT_DEATH_IF_SUPPORTED(
27 auto clip = std::make_shared<ClipRSuperellipseLayer>(layer_rsuperellipse,
29 "clip_behavior != Clip::kNone");
34 auto layer = std::make_shared<ClipRSuperellipseLayer>(layer_rsuperellipse,
37 layer->Preroll(preroll_context());
40 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
kGiantRect);
41 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
43 EXPECT_EQ(layer->paint_bounds(),
DlRect());
44 EXPECT_EQ(layer->child_paint_bounds(),
DlRect());
45 EXPECT_FALSE(layer->needs_painting(paint_context()));
47 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
48 "needs_painting\\(context\\)");
55 auto layer = std::make_shared<ClipRSuperellipseLayer>(layer_rsuperellipse,
57 EXPECT_EQ(layer->paint_bounds(),
DlRect());
58 EXPECT_EQ(layer->child_paint_bounds(),
DlRect());
59 EXPECT_FALSE(layer->needs_painting(paint_context()));
61 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
62 "needs_painting\\(context\\)");
74 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
75 auto layer = std::make_shared<ClipRSuperellipseLayer>(layer_rsuperellipse,
77 layer->Add(mock_layer);
80 preroll_context()->state_stack.set_preroll_delegate(distant_bounds,
82 layer->Preroll(preroll_context());
85 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(), distant_bounds);
86 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
88 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
89 EXPECT_EQ(layer->paint_bounds(), child_bounds);
90 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
91 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
92 EXPECT_TRUE(layer->needs_painting(paint_context()));
93 EXPECT_EQ(mock_layer->parent_cull_rect(),
DlRect());
94 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
95 EXPECT_EQ(mock_layer->parent_mutators(),
96 std::vector({Mutator(layer_rsuperellipse)}));
98 auto mutator = paint_context().state_stack.save();
99 mutator.clipRect(distant_bounds,
false);
100 EXPECT_FALSE(mock_layer->needs_painting(paint_context()));
101 EXPECT_FALSE(layer->needs_painting(paint_context()));
102 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
103 "needs_painting\\(context\\)");
110 const DlRect device_cull_bounds =
118 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
119 auto layer = std::make_shared<ClipRSuperellipseLayer>(clip_rsuperellipse,
121 layer->Add(mock_layer);
123 auto clip_cull_rect = clip_bounds.Intersection(local_cull_bounds);
124 ASSERT_TRUE(clip_cull_rect.has_value());
125 auto clip_layer_bounds = child_bounds.Intersection(clip_bounds);
126 ASSERT_TRUE(clip_layer_bounds.has_value());
129 preroll_context()->state_stack.set_preroll_delegate(device_cull_bounds,
131 paint_context().canvas->ClipRect(device_cull_bounds);
132 paint_context().canvas->Transform(initial_matrix);
134 layer->Preroll(preroll_context());
136 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
138 EXPECT_EQ(preroll_context()->state_stack.local_cull_rect(),
140 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
142 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
143 EXPECT_EQ(layer->paint_bounds(), clip_layer_bounds.value());
144 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
145 EXPECT_EQ(mock_layer->parent_cull_rect(), clip_cull_rect.value());
146 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
147 EXPECT_EQ(mock_layer->parent_mutators(),
148 std::vector({Mutator(clip_rsuperellipse)}));
150 EXPECT_FALSE(mock_layer->needs_painting(paint_context()));
151 ASSERT_FALSE(layer->needs_painting(paint_context()));
165 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
166 auto layer = std::make_shared<ClipRSuperellipseLayer>(layer_rsuperellipse,
168 layer->Add(mock_layer);
170 preroll_context()->state_stack.set_preroll_delegate(initial_matrix);
171 layer->Preroll(preroll_context());
174 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
kGiantRect);
175 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
177 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
178 EXPECT_EQ(layer->paint_bounds(), mock_layer->paint_bounds());
179 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
180 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
181 EXPECT_TRUE(layer->needs_painting(paint_context()));
182 EXPECT_EQ(mock_layer->parent_cull_rect(), layer_bounds);
183 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
184 EXPECT_EQ(mock_layer->parent_mutators(),
185 std::vector({Mutator(layer_rsuperellipse)}));
187 layer->Paint(display_list_paint_context());
188 DisplayListBuilder expected_builder;
190 expected_builder.Save();
192 expected_builder.ClipRoundSuperellipse(layer_rsuperellipse);
194 expected_builder.DrawPath(child_path, child_paint);
197 expected_builder.Restore();
205 const DlRect device_cull_bounds =
214 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
215 auto layer = std::make_shared<ClipRSuperellipseLayer>(clip_rsuperellipse,
217 layer->Add(mock_layer);
219 auto clip_cull_rect = clip_bounds.Intersection(local_cull_bounds);
220 ASSERT_TRUE(clip_cull_rect.has_value());
221 auto clip_layer_bounds = child_bounds.Intersection(clip_bounds);
222 ASSERT_TRUE(clip_layer_bounds.has_value());
224 preroll_context()->state_stack.set_preroll_delegate(device_cull_bounds,
227 layer->Preroll(preroll_context());
229 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
231 EXPECT_EQ(preroll_context()->state_stack.local_cull_rect(),
233 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
235 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
236 EXPECT_EQ(layer->paint_bounds(), clip_layer_bounds.value());
237 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
238 EXPECT_EQ(mock_layer->parent_cull_rect(), clip_cull_rect.value());
239 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
240 EXPECT_EQ(mock_layer->parent_mutators(),
241 std::vector({Mutator(clip_rsuperellipse)}));
243 layer->Paint(display_list_paint_context());
244 DisplayListBuilder expected_builder;
246 expected_builder.Save();
248 expected_builder.ClipRoundSuperellipse(clip_rsuperellipse);
250 expected_builder.DrawPath(child_path, child_paint);
253 expected_builder.Restore();
260 const std::shared_ptr<Layer>& child,
265 auto layer = std::make_shared<ClipRSuperellipseLayer>(layer_rsuperellipse,
267 if (child !=
nullptr) {
271 layer->Preroll(context);
284 std::shared_ptr<MockLayer> nochild;
285 auto reader = std::make_shared<MockLayer>(
path, paint);
286 reader->set_fake_reads_surface(
true);
287 auto nonreader = std::make_shared<MockLayer>(
path, paint);
292 EXPECT_FALSE(
ReadbackResult(context, save_layer, nochild,
false));
302 EXPECT_FALSE(
ReadbackResult(context, save_layer, nonreader,
false));
307 EXPECT_TRUE(
ReadbackResult(context, save_layer, nonreader,
true));
326 auto clip_rsuperellipse_layer = std::make_shared<ClipRSuperellipseLayer>(
328 clip_rsuperellipse_layer->Add(mock1);
331 PrerollContext* context = preroll_context();
332 clip_rsuperellipse_layer->Preroll(context);
333 EXPECT_EQ(context->renderable_state_flags,
338 clip_rsuperellipse_layer->Add(mock2);
342 clip_rsuperellipse_layer->Preroll(context);
343 EXPECT_EQ(context->renderable_state_flags,
348 clip_rsuperellipse_layer->Add(mock3);
352 clip_rsuperellipse_layer->Preroll(context);
353 EXPECT_EQ(context->renderable_state_flags, 0);
357 auto clip_rsuperellipse_savelayer =
358 std::make_shared<ClipRSuperellipseLayer>(clip_rsuperellipse,
360 clip_rsuperellipse_savelayer->Add(mock1);
361 clip_rsuperellipse_savelayer->Add(mock2);
364 clip_rsuperellipse_savelayer->Preroll(context);
368 clip_rsuperellipse_savelayer->Add(mock3);
369 clip_rsuperellipse_savelayer->Preroll(context);
379 auto clip_rsuperellipse_bad_child =
380 std::make_shared<ClipRSuperellipseLayer>(clip_rsuperellipse,
382 clip_rsuperellipse_bad_child->Add(mock1);
383 clip_rsuperellipse_bad_child->Add(mock2);
386 clip_rsuperellipse_bad_child->Preroll(context);
387 EXPECT_EQ(context->renderable_state_flags,
390 clip_rsuperellipse_bad_child->Add(mock4);
394 clip_rsuperellipse_bad_child->Preroll(context);
395 EXPECT_EQ(context->renderable_state_flags, 0);
400 auto clip_rsuperellipse_savelayer_bad_child =
401 std::make_shared<ClipRSuperellipseLayer>(clip_rsuperellipse,
403 clip_rsuperellipse_savelayer_bad_child->Add(mock1);
404 clip_rsuperellipse_savelayer_bad_child->Add(mock2);
407 clip_rsuperellipse_savelayer_bad_child->Preroll(context);
411 clip_rsuperellipse_savelayer_bad_child->Add(mock4);
412 clip_rsuperellipse_savelayer_bad_child->Preroll(context);
425 auto clip_rect_layer = std::make_shared<ClipRSuperellipseLayer>(
427 clip_rect_layer->Add(mock1);
428 clip_rect_layer->Add(mock2);
432 PrerollContext* context = preroll_context();
433 clip_rect_layer->Preroll(context);
434 EXPECT_EQ(context->renderable_state_flags,
437 int opacity_alpha = 0x7F;
439 auto opacity_layer = std::make_shared<OpacityLayer>(opacity_alpha, offset);
440 opacity_layer->Add(clip_rect_layer);
441 opacity_layer->Preroll(context);
442 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
444 DisplayListBuilder expected_builder;
446 expected_builder.Save();
448 expected_builder.Translate(offset.x, offset.y);
450 expected_builder.Save();
451 expected_builder.ClipRoundSuperellipse(clip_rsuperellipse,
454 expected_builder.DrawPath(path1,
DlPaint().setAlpha(opacity_alpha));
457 expected_builder.DrawPath(path2,
DlPaint().setAlpha(opacity_alpha));
459 expected_builder.Restore();
462 expected_builder.Restore();
465 opacity_layer->Paint(display_list_paint_context());
474 auto children_bounds = path1.GetBounds().Union(path2.GetBounds());
478 auto clip_rsuperellipse_layer = std::make_shared<ClipRSuperellipseLayer>(
480 clip_rsuperellipse_layer->Add(mock1);
481 clip_rsuperellipse_layer->Add(mock2);
485 PrerollContext* context = preroll_context();
486 clip_rsuperellipse_layer->Preroll(context);
489 int opacity_alpha = 0x7F;
491 auto opacity_layer = std::make_shared<OpacityLayer>(opacity_alpha, offset);
492 opacity_layer->Add(clip_rsuperellipse_layer);
493 opacity_layer->Preroll(context);
494 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
496 DisplayListBuilder expected_builder;
498 expected_builder.Save();
500 expected_builder.Translate(offset.x, offset.y);
502 expected_builder.Save();
503 expected_builder.ClipRoundSuperellipse(clip_rsuperellipse,
505 expected_builder.SaveLayer(children_bounds,
506 &
DlPaint().setAlpha(opacity_alpha));
508 expected_builder.DrawPath(path1,
DlPaint());
511 expected_builder.DrawPath(path2,
DlPaint());
513 expected_builder.Restore();
516 expected_builder.Restore();
519 opacity_layer->Paint(display_list_paint_context());
530 auto layer = std::make_shared<ClipRSuperellipseLayer>(
535 DlMatrix cache_ctm = initial_transform;
536 DisplayListBuilder cache_canvas;
539 use_mock_raster_cache();
540 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
542 const auto* clip_cache_item = layer->raster_cache_item();
544 layer->Preroll(preroll_context());
547 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
550 layer->Preroll(preroll_context());
552 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
555 layer->Preroll(preroll_context());
557 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)1);
558 EXPECT_EQ(clip_cache_item->cache_state(),
560 EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(),
561 cache_canvas, &paint));
571 auto layer = std::make_shared<ClipRSuperellipseLayer>(clip_rsuperellipse,
577 use_mock_raster_cache();
578 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
580 const auto* clip_cache_item = layer->raster_cache_item();
582 layer->Preroll(preroll_context());
585 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
588 layer->Preroll(preroll_context());
590 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
593 layer->Preroll(preroll_context());
595 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
604 std::make_shared<PlatformViewLayer>(view_offset, view_size,
view_id);
608 auto clip = std::make_shared<ClipRSuperellipseLayer>(clip_rsuperellipse,
612 auto embedder = MockViewEmbedder();
613 DisplayListBuilder fake_overlay_builder;
614 embedder.AddCanvas(&fake_overlay_builder);
615 preroll_context()->view_embedder = &embedder;
616 paint_context().view_embedder = &embedder;
618 clip->Preroll(preroll_context());
619 EXPECT_EQ(embedder.prerolled_views(), std::vector<int64_t>({view_id}));
621 clip->Paint(paint_context());
622 EXPECT_EQ(embedder.painted_views(), std::vector<int64_t>({view_id}));
static DlPath MakeRectLTRB(DlScalar left, DlScalar top, DlScalar right, DlScalar bottom)
static DlPath MakeRect(const DlRect &rect)
static DlPath MakeOval(const DlRect &bounds)
static constexpr int kSaveLayerRenderFlags
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())
static std::shared_ptr< MockLayer > MakeOpacityCompatible(const DlPath &path)
G_BEGIN_DECLS FlutterViewId view_id
TEST_F(DisplayListTest, Defaults)
LayerTestBase<::testing::Test > LayerTest
LayerTest ClipRSuperellipseLayerTest
bool DisplayListsEQ_Verbose(const DisplayList *a, const DisplayList *b)
static bool ReadbackResult(PrerollContext *context, Clip clip_behavior, const std::shared_ptr< Layer > &child, bool before)
@ kAntiAliasWithSaveLayer
impeller::Matrix DlMatrix
impeller::RoundSuperellipse DlRoundSuperellipse
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 DlRect kGiantRect
static constexpr DlColor kYellow()
bool surface_needs_readback
static constexpr Matrix MakeTranslation(const Vector3 &t)
constexpr Quad Transform(const Quad &quad) const
static RoundSuperellipse MakeRect(const Rect &rect)
static RoundSuperellipse MakeRectXY(const Rect &rect, Scalar x_radius, Scalar y_radius)
static constexpr TRect MakeWH(Type width, Type height)
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...