diff options
Diffstat (limited to 'cc/tiles')
-rw-r--r-- | cc/tiles/picture_layer_tiling.cc | 7 | ||||
-rw-r--r-- | cc/tiles/picture_layer_tiling_unittest.cc | 24 |
2 files changed, 31 insertions, 0 deletions
diff --git a/cc/tiles/picture_layer_tiling.cc b/cc/tiles/picture_layer_tiling.cc index 8db2352..3ae1ad9 100644 --- a/cc/tiles/picture_layer_tiling.cc +++ b/cc/tiles/picture_layer_tiling.cc @@ -552,6 +552,13 @@ gfx::Rect PictureLayerTiling::ComputeSkewport( // union in case intersecting would have left the empty rect. skewport.Intersect(max_skewport); + // Due to limits in int's representation, it is possible that the two + // operations above (union and intersect) result in an empty skewport. To + // avoid any unpleasant situations like that, union the visible rect again to + // ensure that skewport.Contains(visible_rect_in_content_space) is always + // true. + skewport.Union(visible_rect_in_content_space); + return skewport; } diff --git a/cc/tiles/picture_layer_tiling_unittest.cc b/cc/tiles/picture_layer_tiling_unittest.cc index 3539b6d..31caf46 100644 --- a/cc/tiles/picture_layer_tiling_unittest.cc +++ b/cc/tiles/picture_layer_tiling_unittest.cc @@ -629,6 +629,30 @@ TEST(PictureLayerTilingTest, SkewportLimits) { EXPECT_TRUE(move_skewport_far.Contains(gfx::Rect(0, 5000, 100, 100))); } +TEST(PictureLayerTilingTest, ComputeSkewportExtremeCases) { + FakePictureLayerTilingClient client; + + gfx::Size layer_bounds(200, 200); + client.SetTileSize(gfx::Size(100, 100)); + LayerTreeSettings settings; + scoped_refptr<FakePicturePileImpl> pile = + FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds); + scoped_ptr<TestablePictureLayerTiling> tiling = + TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile, &client, + settings); + + gfx::Rect viewport1(-1918, 255860, 4010, 2356); + gfx::Rect viewport2(-7088, -91738, 14212, 8350); + gfx::Rect viewport3(-12730024, -158883296, 24607540, 14454512); + double time = 1.0; + tiling->ComputeTilePriorityRects(viewport1, 1.f, time, Occlusion()); + time += 0.016; + EXPECT_TRUE(tiling->ComputeSkewport(time, viewport2).Contains(viewport2)); + tiling->ComputeTilePriorityRects(viewport2, 1.f, time, Occlusion()); + time += 0.016; + EXPECT_TRUE(tiling->ComputeSkewport(time, viewport3).Contains(viewport3)); +} + TEST(PictureLayerTilingTest, ComputeSkewport) { FakePictureLayerTilingClient client; |