25 EXPECT_DEATH_IF_SUPPORTED(
27 "clip_behavior != Clip::kNone");
33 layer->Preroll(preroll_context());
36 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
kGiantRect);
37 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
39 EXPECT_EQ(layer->paint_bounds(),
DlRect());
40 EXPECT_EQ(layer->child_paint_bounds(),
DlRect());
41 EXPECT_FALSE(layer->needs_painting(paint_context()));
43 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
44 "needs_painting\\(context\\)");
49 auto layer = std::make_shared<ClipRectLayer>(layer_bounds,
Clip::kHardEdge);
50 EXPECT_EQ(layer->paint_bounds(),
DlRect());
51 EXPECT_EQ(layer->child_paint_bounds(),
DlRect());
52 EXPECT_FALSE(layer->needs_painting(paint_context()));
54 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
55 "needs_painting\\(context\\)");
64 auto mock_layer = std::make_shared<MockLayer>(child_path);
65 auto layer = std::make_shared<ClipRectLayer>(layer_bounds,
Clip::kHardEdge);
66 layer->Add(mock_layer);
69 preroll_context()->state_stack.set_preroll_delegate(distant_bounds,
71 layer->Preroll(preroll_context());
74 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(), distant_bounds);
75 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
77 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
78 EXPECT_EQ(layer->paint_bounds(), child_bounds);
79 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
80 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
81 EXPECT_TRUE(layer->needs_painting(paint_context()));
82 EXPECT_EQ(mock_layer->parent_cull_rect(),
DlRect());
83 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
84 EXPECT_EQ(mock_layer->parent_mutators(),
85 std::vector({Mutator(layer_bounds)}));
87 auto mutator = paint_context().state_stack.save();
88 mutator.clipRect(distant_bounds,
false);
89 EXPECT_FALSE(mock_layer->needs_painting(paint_context()));
90 EXPECT_FALSE(layer->needs_painting(paint_context()));
91 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
92 "needs_painting\\(context\\)");
99 const DlRect device_cull_bounds =
105 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
106 auto layer = std::make_shared<ClipRectLayer>(clip_rect,
Clip::kHardEdge);
107 layer->Add(mock_layer);
109 auto clip_cull_rect = local_cull_bounds.Intersection(clip_rect);
110 ASSERT_TRUE(clip_cull_rect.has_value());
111 auto clip_layer_bounds = child_bounds.Intersection(clip_rect);
112 ASSERT_TRUE(clip_layer_bounds.has_value());
115 preroll_context()->state_stack.set_preroll_delegate(device_cull_bounds,
117 paint_context().canvas->ClipRect(device_cull_bounds);
118 paint_context().canvas->Transform(initial_matrix);
120 layer->Preroll(preroll_context());
122 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
124 EXPECT_EQ(preroll_context()->state_stack.local_cull_rect(),
126 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
128 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
129 EXPECT_EQ(layer->paint_bounds(), clip_layer_bounds.value());
130 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
131 EXPECT_EQ(mock_layer->parent_cull_rect(), clip_cull_rect.value());
132 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
133 EXPECT_EQ(mock_layer->parent_mutators(), std::vector({Mutator(clip_rect)}));
135 EXPECT_FALSE(layer->needs_painting(paint_context()));
136 EXPECT_FALSE(mock_layer->needs_painting(paint_context()));
147 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
148 auto layer = std::make_shared<ClipRectLayer>(layer_bounds,
Clip::kHardEdge);
149 layer->Add(mock_layer);
151 preroll_context()->state_stack.set_preroll_delegate(initial_matrix);
152 layer->Preroll(preroll_context());
155 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
kGiantRect);
156 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
158 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
159 EXPECT_EQ(layer->paint_bounds(), mock_layer->paint_bounds());
160 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
161 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
162 EXPECT_TRUE(layer->needs_painting(paint_context()));
163 EXPECT_EQ(mock_layer->parent_cull_rect(), layer_bounds);
164 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
165 EXPECT_EQ(mock_layer->parent_mutators(),
166 std::vector({Mutator(layer_bounds)}));
168 layer->Paint(display_list_paint_context());
169 DisplayListBuilder expected_builder;
171 expected_builder.Save();
173 expected_builder.ClipRect(layer_bounds);
175 expected_builder.DrawPath(child_path, child_paint);
178 expected_builder.Restore();
186 const DlRect device_cull_bounds =
192 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
193 auto layer = std::make_shared<ClipRectLayer>(clip_rect,
Clip::kHardEdge);
194 layer->Add(mock_layer);
196 auto clip_cull_rect = clip_rect.Intersection(local_cull_bounds);
197 ASSERT_TRUE(clip_cull_rect.has_value());
198 auto clip_layer_bounds = clip_rect.Intersection(child_bounds);
199 ASSERT_TRUE(clip_layer_bounds.has_value());
202 preroll_context()->state_stack.set_preroll_delegate(device_cull_bounds,
204 layer->Preroll(preroll_context());
207 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
209 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
211 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
212 EXPECT_EQ(layer->paint_bounds(), clip_layer_bounds.value());
213 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
214 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
215 EXPECT_TRUE(layer->needs_painting(paint_context()));
216 EXPECT_EQ(mock_layer->parent_cull_rect(), clip_cull_rect.value());
217 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
218 EXPECT_EQ(mock_layer->parent_mutators(), std::vector({Mutator(clip_rect)}));
220 layer->Paint(display_list_paint_context());
221 DisplayListBuilder expected_builder;
223 expected_builder.Save();
225 expected_builder.ClipRect(clip_rect);
227 expected_builder.DrawPath(child_path, child_paint);
230 expected_builder.Restore();
237 const std::shared_ptr<Layer>& child,
240 auto layer = std::make_shared<ClipRectLayer>(layer_bounds, clip_behavior);
241 if (child !=
nullptr) {
245 layer->Preroll(context);
258 std::shared_ptr<MockLayer> nochild;
259 auto reader = std::make_shared<MockLayer>(
path, paint);
260 reader->set_fake_reads_surface(
true);
261 auto nonreader = std::make_shared<MockLayer>(
path, paint);
266 EXPECT_FALSE(
ReadbackResult(context, save_layer, nochild,
false));
276 EXPECT_FALSE(
ReadbackResult(context, save_layer, nonreader,
false));
281 EXPECT_TRUE(
ReadbackResult(context, save_layer, nonreader,
true));
298 auto clip_rect_layer =
300 clip_rect_layer->Add(mock1);
303 PrerollContext* context = preroll_context();
304 clip_rect_layer->Preroll(context);
305 EXPECT_EQ(context->renderable_state_flags,
310 clip_rect_layer->Add(mock2);
314 clip_rect_layer->Preroll(context);
315 EXPECT_EQ(context->renderable_state_flags,
320 clip_rect_layer->Add(mock3);
324 clip_rect_layer->Preroll(context);
325 EXPECT_EQ(context->renderable_state_flags, 0);
329 auto clip_path_savelayer = std::make_shared<ClipRectLayer>(
331 clip_path_savelayer->Add(mock1);
332 clip_path_savelayer->Add(mock2);
335 clip_path_savelayer->Preroll(context);
339 clip_path_savelayer->Add(mock3);
340 clip_path_savelayer->Preroll(context);
350 auto clip_rect_bad_child =
352 clip_rect_bad_child->Add(mock1);
353 clip_rect_bad_child->Add(mock2);
356 clip_rect_bad_child->Preroll(context);
357 EXPECT_EQ(context->renderable_state_flags,
360 clip_rect_bad_child->Add(mock4);
364 clip_rect_bad_child->Preroll(context);
365 EXPECT_EQ(context->renderable_state_flags, 0);
370 auto clip_path_savelayer_bad_child = std::make_shared<ClipRectLayer>(
372 clip_path_savelayer_bad_child->Add(mock1);
373 clip_path_savelayer_bad_child->Add(mock2);
376 clip_path_savelayer_bad_child->Preroll(context);
380 clip_path_savelayer_bad_child->Add(mock4);
381 clip_path_savelayer_bad_child->Preroll(context);
392 auto clip_rect_layer =
394 clip_rect_layer->Add(mock1);
395 clip_rect_layer->Add(mock2);
399 PrerollContext* context = preroll_context();
400 clip_rect_layer->Preroll(context);
401 EXPECT_EQ(context->renderable_state_flags,
404 int opacity_alpha = 0x7F;
406 auto opacity_layer = std::make_shared<OpacityLayer>(opacity_alpha, offset);
407 opacity_layer->Add(clip_rect_layer);
408 opacity_layer->Preroll(context);
409 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
411 DisplayListBuilder expected_builder;
413 expected_builder.Save();
415 expected_builder.Translate(offset.x, offset.y);
417 expected_builder.Save();
420 expected_builder.DrawPath(path1,
DlPaint().setAlpha(opacity_alpha));
423 expected_builder.DrawPath(path2,
DlPaint().setAlpha(opacity_alpha));
425 expected_builder.Restore();
428 expected_builder.Restore();
431 opacity_layer->Paint(display_list_paint_context());
440 auto children_bounds = path1.GetBounds().Union(path2.GetBounds());
442 auto clip_rect_layer =
444 clip_rect_layer->Add(mock1);
445 clip_rect_layer->Add(mock2);
449 PrerollContext* context = preroll_context();
450 clip_rect_layer->Preroll(context);
453 int opacity_alpha = 0x7F;
455 auto opacity_layer = std::make_shared<OpacityLayer>(opacity_alpha, offset);
456 opacity_layer->Add(clip_rect_layer);
457 opacity_layer->Preroll(context);
458 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
460 DisplayListBuilder expected_builder;
462 expected_builder.Save();
464 expected_builder.Translate(offset.x, offset.y);
466 expected_builder.Save();
468 expected_builder.SaveLayer(children_bounds,
469 &
DlPaint().setAlpha(opacity_alpha));
471 expected_builder.DrawPath(path1,
DlPaint());
474 expected_builder.DrawPath(path2,
DlPaint());
476 expected_builder.Restore();
479 expected_builder.Restore();
482 opacity_layer->Paint(display_list_paint_context());
495 DlMatrix cache_ctm = initial_transform;
496 DisplayListBuilder cache_canvas;
499 use_mock_raster_cache();
500 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
502 const auto* clip_cache_item = layer->raster_cache_item();
504 layer->Preroll(preroll_context());
507 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
510 layer->Preroll(preroll_context());
512 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
515 layer->Preroll(preroll_context());
517 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)1);
518 EXPECT_EQ(clip_cache_item->cache_state(),
521 EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(),
522 cache_canvas, &paint));
530 std::make_shared<PlatformViewLayer>(view_offset, view_size,
view_id);
535 auto embedder = MockViewEmbedder();
536 DisplayListBuilder fake_overlay_builder;
537 embedder.AddCanvas(&fake_overlay_builder);
538 preroll_context()->view_embedder = &embedder;
539 paint_context().view_embedder = &embedder;
541 clip->Preroll(preroll_context());
542 EXPECT_EQ(embedder.prerolled_views(), std::vector<int64_t>({view_id}));
544 clip->Paint(paint_context());
545 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 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 ClipRectLayerTest
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
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 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...