| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/flow/testing/diff_context_test.h" |
| |
| namespace flutter { |
| namespace testing { |
| |
| TEST_F(DiffContextTest, ClipAlignment) { |
| MockLayerTree t1; |
| t1.root()->Add(CreateDisplayListLayer( |
| CreateDisplayList(DlRect::MakeLTRB(30, 30, 50, 50)))); |
| auto damage = DiffLayerTree(t1, MockLayerTree(), DlIRect(), 0, 0); |
| EXPECT_EQ(damage.frame_damage, DlIRect::MakeLTRB(30, 30, 50, 50)); |
| EXPECT_EQ(damage.buffer_damage, DlIRect::MakeLTRB(30, 30, 50, 50)); |
| |
| damage = DiffLayerTree(t1, MockLayerTree(), DlIRect(), 1, 1); |
| EXPECT_EQ(damage.frame_damage, DlIRect::MakeLTRB(30, 30, 50, 50)); |
| EXPECT_EQ(damage.buffer_damage, DlIRect::MakeLTRB(30, 30, 50, 50)); |
| |
| damage = DiffLayerTree(t1, MockLayerTree(), DlIRect(), 8, 1); |
| EXPECT_EQ(damage.frame_damage, DlIRect::MakeLTRB(24, 30, 56, 50)); |
| EXPECT_EQ(damage.buffer_damage, DlIRect::MakeLTRB(24, 30, 56, 50)); |
| |
| damage = DiffLayerTree(t1, MockLayerTree(), DlIRect(), 1, 8); |
| EXPECT_EQ(damage.frame_damage, DlIRect::MakeLTRB(30, 24, 50, 56)); |
| EXPECT_EQ(damage.buffer_damage, DlIRect::MakeLTRB(30, 24, 50, 56)); |
| |
| damage = DiffLayerTree(t1, MockLayerTree(), DlIRect(), 16, 16); |
| EXPECT_EQ(damage.frame_damage, DlIRect::MakeLTRB(16, 16, 64, 64)); |
| EXPECT_EQ(damage.buffer_damage, DlIRect::MakeLTRB(16, 16, 64, 64)); |
| } |
| |
| TEST_F(DiffContextTest, DisjointDamage) { |
| DlISize frame_size = DlISize(90, 90); |
| auto in_bounds_dl = CreateDisplayList(DlRect::MakeLTRB(30, 30, 50, 50)); |
| auto out_bounds_dl = CreateDisplayList(DlRect::MakeLTRB(100, 100, 120, 120)); |
| |
| // We need both DisplayLists to be non-empty. |
| ASSERT_FALSE(in_bounds_dl->bounds().isEmpty()); |
| ASSERT_FALSE(out_bounds_dl->bounds().isEmpty()); |
| |
| // We need the in_bounds DisplayList to be inside the frame size. |
| // We need the out_bounds DisplayList to be completely outside the frame. |
| ASSERT_TRUE(DlRect::MakeSize(frame_size).Contains(in_bounds_dl->GetBounds())); |
| ASSERT_FALSE(DlRect::MakeSize(frame_size) |
| .IntersectsWithRect(out_bounds_dl->GetBounds())); |
| |
| MockLayerTree t1(frame_size); |
| t1.root()->Add(CreateDisplayListLayer(in_bounds_dl)); |
| |
| MockLayerTree t2(frame_size); |
| // Include previous |
| t2.root()->Add(CreateDisplayListLayer(in_bounds_dl)); |
| // Add a new layer that is out of frame bounds |
| t2.root()->Add(CreateDisplayListLayer(out_bounds_dl)); |
| |
| // Cannot use DiffLayerTree because it implicitly adds a clip layer |
| // around the tree, but we want the out of bounds dl to not be pruned |
| // to test the intersection code inside layer::Diff/ComputeDamage |
| // damage = DiffLayerTree(t2, t1, DlIRect(), 0, 0); |
| |
| DiffContext dc(frame_size, t2.paint_region_map(), t1.paint_region_map(), true, |
| false); |
| t2.root()->Diff(&dc, t1.root()); |
| auto damage = dc.ComputeDamage(DlIRect(), 0, 0); |
| EXPECT_EQ(damage.frame_damage, DlIRect()); |
| EXPECT_EQ(damage.buffer_damage, DlIRect()); |
| } |
| |
| } // namespace testing |
| } // namespace flutter |