Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(350)

Unified Diff: cc/resources/picture_pile_unittest.cc

Issue 504513002: cc: Fix CanRaster dcheck failures ONCE AND FOR ALL. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: canraster: evenbetter Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/resources/picture_pile_unittest.cc
diff --git a/cc/resources/picture_pile_unittest.cc b/cc/resources/picture_pile_unittest.cc
index ddf45deb1f7cfcefd6b1b3f0ee674407e2cbb2c5..df70e8e5f4872a646097ae4a3e31e32b880b40db 100644
--- a/cc/resources/picture_pile_unittest.cc
+++ b/cc/resources/picture_pile_unittest.cc
@@ -36,9 +36,9 @@ class TestPicturePile : public PicturePile {
virtual ~TestPicturePile() {}
};
-class PicturePileTest : public testing::Test {
+class PicturePileTestBase {
public:
- PicturePileTest()
+ PicturePileTestBase()
: pile_(new TestPicturePile()),
background_color_(SK_ColorBLUE),
min_scale_(0.125),
@@ -91,6 +91,8 @@ class PicturePileTest : public testing::Test {
bool contents_opaque_;
};
+class PicturePileTest : public PicturePileTestBase, public testing::Test {};
+
TEST_F(PicturePileTest, SmallInvalidateInflated) {
// Invalidate something inside a tile.
Region invalidate_rect(gfx::Rect(50, 50, 1, 1));
@@ -384,14 +386,48 @@ TEST_F(PicturePileTest, InvalidationOutsideRecordingRect) {
EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
}
-TEST_F(PicturePileTest, ResizePileOutsideInterestRect) {
+enum Corner {
+ TOP_LEFT,
+ TOP_RIGHT,
+ BOTTOM_LEFT,
+ BOTTOM_RIGHT,
+};
+
+class PicturePileResizeCornerTest : public PicturePileTestBase,
+ public testing::TestWithParam<Corner> {
+ protected:
+ static gfx::Rect CornerSinglePixelRect(Corner corner, const gfx::Size& s) {
+ switch (corner) {
+ case TOP_LEFT:
+ return gfx::Rect(0, 0, 1, 1);
+ case TOP_RIGHT:
+ return gfx::Rect(s.width() - 1, 0, 1, 1);
+ case BOTTOM_LEFT:
+ return gfx::Rect(0, s.height() - 1, 1, 1);
+ case BOTTOM_RIGHT:
+ return gfx::Rect(s.width() - 1, s.height() - 1, 1, 1);
+ }
+ NOTREACHED();
+ return gfx::Rect();
+ }
+};
+
+TEST_P(PicturePileResizeCornerTest, ResizePileOutsideInterestRect) {
+ Corner corner = GetParam();
+
// This size chosen to be larger than the interest rect size, which is
// at least kPixelDistanceToRecord * 2 in each dimension.
int tile_size = 100000;
- gfx::Size base_tiling_size(5 * tile_size, 5 * tile_size);
- gfx::Size grow_down_tiling_size(5 * tile_size, 7 * tile_size);
- gfx::Size grow_right_tiling_size(7 * tile_size, 5 * tile_size);
- gfx::Size grow_both_tiling_size(7 * tile_size, 7 * tile_size);
+ // The small number subtracted keeps the last tile in each axis larger than
+ // the interest rect also.
+ int offset = -100;
+ gfx::Size base_tiling_size(6 * tile_size + offset, 6 * tile_size + offset);
+ gfx::Size grow_down_tiling_size(6 * tile_size + offset,
+ 8 * tile_size + offset);
+ gfx::Size grow_right_tiling_size(8 * tile_size + offset,
+ 6 * tile_size + offset);
+ gfx::Size grow_both_tiling_size(8 * tile_size + offset,
+ 8 * tile_size + offset);
Region invalidation;
Region expected_invalidation;
@@ -412,13 +448,15 @@ TEST_F(PicturePileTest, ResizePileOutsideInterestRect) {
}
UpdateAndExpandInvalidation(
- &invalidation, grow_down_tiling_size, gfx::Rect(1, 1));
+ &invalidation,
+ grow_down_tiling_size,
+ CornerSinglePixelRect(corner, grow_down_tiling_size));
// We should have lost the recordings in the bottom row.
EXPECT_EQ(6, pile_->tiling().num_tiles_x());
EXPECT_EQ(8, pile_->tiling().num_tiles_y());
- for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
- for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+ for (int i = 0; i < 6; ++i) {
+ for (int j = 0; j < 6; ++j) {
TestPicturePile::PictureMapKey key(i, j);
TestPicturePile::PictureMap& map = pile_->picture_map();
TestPicturePile::PictureMap::iterator it = map.find(key);
@@ -433,7 +471,9 @@ TEST_F(PicturePileTest, ResizePileOutsideInterestRect) {
invalidation.Clear();
UpdateWholePile();
- UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1));
+ UpdateAndExpandInvalidation(&invalidation,
+ base_tiling_size,
+ CornerSinglePixelRect(corner, base_tiling_size));
// We should have lost the recordings that are now outside the tiling only.
EXPECT_EQ(6, pile_->tiling().num_tiles_x());
@@ -454,13 +494,15 @@ TEST_F(PicturePileTest, ResizePileOutsideInterestRect) {
UpdateWholePile();
UpdateAndExpandInvalidation(
- &invalidation, grow_right_tiling_size, gfx::Rect(1, 1));
+ &invalidation,
+ grow_right_tiling_size,
+ CornerSinglePixelRect(corner, grow_right_tiling_size));
// We should have lost the recordings in the right column.
EXPECT_EQ(8, pile_->tiling().num_tiles_x());
EXPECT_EQ(6, pile_->tiling().num_tiles_y());
- for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
- for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+ for (int i = 0; i < 6; ++i) {
+ for (int j = 0; j < 6; ++j) {
TestPicturePile::PictureMapKey key(i, j);
TestPicturePile::PictureMap& map = pile_->picture_map();
TestPicturePile::PictureMap::iterator it = map.find(key);
@@ -475,7 +517,9 @@ TEST_F(PicturePileTest, ResizePileOutsideInterestRect) {
invalidation.Clear();
UpdateWholePile();
- UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1));
+ UpdateAndExpandInvalidation(&invalidation,
+ base_tiling_size,
+ CornerSinglePixelRect(corner, base_tiling_size));
// We should have lost the recordings that are now outside the tiling only.
EXPECT_EQ(6, pile_->tiling().num_tiles_x());
@@ -496,13 +540,15 @@ TEST_F(PicturePileTest, ResizePileOutsideInterestRect) {
UpdateWholePile();
UpdateAndExpandInvalidation(
- &invalidation, grow_both_tiling_size, gfx::Rect(1, 1));
+ &invalidation,
+ grow_both_tiling_size,
+ CornerSinglePixelRect(corner, grow_both_tiling_size));
// We should have lost the recordings in the right column and bottom row.
EXPECT_EQ(8, pile_->tiling().num_tiles_x());
EXPECT_EQ(8, pile_->tiling().num_tiles_y());
- for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
- for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) {
+ for (int i = 0; i < 6; ++i) {
+ for (int j = 0; j < 6; ++j) {
TestPicturePile::PictureMapKey key(i, j);
TestPicturePile::PictureMap& map = pile_->picture_map();
TestPicturePile::PictureMap::iterator it = map.find(key);
@@ -539,14 +585,22 @@ TEST_F(PicturePileTest, ResizePileOutsideInterestRect) {
invalidation.Clear();
}
-TEST_F(PicturePileTest, SmallResizePileOutsideInterestRect) {
+TEST_P(PicturePileResizeCornerTest, SmallResizePileOutsideInterestRect) {
+ Corner corner = GetParam();
+
// This size chosen to be larger than the interest rect size, which is
// at least kPixelDistanceToRecord * 2 in each dimension.
int tile_size = 100000;
- gfx::Size base_tiling_size(5 * tile_size, 5 * tile_size);
- gfx::Size grow_down_tiling_size(5 * tile_size, 5 * tile_size + 5);
- gfx::Size grow_right_tiling_size(5 * tile_size + 5, 5 * tile_size);
- gfx::Size grow_both_tiling_size(5 * tile_size + 5, 5 * tile_size + 5);
+ // The small number subtracted keeps the last tile in each axis larger than
+ // the interest rect also.
+ int offset = -100;
+ gfx::Size base_tiling_size(6 * tile_size + offset, 6 * tile_size + offset);
+ gfx::Size grow_down_tiling_size(6 * tile_size + offset,
+ 6 * tile_size + offset + 5);
+ gfx::Size grow_right_tiling_size(6 * tile_size + offset + 5,
+ 6 * tile_size + offset);
+ gfx::Size grow_both_tiling_size(6 * tile_size + offset + 5,
+ 6 * tile_size + offset + 5);
Region invalidation;
Region expected_invalidation;
@@ -567,9 +621,12 @@ TEST_F(PicturePileTest, SmallResizePileOutsideInterestRect) {
}
UpdateAndExpandInvalidation(
- &invalidation, grow_down_tiling_size, gfx::Rect(1, 1));
+ &invalidation,
+ grow_down_tiling_size,
+ CornerSinglePixelRect(corner, grow_down_tiling_size));
- // We should have lost the recordings in the bottom row.
+ // We should have lost the recordings in the bottom row that do not intersect
+ // the interest rect.
EXPECT_EQ(6, pile_->tiling().num_tiles_x());
EXPECT_EQ(6, pile_->tiling().num_tiles_y());
for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
@@ -577,18 +634,53 @@ TEST_F(PicturePileTest, SmallResizePileOutsideInterestRect) {
TestPicturePile::PictureMapKey key(i, j);
TestPicturePile::PictureMap& map = pile_->picture_map();
TestPicturePile::PictureMap::iterator it = map.find(key);
- EXPECT_EQ(j < 5, it != map.end() && it->second.GetPicture());
+ bool expect_tile;
+ switch (corner) {
+ case TOP_LEFT:
+ case TOP_RIGHT:
+ expect_tile = j < 5;
+ break;
+ case BOTTOM_LEFT:
+ // The interest rect in the bottom left tile means we'll record it.
+ expect_tile = j < 5 || (j == 5 && i == 0);
+ break;
+ case BOTTOM_RIGHT:
+ // The interest rect in the bottom right tile means we'll record it.
+ expect_tile = j < 5 || (j == 5 && i == 5);
+ break;
+ }
+ EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture());
}
}
- // We invalidated the bottom row.
- expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(0, 5),
- pile_->tiling().TileBounds(5, 5));
+ // We invalidated the bottom row outside the new interest rect. The tile that
+ // insects the interest rect in invalidated only on its new pixels.
+ switch (corner) {
+ case TOP_LEFT:
+ case TOP_RIGHT:
+ expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(0, 5),
+ pile_->tiling().TileBounds(5, 5));
+ break;
+ case BOTTOM_LEFT:
+ expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(1, 5),
+ pile_->tiling().TileBounds(5, 5));
+ expected_invalidation.Union(SubtractRects(
+ pile_->tiling().TileBounds(0, 5), gfx::Rect(base_tiling_size)));
+ break;
+ case BOTTOM_RIGHT:
+ expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(0, 5),
+ pile_->tiling().TileBounds(4, 5));
+ expected_invalidation.Union(SubtractRects(
+ pile_->tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size)));
+ break;
+ }
EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
invalidation.Clear();
UpdateWholePile();
- UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1));
+ UpdateAndExpandInvalidation(&invalidation,
+ base_tiling_size,
+ CornerSinglePixelRect(corner, base_tiling_size));
// We should have lost nothing.
EXPECT_EQ(6, pile_->tiling().num_tiles_x());
@@ -609,7 +701,9 @@ TEST_F(PicturePileTest, SmallResizePileOutsideInterestRect) {
UpdateWholePile();
UpdateAndExpandInvalidation(
- &invalidation, grow_right_tiling_size, gfx::Rect(1, 1));
+ &invalidation,
+ grow_right_tiling_size,
+ CornerSinglePixelRect(corner, grow_right_tiling_size));
// We should have lost the recordings in the right column.
EXPECT_EQ(6, pile_->tiling().num_tiles_x());
@@ -619,18 +713,53 @@ TEST_F(PicturePileTest, SmallResizePileOutsideInterestRect) {
TestPicturePile::PictureMapKey key(i, j);
TestPicturePile::PictureMap& map = pile_->picture_map();
TestPicturePile::PictureMap::iterator it = map.find(key);
- EXPECT_EQ(i < 5, it != map.end() && it->second.GetPicture());
+ bool expect_tile;
+ switch (corner) {
+ case TOP_LEFT:
+ case BOTTOM_LEFT:
+ expect_tile = i < 5;
+ break;
+ case TOP_RIGHT:
+ // The interest rect in the top right tile means we'll record it.
+ expect_tile = i < 5 || (j == 0 && i == 5);
+ break;
+ case BOTTOM_RIGHT:
+ // The interest rect in the bottom right tile means we'll record it.
+ expect_tile = i < 5 || (j == 5 && i == 5);
+ break;
+ }
+ EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture());
}
}
- // We invalidated the right column.
- expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
- pile_->tiling().TileBounds(5, 5));
+ // We invalidated the right column outside the new interest rect. The tile
+ // that insects the interest rect in invalidated only on its new pixels.
+ switch (corner) {
+ case TOP_LEFT:
+ case BOTTOM_LEFT:
+ expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
+ pile_->tiling().TileBounds(5, 5));
+ break;
+ case TOP_RIGHT:
+ expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 1),
+ pile_->tiling().TileBounds(5, 5));
+ expected_invalidation.Union(SubtractRects(
+ pile_->tiling().TileBounds(5, 0), gfx::Rect(base_tiling_size)));
+ break;
+ case BOTTOM_RIGHT:
+ expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
+ pile_->tiling().TileBounds(5, 4));
+ expected_invalidation.Union(SubtractRects(
+ pile_->tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size)));
+ break;
+ }
EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
invalidation.Clear();
UpdateWholePile();
- UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1));
+ UpdateAndExpandInvalidation(&invalidation,
+ base_tiling_size,
+ CornerSinglePixelRect(corner, base_tiling_size));
// We should have lost nothing.
EXPECT_EQ(6, pile_->tiling().num_tiles_x());
@@ -651,9 +780,12 @@ TEST_F(PicturePileTest, SmallResizePileOutsideInterestRect) {
UpdateWholePile();
UpdateAndExpandInvalidation(
- &invalidation, grow_both_tiling_size, gfx::Rect(1, 1));
+ &invalidation,
+ grow_both_tiling_size,
+ CornerSinglePixelRect(corner, grow_both_tiling_size));
- // We should have lost the recordings in the right column and bottom row.
+ // We should have lost the recordings in the right column and bottom row. The
+ // tile that insects the interest rect in invalidated only on its new pixels.
EXPECT_EQ(6, pile_->tiling().num_tiles_x());
EXPECT_EQ(6, pile_->tiling().num_tiles_y());
for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) {
@@ -661,20 +793,71 @@ TEST_F(PicturePileTest, SmallResizePileOutsideInterestRect) {
TestPicturePile::PictureMapKey key(i, j);
TestPicturePile::PictureMap& map = pile_->picture_map();
TestPicturePile::PictureMap::iterator it = map.find(key);
- EXPECT_EQ(i < 5 && j < 5, it != map.end() && it->second.GetPicture());
+ bool expect_tile;
+ switch (corner) {
+ case TOP_LEFT:
+ expect_tile = i < 5 && j < 5;
+ break;
+ case TOP_RIGHT:
+ // The interest rect in the top right tile means we'll record it.
+ expect_tile = (i < 5 && j < 5) || (j == 0 && i == 5);
+ break;
+ case BOTTOM_LEFT:
+ // The interest rect in the bottom left tile means we'll record it.
+ expect_tile = (i < 5 && j < 5) || (j == 5 && i == 0);
+ break;
+ case BOTTOM_RIGHT:
+ // The interest rect in the bottom right tile means we'll record it.
+ expect_tile = (i < 5 && j < 5) || (j == 5 && i == 5);
+ break;
+ }
+ EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture())
+ << i << "," << j;
}
}
- // We invalidated the right column and the bottom row.
- expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
- pile_->tiling().TileBounds(5, 5));
- expected_invalidation.Union(gfx::UnionRects(
- pile_->tiling().TileBounds(0, 5), pile_->tiling().TileBounds(5, 5)));
+ // We invalidated the right column and the bottom row outside the new interest
+ // rect. The tile that insects the interest rect in invalidated only on its
+ // new pixels.
+ switch (corner) {
+ case TOP_LEFT:
+ expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
+ pile_->tiling().TileBounds(5, 5));
+ expected_invalidation.Union(gfx::UnionRects(
+ pile_->tiling().TileBounds(0, 5), pile_->tiling().TileBounds(5, 5)));
+ break;
+ case TOP_RIGHT:
+ expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 1),
+ pile_->tiling().TileBounds(5, 5));
+ expected_invalidation.Union(gfx::UnionRects(
+ pile_->tiling().TileBounds(0, 5), pile_->tiling().TileBounds(5, 5)));
+ expected_invalidation.Union(SubtractRects(
+ pile_->tiling().TileBounds(5, 0), gfx::Rect(base_tiling_size)));
+ break;
+ case BOTTOM_LEFT:
+ expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
+ pile_->tiling().TileBounds(5, 5));
+ expected_invalidation.Union(gfx::UnionRects(
+ pile_->tiling().TileBounds(1, 5), pile_->tiling().TileBounds(5, 5)));
+ expected_invalidation.Union(SubtractRects(
+ pile_->tiling().TileBounds(0, 5), gfx::Rect(base_tiling_size)));
+ break;
+ case BOTTOM_RIGHT:
+ expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0),
+ pile_->tiling().TileBounds(5, 4));
+ expected_invalidation.Union(gfx::UnionRects(
+ pile_->tiling().TileBounds(0, 5), pile_->tiling().TileBounds(4, 5)));
+ expected_invalidation.Union(SubtractRegions(
+ pile_->tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size)));
+ break;
+ }
EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
invalidation.Clear();
UpdateWholePile();
- UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1));
+ UpdateAndExpandInvalidation(&invalidation,
+ base_tiling_size,
+ CornerSinglePixelRect(corner, base_tiling_size));
// We should have lost nothing.
EXPECT_EQ(6, pile_->tiling().num_tiles_x());
@@ -694,6 +877,11 @@ TEST_F(PicturePileTest, SmallResizePileOutsideInterestRect) {
invalidation.Clear();
}
+INSTANTIATE_TEST_CASE_P(
+ PicturePileResizeCornerTests,
+ PicturePileResizeCornerTest,
+ ::testing::Values(TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT));
+
TEST_F(PicturePileTest, ResizePileInsideInterestRect) {
// This size chosen to be small enough that all the rects below fit inside the
// the interest rect, so they are smaller than kPixelDistanceToRecord in each

Powered by Google App Engine
This is Rietveld 408576698