26 EXPECT_DEATH_IF_SUPPORTED(
27 auto clip = std::make_shared<ClipRRectLayer>(layer_rrect,
Clip::kNone),
28 "clip_behavior != Clip::kNone");
33 auto layer = std::make_shared<ClipRRectLayer>(layer_rrect,
Clip::kHardEdge);
35 layer->Preroll(preroll_context());
38 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
kGiantRect);
39 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
41 EXPECT_EQ(layer->paint_bounds(),
DlRect());
42 EXPECT_EQ(layer->child_paint_bounds(),
DlRect());
43 EXPECT_FALSE(layer->needs_painting(paint_context()));
45 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
46 "needs_painting\\(context\\)");
52 auto layer = std::make_shared<ClipRRectLayer>(layer_rrect,
Clip::kHardEdge);
53 EXPECT_EQ(layer->paint_bounds(),
DlRect());
54 EXPECT_EQ(layer->child_paint_bounds(),
DlRect());
55 EXPECT_FALSE(layer->needs_painting(paint_context()));
57 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
58 "needs_painting\\(context\\)");
70 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
71 auto layer = std::make_shared<ClipRRectLayer>(layer_rrect,
Clip::kHardEdge);
72 layer->Add(mock_layer);
75 preroll_context()->state_stack.set_preroll_delegate(distant_bounds,
77 layer->Preroll(preroll_context());
80 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(), distant_bounds);
81 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
83 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
84 EXPECT_EQ(layer->paint_bounds(), child_bounds);
85 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
86 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
87 EXPECT_TRUE(layer->needs_painting(paint_context()));
88 EXPECT_EQ(mock_layer->parent_cull_rect(),
DlRect());
89 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
90 EXPECT_EQ(mock_layer->parent_mutators(), std::vector({Mutator(layer_rrect)}));
92 auto mutator = paint_context().state_stack.save();
93 mutator.clipRect(distant_bounds,
false);
94 EXPECT_FALSE(mock_layer->needs_painting(paint_context()));
95 EXPECT_FALSE(layer->needs_painting(paint_context()));
96 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
97 "needs_painting\\(context\\)");
104 const DlRect device_cull_bounds =
112 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
113 auto layer = std::make_shared<ClipRRectLayer>(clip_rrect,
Clip::kHardEdge);
114 layer->Add(mock_layer);
116 auto clip_cull_rect = clip_bounds.Intersection(local_cull_bounds);
117 ASSERT_TRUE(clip_cull_rect.has_value());
118 auto clip_layer_bounds = child_bounds.Intersection(clip_bounds);
119 ASSERT_TRUE(clip_layer_bounds.has_value());
122 preroll_context()->state_stack.set_preroll_delegate(device_cull_bounds,
124 paint_context().canvas->ClipRect(device_cull_bounds);
125 paint_context().canvas->Transform(initial_matrix);
127 layer->Preroll(preroll_context());
129 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
131 EXPECT_EQ(preroll_context()->state_stack.local_cull_rect(),
133 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
135 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
136 EXPECT_EQ(layer->paint_bounds(), clip_layer_bounds.value());
137 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
138 EXPECT_EQ(mock_layer->parent_cull_rect(), clip_cull_rect.value());
139 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
140 EXPECT_EQ(mock_layer->parent_mutators(), std::vector({Mutator(clip_rrect)}));
142 EXPECT_FALSE(mock_layer->needs_painting(paint_context()));
143 ASSERT_FALSE(layer->needs_painting(paint_context()));
156 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
157 auto layer = std::make_shared<ClipRRectLayer>(layer_rrect,
Clip::kHardEdge);
158 layer->Add(mock_layer);
160 preroll_context()->state_stack.set_preroll_delegate(initial_matrix);
161 layer->Preroll(preroll_context());
164 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
kGiantRect);
165 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
167 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
168 EXPECT_EQ(layer->paint_bounds(), mock_layer->paint_bounds());
169 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
170 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
171 EXPECT_TRUE(layer->needs_painting(paint_context()));
172 EXPECT_EQ(mock_layer->parent_cull_rect(), layer_bounds);
173 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
174 EXPECT_EQ(mock_layer->parent_mutators(),
175 std::vector({Mutator(layer_bounds)}));
177 layer->Paint(display_list_paint_context());
180 expected_builder.
Save();
182 expected_builder.
ClipRect(layer_bounds);
184 expected_builder.
DrawPath(child_path, child_paint);
201 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
202 auto layer = std::make_shared<ClipRRectLayer>(layer_rrect,
Clip::kHardEdge);
203 layer->Add(mock_layer);
205 preroll_context()->state_stack.set_preroll_delegate(initial_matrix);
206 layer->Preroll(preroll_context());
209 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
kGiantRect);
210 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
212 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
213 EXPECT_EQ(layer->paint_bounds(), mock_layer->paint_bounds());
214 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
215 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
216 EXPECT_TRUE(layer->needs_painting(paint_context()));
217 EXPECT_EQ(mock_layer->parent_cull_rect(), layer_bounds);
218 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
219 EXPECT_EQ(mock_layer->parent_mutators(), std::vector({Mutator(layer_rrect)}));
221 layer->Paint(display_list_paint_context());
222 DisplayListBuilder expected_builder;
224 expected_builder.Save();
226 expected_builder.ClipRoundRect(layer_rrect);
228 expected_builder.DrawPath(child_path, child_paint);
231 expected_builder.Restore();
239 const DlRect device_cull_bounds =
247 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
248 auto layer = std::make_shared<ClipRRectLayer>(clip_rrect,
Clip::kHardEdge);
249 layer->Add(mock_layer);
251 auto clip_cull_rect = clip_bounds.Intersection(local_cull_bounds);
252 ASSERT_TRUE(clip_cull_rect.has_value());
253 auto clip_layer_bounds = child_bounds.Intersection(clip_bounds);
254 ASSERT_TRUE(clip_layer_bounds.has_value());
256 preroll_context()->state_stack.set_preroll_delegate(device_cull_bounds,
259 layer->Preroll(preroll_context());
261 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
263 EXPECT_EQ(preroll_context()->state_stack.local_cull_rect(),
265 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
267 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
268 EXPECT_EQ(layer->paint_bounds(), clip_layer_bounds.value());
269 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
270 EXPECT_EQ(mock_layer->parent_cull_rect(), clip_cull_rect.value());
271 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
272 EXPECT_EQ(mock_layer->parent_mutators(), std::vector({Mutator(clip_rrect)}));
274 layer->Paint(display_list_paint_context());
275 DisplayListBuilder expected_builder;
277 expected_builder.Save();
279 expected_builder.ClipRoundRect(clip_rrect);
281 expected_builder.DrawPath(child_path, child_paint);
284 expected_builder.Restore();
291 const std::shared_ptr<Layer>& child,
295 auto layer = std::make_shared<ClipRRectLayer>(layer_rrect, clip_behavior);
296 if (child !=
nullptr) {
300 layer->Preroll(context);
313 std::shared_ptr<MockLayer> nochild;
314 auto reader = std::make_shared<MockLayer>(
path, paint);
315 reader->set_fake_reads_surface(
true);
316 auto nonreader = std::make_shared<MockLayer>(
path, paint);
321 EXPECT_FALSE(
ReadbackResult(context, save_layer, nochild,
false));
331 EXPECT_FALSE(
ReadbackResult(context, save_layer, nonreader,
false));
336 EXPECT_TRUE(
ReadbackResult(context, save_layer, nonreader,
true));
354 auto clip_rrect_layer =
356 clip_rrect_layer->Add(mock1);
359 PrerollContext* context = preroll_context();
360 clip_rrect_layer->Preroll(context);
361 EXPECT_EQ(context->renderable_state_flags,
366 clip_rrect_layer->Add(mock2);
370 clip_rrect_layer->Preroll(context);
371 EXPECT_EQ(context->renderable_state_flags,
376 clip_rrect_layer->Add(mock3);
380 clip_rrect_layer->Preroll(context);
381 EXPECT_EQ(context->renderable_state_flags, 0);
385 auto clip_rrect_savelayer = std::make_shared<ClipRRectLayer>(
387 clip_rrect_savelayer->Add(mock1);
388 clip_rrect_savelayer->Add(mock2);
391 clip_rrect_savelayer->Preroll(context);
395 clip_rrect_savelayer->Add(mock3);
396 clip_rrect_savelayer->Preroll(context);
406 auto clip_rrect_bad_child =
408 clip_rrect_bad_child->Add(mock1);
409 clip_rrect_bad_child->Add(mock2);
412 clip_rrect_bad_child->Preroll(context);
413 EXPECT_EQ(context->renderable_state_flags,
416 clip_rrect_bad_child->Add(mock4);
420 clip_rrect_bad_child->Preroll(context);
421 EXPECT_EQ(context->renderable_state_flags, 0);
426 auto clip_rrect_savelayer_bad_child = std::make_shared<ClipRRectLayer>(
428 clip_rrect_savelayer_bad_child->Add(mock1);
429 clip_rrect_savelayer_bad_child->Add(mock2);
432 clip_rrect_savelayer_bad_child->Preroll(context);
436 clip_rrect_savelayer_bad_child->Add(mock4);
437 clip_rrect_savelayer_bad_child->Preroll(context);
449 auto clip_rect_layer =
451 clip_rect_layer->Add(mock1);
452 clip_rect_layer->Add(mock2);
456 PrerollContext* context = preroll_context();
457 clip_rect_layer->Preroll(context);
458 EXPECT_EQ(context->renderable_state_flags,
461 int opacity_alpha = 0x7F;
463 auto opacity_layer = std::make_shared<OpacityLayer>(opacity_alpha, offset);
464 opacity_layer->Add(clip_rect_layer);
465 opacity_layer->Preroll(context);
466 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
468 DisplayListBuilder expected_builder;
470 expected_builder.Save();
472 expected_builder.Translate(offset.x, offset.y);
474 expected_builder.Save();
477 expected_builder.DrawPath(path1,
DlPaint().setAlpha(opacity_alpha));
480 expected_builder.DrawPath(path2,
DlPaint().setAlpha(opacity_alpha));
482 expected_builder.Restore();
485 expected_builder.Restore();
488 opacity_layer->Paint(display_list_paint_context());
497 auto children_bounds = path1.GetBounds().Union(path2.GetBounds());
500 auto clip_rrect_layer = std::make_shared<ClipRRectLayer>(
502 clip_rrect_layer->Add(mock1);
503 clip_rrect_layer->Add(mock2);
507 PrerollContext* context = preroll_context();
508 clip_rrect_layer->Preroll(context);
511 int opacity_alpha = 0x7F;
513 auto opacity_layer = std::make_shared<OpacityLayer>(opacity_alpha, offset);
514 opacity_layer->Add(clip_rrect_layer);
515 opacity_layer->Preroll(context);
516 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
518 DisplayListBuilder expected_builder;
520 expected_builder.Save();
522 expected_builder.Translate(offset.x, offset.y);
524 expected_builder.Save();
526 expected_builder.SaveLayer(children_bounds,
527 &
DlPaint().setAlpha(opacity_alpha));
529 expected_builder.DrawPath(path1,
DlPaint());
532 expected_builder.DrawPath(path2,
DlPaint());
534 expected_builder.Restore();
537 expected_builder.Restore();
540 opacity_layer->Paint(display_list_paint_context());
550 auto layer = std::make_shared<ClipRRectLayer>(clip_rrect,
555 DlMatrix cache_ctm = initial_transform;
556 DisplayListBuilder cache_canvas;
559 use_mock_raster_cache();
560 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
562 const auto* clip_cache_item = layer->raster_cache_item();
564 layer->Preroll(preroll_context());
567 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
570 layer->Preroll(preroll_context());
572 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
575 layer->Preroll(preroll_context());
577 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)1);
578 EXPECT_EQ(clip_cache_item->cache_state(),
580 EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(),
581 cache_canvas, &paint));
590 auto layer = std::make_shared<ClipRRectLayer>(clip_rrect,
Clip::kAntiAlias);
595 use_mock_raster_cache();
596 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
598 const auto* clip_cache_item = layer->raster_cache_item();
600 layer->Preroll(preroll_context());
603 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
606 layer->Preroll(preroll_context());
608 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
611 layer->Preroll(preroll_context());
613 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
622 std::make_shared<PlatformViewLayer>(view_offset, view_size,
view_id);
628 auto embedder = MockViewEmbedder();
630 embedder.AddCanvas(&fake_overlay_builder);
631 preroll_context()->view_embedder = &embedder;
632 paint_context().view_embedder = &embedder;
634 clip->Preroll(preroll_context());
635 EXPECT_EQ(embedder.prerolled_views(), std::vector<int64_t>({view_id}));
637 clip->Paint(paint_context());
638 EXPECT_EQ(embedder.painted_views(), std::vector<int64_t>({view_id}));
void ClipRect(const DlRect &rect, DlClipOp clip_op=DlClipOp::kIntersect, bool is_aa=false) override
sk_sp< DisplayList > Build()
void DrawPath(const DlPath &path, const DlPaint &paint) override
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
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)
LayerTest ClipRRectLayerTest
@ kAntiAliasWithSaveLayer
impeller::RoundRect DlRoundRect
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 DlRect kGiantRect
static constexpr DlColor kYellow()
bool surface_needs_readback
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
constexpr Quad Transform(const Quad &quad) const
static RoundRect MakeRectXY(const Rect &rect, Scalar x_radius, Scalar y_radius)
static RoundRect MakeRect(const Rect &rect)
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...