14#include "gtest/gtest.h"
26 EXPECT_DEATH_IF_SUPPORTED(
28 "clip_behavior != Clip::kNone");
34 layer->Preroll(preroll_context());
37 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
kGiantRect);
38 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
40 EXPECT_EQ(layer->paint_bounds(),
DlRect());
41 EXPECT_EQ(layer->child_paint_bounds(),
DlRect());
42 EXPECT_FALSE(layer->needs_painting(paint_context()));
44 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
45 "needs_painting\\(context\\)");
51 auto layer = std::make_shared<ClipPathLayer>(layer_path,
Clip::kHardEdge);
52 EXPECT_EQ(layer->paint_bounds(),
DlRect());
53 EXPECT_EQ(layer->child_paint_bounds(),
DlRect());
54 EXPECT_FALSE(layer->needs_painting(paint_context()));
56 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
57 "needs_painting\\(context\\)");
68 auto mock_layer = std::make_shared<MockLayer>(child_path);
69 auto layer = std::make_shared<ClipPathLayer>(layer_path,
Clip::kHardEdge);
70 layer->Add(mock_layer);
73 preroll_context()->state_stack.set_preroll_delegate(distant_bounds,
75 layer->Preroll(preroll_context());
78 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(), distant_bounds);
79 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
81 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
82 EXPECT_EQ(layer->paint_bounds(), child_bounds);
83 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
84 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
85 EXPECT_TRUE(layer->needs_painting(paint_context()));
86 EXPECT_EQ(mock_layer->parent_cull_rect(),
DlRect());
87 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
88 EXPECT_EQ(mock_layer->parent_mutators(), std::vector({Mutator(layer_path)}));
90 auto mutator = paint_context().state_stack.save();
91 mutator.clipRect(distant_bounds,
false);
92 EXPECT_FALSE(mock_layer->needs_painting(paint_context()));
93 EXPECT_FALSE(layer->needs_painting(paint_context()));
94 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
95 "needs_painting\\(context\\)");
102 const DlRect device_cull_bounds =
110 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
111 auto layer = std::make_shared<ClipPathLayer>(clip_path,
Clip::kHardEdge);
112 layer->Add(mock_layer);
114 auto clip_cull_rect = local_cull_bounds.Intersection(clip_bounds);
115 ASSERT_TRUE(clip_cull_rect.has_value());
116 auto clip_layer_bounds = child_bounds.
Intersection(clip_bounds);
117 ASSERT_TRUE(clip_layer_bounds.has_value());
120 preroll_context()->state_stack.set_preroll_delegate(device_cull_bounds,
122 paint_context().canvas->ClipRect(device_cull_bounds);
123 paint_context().canvas->Transform(initial_matrix);
125 layer->Preroll(preroll_context());
127 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
129 EXPECT_EQ(preroll_context()->state_stack.local_cull_rect(),
131 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
133 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
134 EXPECT_EQ(layer->paint_bounds(), clip_layer_bounds.value());
135 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
136 EXPECT_EQ(mock_layer->parent_cull_rect(), clip_cull_rect.value());
137 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
138 EXPECT_EQ(mock_layer->parent_mutators(), std::vector({Mutator(clip_path)}));
140 EXPECT_FALSE(layer->needs_painting(paint_context()));
141 EXPECT_FALSE(mock_layer->needs_painting(paint_context()));
154 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
155 auto layer = std::make_shared<ClipPathLayer>(layer_path,
Clip::kHardEdge);
156 layer->Add(mock_layer);
158 preroll_context()->state_stack.set_preroll_delegate(initial_matrix);
159 layer->Preroll(preroll_context());
162 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
kGiantRect);
163 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
165 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
166 EXPECT_EQ(layer->paint_bounds(), mock_layer->paint_bounds());
167 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
168 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
169 EXPECT_TRUE(layer->needs_painting(paint_context()));
170 EXPECT_EQ(mock_layer->parent_cull_rect(), layer_bounds);
171 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
172 EXPECT_EQ(mock_layer->parent_mutators(),
173 std::vector({Mutator(layer_bounds)}));
175 layer->Paint(display_list_paint_context());
178 expected_builder.
Save();
180 expected_builder.
ClipRect(layer_bounds);
182 expected_builder.
DrawPath(child_path, child_paint);
198 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
199 auto layer = std::make_shared<ClipPathLayer>(layer_path,
Clip::kHardEdge);
200 layer->Add(mock_layer);
202 preroll_context()->state_stack.set_preroll_delegate(initial_matrix);
203 layer->Preroll(preroll_context());
206 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
kGiantRect);
207 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
209 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
210 EXPECT_EQ(layer->paint_bounds(), mock_layer->paint_bounds());
211 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
212 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
213 EXPECT_TRUE(layer->needs_painting(paint_context()));
214 EXPECT_EQ(mock_layer->parent_cull_rect(), layer_bounds);
215 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
216 EXPECT_EQ(mock_layer->parent_mutators(),
217 std::vector({Mutator(DlRoundRect::MakeOval(layer_bounds))}));
219 layer->Paint(display_list_paint_context());
222 expected_builder.
Save();
226 expected_builder.
DrawPath(child_path, child_paint);
244 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
245 auto layer = std::make_shared<ClipPathLayer>(layer_path,
Clip::kHardEdge);
246 layer->Add(mock_layer);
251 EXPECT_TRUE(layer_path.
IsRoundRect(&converted_rrect));
253 preroll_context()->state_stack.set_preroll_delegate(initial_matrix);
254 layer->Preroll(preroll_context());
257 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
kGiantRect);
258 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
260 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
261 EXPECT_EQ(layer->paint_bounds(), mock_layer->paint_bounds());
262 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
263 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
264 EXPECT_TRUE(layer->needs_painting(paint_context()));
265 EXPECT_EQ(mock_layer->parent_cull_rect(), layer_bounds);
266 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
267 EXPECT_EQ(mock_layer->parent_mutators(),
268 std::vector({Mutator(converted_rrect)}));
270 layer->Paint(display_list_paint_context());
271 EXPECT_EQ(display_list()->GetOpType(1u),
272 DisplayListOpType::kClipIntersectRoundRect);
275 expected_builder.
Save();
279 expected_builder.
DrawPath(child_path, child_paint);
296 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
297 auto layer = std::make_shared<ClipPathLayer>(layer_path,
Clip::kHardEdge);
298 layer->Add(mock_layer);
300 preroll_context()->state_stack.set_preroll_delegate(initial_matrix);
301 layer->Preroll(preroll_context());
304 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
kGiantRect);
305 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
307 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
308 EXPECT_EQ(layer->paint_bounds(), mock_layer->paint_bounds());
309 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
310 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
311 EXPECT_TRUE(layer->needs_painting(paint_context()));
312 EXPECT_EQ(mock_layer->parent_cull_rect(), layer_bounds);
313 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
314 EXPECT_EQ(mock_layer->parent_mutators(), std::vector({Mutator(layer_path)}));
316 layer->Paint(display_list_paint_context());
319 expected_builder.
Save();
321 expected_builder.
ClipPath(layer_path);
323 expected_builder.
DrawPath(child_path, child_paint);
334 const DlRect device_cull_bounds =
343 auto mock_layer = std::make_shared<MockLayer>(child_path, child_paint);
344 auto layer = std::make_shared<ClipPathLayer>(clip_path,
Clip::kHardEdge);
345 layer->Add(mock_layer);
347 auto clip_cull_rect = local_cull_bounds.Intersection(clip_bounds);
348 ASSERT_TRUE(clip_cull_rect.has_value());
349 auto clip_layer_bounds = child_bounds.
Intersection(clip_bounds);
350 ASSERT_TRUE(clip_layer_bounds.has_value());
353 preroll_context()->state_stack.set_preroll_delegate(device_cull_bounds,
355 layer->Preroll(preroll_context());
358 EXPECT_EQ(preroll_context()->state_stack.device_cull_rect(),
360 EXPECT_EQ(preroll_context()->state_stack.local_cull_rect(),
362 EXPECT_TRUE(preroll_context()->state_stack.is_empty());
364 EXPECT_EQ(mock_layer->paint_bounds(), child_bounds);
365 EXPECT_EQ(layer->paint_bounds(), clip_layer_bounds.value());
366 EXPECT_EQ(layer->child_paint_bounds(), child_bounds);
367 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
368 EXPECT_TRUE(layer->needs_painting(paint_context()));
369 EXPECT_EQ(mock_layer->parent_cull_rect(), clip_cull_rect.value());
370 EXPECT_EQ(mock_layer->parent_matrix(), initial_matrix);
371 EXPECT_EQ(mock_layer->parent_mutators(), std::vector({Mutator(clip_path)}));
373 layer->Paint(display_list_paint_context());
376 expected_builder.
Save();
378 expected_builder.
ClipPath(clip_path);
380 expected_builder.
DrawPath(child_path, child_paint);
390 const std::shared_ptr<Layer>& child,
394 auto layer = std::make_shared<ClipPathLayer>(layer_path, clip_behavior);
395 if (child !=
nullptr) {
399 layer->Preroll(context);
412 std::shared_ptr<MockLayer> nochild;
413 auto reader = std::make_shared<MockLayer>(
path, paint);
414 reader->set_fake_reads_surface(
true);
415 auto nonreader = std::make_shared<MockLayer>(
path, paint);
420 EXPECT_FALSE(
ReadbackResult(context, save_layer, nochild,
false));
430 EXPECT_FALSE(
ReadbackResult(context, save_layer, nonreader,
false));
435 EXPECT_TRUE(
ReadbackResult(context, save_layer, nonreader,
true));
453 auto clip_path_layer =
455 clip_path_layer->Add(mock1);
458 PrerollContext* context = preroll_context();
459 clip_path_layer->Preroll(context);
460 EXPECT_EQ(context->renderable_state_flags,
465 clip_path_layer->Add(mock2);
469 clip_path_layer->Preroll(context);
470 EXPECT_EQ(context->renderable_state_flags,
475 clip_path_layer->Add(mock3);
479 clip_path_layer->Preroll(context);
480 EXPECT_EQ(context->renderable_state_flags, 0);
484 auto clip_path_savelayer = std::make_shared<ClipPathLayer>(
486 clip_path_savelayer->Add(mock1);
487 clip_path_savelayer->Add(mock2);
490 clip_path_savelayer->Preroll(context);
494 clip_path_savelayer->Add(mock3);
495 clip_path_savelayer->Preroll(context);
505 auto clip_path_bad_child =
507 clip_path_bad_child->Add(mock1);
508 clip_path_bad_child->Add(mock2);
511 clip_path_bad_child->Preroll(context);
512 EXPECT_EQ(context->renderable_state_flags,
515 clip_path_bad_child->Add(mock4);
519 clip_path_bad_child->Preroll(context);
520 EXPECT_EQ(context->renderable_state_flags, 0);
525 auto clip_path_savelayer_bad_child = std::make_shared<ClipPathLayer>(
527 clip_path_savelayer_bad_child->Add(mock1);
528 clip_path_savelayer_bad_child->Add(mock2);
531 clip_path_savelayer_bad_child->Preroll(context);
535 clip_path_savelayer_bad_child->Add(mock4);
536 clip_path_savelayer_bad_child->Preroll(context);
548 auto clip_path_layer =
550 clip_path_layer->Add(mock1);
551 clip_path_layer->Add(mock2);
556 clip_path_layer->Preroll(context);
560 int opacity_alpha = 0x7F;
562 auto opacity_layer = std::make_shared<OpacityLayer>(opacity_alpha, offset);
563 opacity_layer->Add(clip_path_layer);
564 opacity_layer->Preroll(context);
565 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
569 expected_builder.
Save();
573 expected_builder.
Save();
587 opacity_layer->Paint(display_list_paint_context());
596 auto children_bounds = path1.GetBounds().Union(path2.GetBounds());
599 auto clip_path_layer = std::make_shared<ClipPathLayer>(
601 clip_path_layer->Add(mock1);
602 clip_path_layer->Add(mock2);
607 clip_path_layer->Preroll(context);
610 int opacity_alpha = 0x7F;
612 auto opacity_layer = std::make_shared<OpacityLayer>(opacity_alpha, offset);
613 opacity_layer->Add(clip_path_layer);
614 opacity_layer->Preroll(context);
615 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
619 expected_builder.
Save();
623 expected_builder.
Save();
625 expected_builder.
SaveLayer(children_bounds,
626 &
DlPaint().setAlpha(opacity_alpha));
639 opacity_layer->Paint(display_list_paint_context());
648 auto layer = std::make_shared<ClipPathLayer>(layer_clip,
653 DlMatrix cache_ctm = initial_transform;
657 use_mock_raster_cache();
658 preroll_context()->state_stack.set_preroll_delegate(initial_transform);
660 const auto* clip_cache_item = layer->raster_cache_item();
662 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
664 layer->Preroll(preroll_context());
667 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
670 layer->Preroll(preroll_context());
672 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)0);
675 layer->Preroll(preroll_context());
677 EXPECT_EQ(raster_cache()->GetLayerCachedEntriesCount(), (
size_t)1);
678 EXPECT_EQ(clip_cache_item->cache_state(),
681 EXPECT_TRUE(raster_cache()->Draw(clip_cache_item->GetId().value(),
682 cache_canvas, &paint));
690 std::make_shared<PlatformViewLayer>(view_offset, view_size,
view_id);
693 auto clip = std::make_shared<ClipPathLayer>(layer_clip,
699 embedder.AddCanvas(&fake_overlay_builder);
700 preroll_context()->view_embedder = &embedder;
701 paint_context().view_embedder = &embedder;
703 clip->Preroll(preroll_context());
704 EXPECT_EQ(embedder.prerolled_views(), std::vector<int64_t>({view_id}));
706 clip->Paint(paint_context());
707 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
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 ClipRoundRect(const DlRoundRect &rrect, DlClipOp clip_op=DlClipOp::kIntersect, bool is_aa=false) override
void Translate(DlScalar tx, DlScalar ty) override
sk_sp< DisplayList > Build()
void DrawPath(const DlPath &path, const DlPaint &paint) override
void ClipPath(const DlPath &path, DlClipOp clip_op=DlClipOp::kIntersect, bool is_aa=false) override
void Transform(const DlMatrix &matrix) override
static DlPath MakeRectLTRB(DlScalar left, DlScalar top, DlScalar right, DlScalar bottom)
static DlPath MakeRoundRect(const DlRoundRect &rrect)
static DlPath MakeRect(const DlRect &rect)
bool IsRoundRect(DlRoundRect *rrect=nullptr) const
static DlPath MakeOvalLTRB(DlScalar left, DlScalar top, DlScalar right, DlScalar bottom)
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 ClipPathLayerTest
@ kAntiAliasWithSaveLayer
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
int renderable_state_flags
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
static RoundRect MakeOval(const Rect &rect)
static RoundRect MakeRectXY(const Rect &rect, Scalar x_radius, Scalar y_radius)
constexpr std::optional< TRect > Intersection(const TRect &o) const
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 > Expand(T left, T top, T right, T bottom) const
Returns a rectangle with expanded edges. Negative expansion results in shrinking.