19 auto layer = std::make_shared<TransformLayer>(
DlMatrix());
21 layer->Preroll(preroll_context());
22 EXPECT_EQ(layer->paint_bounds(),
DlRect());
23 EXPECT_EQ(layer->child_paint_bounds(),
DlRect());
24 EXPECT_FALSE(layer->needs_painting(paint_context()));
26 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
27 "needs_painting\\(context\\)");
32 auto mock_layer = std::make_shared<MockLayer>(child_path,
DlPaint());
33 auto layer = std::make_shared<TransformLayer>(
DlMatrix());
34 layer->Add(mock_layer);
36 EXPECT_DEATH_IF_SUPPORTED(layer->Paint(paint_context()),
37 "needs_painting\\(context\\)");
44 auto mock_layer = std::make_shared<MockLayer>(child_path,
DlPaint());
45 auto layer = std::make_shared<TransformLayer>(
DlMatrix());
46 layer->Add(mock_layer);
48 preroll_context()->state_stack.set_preroll_delegate(cull_rect);
49 layer->Preroll(preroll_context());
50 EXPECT_EQ(mock_layer->paint_bounds(), child_path.
GetBounds());
51 EXPECT_EQ(layer->paint_bounds(), mock_layer->paint_bounds());
52 EXPECT_EQ(layer->child_paint_bounds(), mock_layer->paint_bounds());
53 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
54 EXPECT_TRUE(layer->needs_painting(paint_context()));
55 EXPECT_EQ(mock_layer->parent_matrix(),
DlMatrix());
56 EXPECT_EQ(mock_layer->parent_cull_rect(), cull_rect);
57 EXPECT_EQ(mock_layer->parent_mutators().stack_count(), 0u);
60 layer->Paint(display_list_paint_context());
63 expected_builder.
Save();
82 EXPECT_TRUE(layer_transform.IsInvertible());
85 auto mock_layer = std::make_shared<MockLayer>(child_path,
DlPaint());
86 auto layer = std::make_shared<TransformLayer>(layer_transform);
87 layer->Add(mock_layer);
89 preroll_context()->state_stack.set_preroll_delegate(device_cull_rect,
91 layer->Preroll(preroll_context());
92 EXPECT_EQ(mock_layer->paint_bounds(), child_path.
GetBounds());
93 EXPECT_EQ(layer->paint_bounds(),
94 mock_layer->paint_bounds().TransformAndClipBounds(layer_transform));
95 EXPECT_EQ(layer->child_paint_bounds(), mock_layer->paint_bounds());
96 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
97 EXPECT_TRUE(layer->needs_painting(paint_context()));
98 EXPECT_EQ(mock_layer->parent_matrix(), initial_transform * layer_transform);
99 EXPECT_EQ(mock_layer->parent_cull_rect(),
100 local_cull_rect.TransformAndClipBounds(inverse_layer_transform));
101 EXPECT_EQ(mock_layer->parent_mutators(),
102 std::vector({Mutator(layer_transform)}));
104 layer->Paint(display_list_paint_context());
105 DisplayListBuilder expected_builder;
107 expected_builder.Save();
109 expected_builder.Transform(layer_transform);
111 expected_builder.DrawPath(child_path,
DlPaint());
114 expected_builder.Restore();
132 auto mock_layer = std::make_shared<MockLayer>(child_path,
DlPaint());
133 auto layer = std::make_shared<TransformLayer>(layer_transform);
134 layer->Add(mock_layer);
136 preroll_context()->state_stack.set_preroll_delegate(device_cull_rect,
138 layer->Preroll(preroll_context());
139 EXPECT_EQ(mock_layer->paint_bounds(), child_path.
GetBounds());
140 EXPECT_EQ(layer->paint_bounds(),
141 mock_layer->paint_bounds().TransformAndClipBounds(layer_transform));
142 EXPECT_EQ(layer->child_paint_bounds(), mock_layer->paint_bounds());
143 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
144 EXPECT_TRUE(layer->needs_painting(paint_context()));
145 EXPECT_EQ(mock_layer->parent_matrix(), initial_transform * layer_transform);
151 DlRect parent_cull_rect = mock_layer->parent_cull_rect();
152 DlRect expect_parent_cull_rect =
154 EXPECT_FLOAT_EQ(parent_cull_rect.
GetLeft(),
155 expect_parent_cull_rect.
GetLeft());
156 EXPECT_FLOAT_EQ(parent_cull_rect.
GetTop(),
157 expect_parent_cull_rect.
GetTop());
158 EXPECT_FLOAT_EQ(parent_cull_rect.
GetRight(),
159 expect_parent_cull_rect.
GetRight());
160 EXPECT_FLOAT_EQ(parent_cull_rect.
GetBottom(),
163 EXPECT_EQ(mock_layer->parent_mutators(),
164 std::vector({Mutator(layer_transform)}));
166 layer->Paint(display_list_paint_context());
169 expected_builder.
Save();
171 expected_builder.
Transform(layer_transform);
189 EXPECT_TRUE(layer1_transform.IsInvertible());
190 EXPECT_TRUE(layer2_transform.IsInvertible());
194 auto mock_layer = std::make_shared<MockLayer>(child_path,
DlPaint());
195 auto layer1 = std::make_shared<TransformLayer>(layer1_transform);
196 auto layer2 = std::make_shared<TransformLayer>(layer2_transform);
198 layer2->Add(mock_layer);
200 preroll_context()->state_stack.set_preroll_delegate(device_cull_rect,
202 layer1->Preroll(preroll_context());
203 EXPECT_EQ(mock_layer->paint_bounds(), child_path.
GetBounds());
205 layer2->paint_bounds(),
206 mock_layer->paint_bounds().TransformAndClipBounds(layer2_transform));
207 EXPECT_EQ(layer2->child_paint_bounds(), mock_layer->paint_bounds());
208 EXPECT_EQ(layer1->paint_bounds(),
209 layer2->paint_bounds().TransformAndClipBounds(layer1_transform));
210 EXPECT_EQ(layer1->child_paint_bounds(), layer2->paint_bounds());
211 EXPECT_TRUE(mock_layer->needs_painting(paint_context()));
212 EXPECT_TRUE(layer2->needs_painting(paint_context()));
213 EXPECT_TRUE(layer1->needs_painting(paint_context()));
214 EXPECT_EQ(mock_layer->parent_matrix(),
215 (initial_transform * layer1_transform) * layer2_transform);
216 EXPECT_EQ(mock_layer->parent_cull_rect(),
217 local_cull_rect.TransformAndClipBounds(inverse_layer1_transform)
218 .TransformAndClipBounds(inverse_layer2_transform));
220 mock_layer->parent_mutators(),
221 std::vector({Mutator(layer1_transform), Mutator(layer2_transform)}));
223 layer1->Paint(display_list_paint_context());
224 DisplayListBuilder expected_builder;
226 expected_builder.Save();
228 expected_builder.Transform(layer1_transform);
230 expected_builder.Save();
232 expected_builder.Transform(layer2_transform);
234 expected_builder.DrawPath(child_path,
DlPaint());
237 expected_builder.Restore();
240 expected_builder.Restore();
254 EXPECT_TRUE(layer2_transform.IsInvertible());
260 auto mock_layer1 = std::make_shared<MockLayer>(child_path, child_paint1);
261 auto mock_layer2 = std::make_shared<MockLayer>(child_path, child_paint2);
262 auto layer1 = std::make_shared<TransformLayer>(layer1_transform);
263 auto layer2 = std::make_shared<TransformLayer>(layer2_transform);
264 layer1->Add(mock_layer1);
266 layer2->Add(mock_layer2);
268 preroll_context()->state_stack.set_preroll_delegate(device_cull_rect,
270 layer1->Preroll(preroll_context());
271 DlRect layer1_child_bounds =
272 layer2->paint_bounds().
Union(mock_layer1->paint_bounds());
273 DlRect expected_layer1_bounds =
276 EXPECT_EQ(mock_layer2->paint_bounds(), child_path.
GetBounds());
278 layer2->paint_bounds(),
279 mock_layer2->paint_bounds().TransformAndClipBounds(layer2_transform));
280 EXPECT_EQ(layer2->child_paint_bounds(), mock_layer2->paint_bounds());
281 EXPECT_EQ(mock_layer1->paint_bounds(), child_path.
GetBounds());
282 EXPECT_EQ(layer1->paint_bounds(), expected_layer1_bounds);
283 EXPECT_EQ(layer1->child_paint_bounds(), layer1_child_bounds);
284 EXPECT_TRUE(mock_layer2->needs_painting(paint_context()));
285 EXPECT_TRUE(layer2->needs_painting(paint_context()));
286 EXPECT_TRUE(mock_layer1->needs_painting(paint_context()));
287 EXPECT_TRUE(layer1->needs_painting(paint_context()));
288 EXPECT_EQ(mock_layer1->parent_matrix(), initial_transform * layer1_transform);
289 EXPECT_EQ(mock_layer2->parent_matrix(),
290 (initial_transform * layer1_transform) * layer2_transform);
291 EXPECT_EQ(mock_layer1->parent_cull_rect(),
292 local_cull_rect.TransformAndClipBounds(inverse_layer1_transform));
293 EXPECT_EQ(mock_layer2->parent_cull_rect(),
294 local_cull_rect.TransformAndClipBounds(inverse_layer1_transform)
295 .TransformAndClipBounds(inverse_layer2_transform));
296 EXPECT_EQ(mock_layer1->parent_mutators(),
297 std::vector({Mutator(layer1_transform)}));
299 mock_layer2->parent_mutators(),
300 std::vector({Mutator(layer1_transform), Mutator(layer2_transform)}));
302 layer1->Paint(display_list_paint_context());
305 expected_builder.
Save();
307 expected_builder.
Transform(layer1_transform);
309 expected_builder.
DrawPath(child_path, child_paint1);
312 expected_builder.
Save();
314 expected_builder.
Transform(layer2_transform);
316 expected_builder.
DrawPath(child_path, child_paint2);
332 transform1->Add(mock1);
335 PrerollContext* context = preroll_context();
336 transform1->Preroll(context);
337 EXPECT_EQ(context->renderable_state_flags,
342 transform1->Add(mock2);
346 transform1->Preroll(context);
347 EXPECT_EQ(context->renderable_state_flags,
352 transform1->Add(mock3);
356 transform1->Preroll(context);
357 EXPECT_EQ(context->renderable_state_flags, 0);
361 transform2->Add(mock1);
362 transform2->Add(mock2);
365 transform2->Preroll(context);
366 EXPECT_EQ(context->renderable_state_flags,
371 transform2->Add(mock4);
375 transform2->Preroll(context);
376 EXPECT_EQ(context->renderable_state_flags, 0);
385 auto transform_layer = std::make_shared<TransformLayer>(
transform);
386 transform_layer->Add(mock1);
387 transform_layer->Add(mock2);
391 PrerollContext* context = preroll_context();
392 transform_layer->Preroll(context);
393 EXPECT_EQ(context->renderable_state_flags,
396 uint8_t opacity_alpha = 0x7F;
398 auto opacity_layer = std::make_shared<OpacityLayer>(opacity_alpha, offset);
399 opacity_layer->Add(transform_layer);
400 opacity_layer->Preroll(context);
401 EXPECT_TRUE(opacity_layer->children_can_accept_opacity());
403 DisplayListBuilder expected_builder;
405 expected_builder.Save();
407 expected_builder.Translate(offset.x, offset.y);
409 expected_builder.Save();
412 expected_builder.DrawPath(path1,
DlPaint().setAlpha(opacity_alpha));
415 expected_builder.DrawPath(path2,
DlPaint().setAlpha(opacity_alpha));
417 expected_builder.Restore();
420 expected_builder.Restore();
423 opacity_layer->Paint(display_list_paint_context());
431 auto m1 = std::make_shared<MockLayer>(path1);
446 transform2->AssignOldLayer(transform1.get());
451 damage = DiffLayerTree(t2, t1);
457 transform3->AssignOldLayer(transform2.get());
462 damage = DiffLayerTree(t3, t2);
463 EXPECT_EQ(damage.frame_damage,
DlIRect());
468 auto m1 = CreateContainerLayer(std::make_shared<MockLayer>(path1));
469 auto m2 = CreateContainerLayer(std::make_shared<MockLayer>(path1));
470 auto m3 = CreateContainerLayer(std::make_shared<MockLayer>(path1));
477 transform1_1->Add(m1);
478 transform1->Add(transform1_1);
482 transform1_2->Add(m2);
483 transform1->Add(transform1_2);
487 transform1_3->Add(m3);
488 transform1->Add(transform1_3);
501 transform2_1->Add(m1);
502 transform2_1->AssignOldLayer(transform1_1.get());
503 transform2->Add(transform2_1);
508 transform2_2->Add(m2);
509 transform2_2->AssignOldLayer(transform1_2.get());
510 transform2->Add(transform2_2);
514 transform2_3->Add(m3);
515 transform2_3->AssignOldLayer(transform1_3.get());
516 transform2->Add(transform2_3);
521 damage = DiffLayerTree(l2, l1);
529 transform2->AssignOldLayer(transform1.get());
530 damage = DiffLayerTree(l2, l1);
virtual void Add(std::shared_ptr< Layer > layer)
sk_sp< DisplayList > Build()
void DrawPath(const DlPath &path, const DlPaint &paint) override
void Transform(const DlMatrix &matrix) override
static DlPath MakeRectLTRB(DlScalar left, DlScalar top, DlScalar right, DlScalar bottom)
DlRect GetBounds() const override
static constexpr int kCallerCanApplyOpacity
static std::shared_ptr< MockLayer > Make(const DlPath &path, DlPaint paint=DlPaint())
static std::shared_ptr< MockLayer > MakeOpacityCompatible(const DlPath &path)
TEST_F(DisplayListTest, Defaults)
LayerTestBase<::testing::Test > LayerTest
LayerTest TransformLayerTest
bool DisplayListsEQ_Verbose(const DisplayList *a, const DisplayList *b)
impeller::Matrix DlMatrix
impeller::Degrees DlDegrees
static constexpr DlColor kBlue()
static constexpr DlColor kGreen()
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
bool IsInvertible() const
static Matrix MakeRotationY(Radians r)
static constexpr Matrix MakeScale(const Vector3 &s)
static Matrix MakeRotationX(Radians r)
constexpr auto GetBottom() const
constexpr auto GetTop() const
constexpr TRect Union(const TRect &o) const
constexpr auto GetLeft() const
constexpr auto GetRight() 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...
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)