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

Unified Diff: cc/playback/discardable_image_map_unittest.cc

Issue 2229603002: cc: Do a safe intersect when gathering images. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update Created 4 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
« no previous file with comments | « cc/playback/discardable_image_map.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/playback/discardable_image_map_unittest.cc
diff --git a/cc/playback/discardable_image_map_unittest.cc b/cc/playback/discardable_image_map_unittest.cc
index 6510939f7d1ad407281c330148b64d9edc0a4353..05585b0d23af4211f9548b6c5e867a5f0a5bbf3b 100644
--- a/cc/playback/discardable_image_map_unittest.cc
+++ b/cc/playback/discardable_image_map_unittest.cc
@@ -308,7 +308,7 @@ TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMassiveImage) {
GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1));
EXPECT_EQ(1u, images.size());
EXPECT_TRUE(images[0].image == discardable_image);
- EXPECT_EQ(gfx::Rect(0, 0, 1 << 25, 1 << 25), images[0].image_rect);
+ EXPECT_EQ(gfx::Rect(0, 0, 2048, 2048), images[0].image_rect);
}
TEST_F(DiscardableImageMapTest, PaintDestroyedWhileImageIsDrawn) {
@@ -337,4 +337,125 @@ TEST_F(DiscardableImageMapTest, PaintDestroyedWhileImageIsDrawn) {
EXPECT_TRUE(images[0].image == discardable_image);
}
+TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMaxImage) {
+ gfx::Rect visible_rect(2048, 2048);
+ FakeContentLayerClient content_layer_client;
+ content_layer_client.set_bounds(visible_rect.size());
+
+ int dimension = std::numeric_limits<int>::max();
+ sk_sp<SkImage> discardable_image =
+ CreateDiscardableImage(gfx::Size(dimension, dimension));
+ SkPaint paint;
+ content_layer_client.add_draw_image(discardable_image, gfx::Point(42, 42),
+ paint);
+
+ scoped_refptr<DisplayItemList> display_list =
+ content_layer_client.PaintContentsToDisplayList(
+ ContentLayerClient::PAINTING_BEHAVIOR_NORMAL);
+
+ DiscardableImageMap image_map;
+ {
+ DiscardableImageMap::ScopedMetadataGenerator generator(&image_map,
+ visible_rect.size());
+ display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f);
+ }
+ std::vector<PositionDrawImage> images =
+ GetDiscardableImagesInRect(image_map, gfx::Rect(42, 42, 1, 1));
+ EXPECT_EQ(1u, images.size());
+ EXPECT_TRUE(images[0].image == discardable_image);
+ EXPECT_EQ(gfx::Rect(42, 42, 2006, 2006), images[0].image_rect);
+}
+
+TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMaxImageMaxLayer) {
+ // At large values of integer x, x != static_cast<int>(static_cast<float>(x)).
+ // So, make sure the dimension can be converted back and forth for the
+ // purposes of the unittest. Also, at near max int values, Skia seems to skip
+ // some draw calls, so we subtract 64 since we only care about "really large"
+ // values, not necessarily max int values.
+ int dimension = static_cast<int>(
+ static_cast<float>(std::numeric_limits<int>::max() - 64));
+ gfx::Rect visible_rect(dimension, dimension);
+ FakeContentLayerClient content_layer_client;
+ content_layer_client.set_bounds(visible_rect.size());
+
+ sk_sp<SkImage> discardable_image =
+ CreateDiscardableImage(gfx::Size(dimension, dimension));
+ SkPaint paint;
+ content_layer_client.add_draw_image(discardable_image, gfx::Point(0, 0),
+ paint);
+ content_layer_client.add_draw_image(discardable_image, gfx::Point(10000, 0),
+ paint);
+ content_layer_client.add_draw_image(discardable_image,
+ gfx::Point(-10000, 500), paint);
+
+ scoped_refptr<DisplayItemList> display_list =
+ content_layer_client.PaintContentsToDisplayList(
+ ContentLayerClient::PAINTING_BEHAVIOR_NORMAL);
+
+ DiscardableImageMap image_map;
+ {
+ DiscardableImageMap::ScopedMetadataGenerator generator(&image_map,
+ visible_rect.size());
+ display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f);
+ }
+ std::vector<PositionDrawImage> images =
+ GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1));
+ EXPECT_EQ(1u, images.size());
+ EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), images[0].image_rect);
+
+ images = GetDiscardableImagesInRect(image_map, gfx::Rect(10000, 0, 1, 1));
+ EXPECT_EQ(2u, images.size());
+ int expected10k = static_cast<int>(static_cast<float>(dimension - 10000));
+ int expected500 = static_cast<int>(static_cast<float>(dimension - 500));
+ EXPECT_EQ(gfx::Rect(10000, 0, expected10k, dimension), images[1].image_rect);
+ EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), images[0].image_rect);
+
+ images = GetDiscardableImagesInRect(image_map, gfx::Rect(0, 500, 1, 1));
+ EXPECT_EQ(2u, images.size());
+ EXPECT_EQ(gfx::Rect(0, 500, expected10k, expected500), images[1].image_rect);
+ EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), images[0].image_rect);
+}
+
+TEST_F(DiscardableImageMapTest, GetDiscardableImagesRectInBounds) {
+ gfx::Rect visible_rect(1000, 1000);
+ FakeContentLayerClient content_layer_client;
+ content_layer_client.set_bounds(visible_rect.size());
+
+ sk_sp<SkImage> discardable_image =
+ CreateDiscardableImage(gfx::Size(100, 100));
+ sk_sp<SkImage> long_discardable_image =
+ CreateDiscardableImage(gfx::Size(10000, 100));
+
+ SkPaint paint;
+ content_layer_client.add_draw_image(discardable_image, gfx::Point(-10, -11),
+ paint);
+ content_layer_client.add_draw_image(discardable_image, gfx::Point(950, 951),
+ paint);
+ content_layer_client.add_draw_image(long_discardable_image,
+ gfx::Point(-100, 500), paint);
+
+ scoped_refptr<DisplayItemList> display_list =
+ content_layer_client.PaintContentsToDisplayList(
+ ContentLayerClient::PAINTING_BEHAVIOR_NORMAL);
+
+ DiscardableImageMap image_map;
+ {
+ DiscardableImageMap::ScopedMetadataGenerator generator(&image_map,
+ visible_rect.size());
+ display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f);
+ }
+ std::vector<PositionDrawImage> images =
+ GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1));
+ EXPECT_EQ(1u, images.size());
+ EXPECT_EQ(gfx::Rect(0, 0, 90, 89), images[0].image_rect);
+
+ images = GetDiscardableImagesInRect(image_map, gfx::Rect(999, 999, 1, 1));
+ EXPECT_EQ(1u, images.size());
+ EXPECT_EQ(gfx::Rect(950, 951, 50, 49), images[0].image_rect);
+
+ images = GetDiscardableImagesInRect(image_map, gfx::Rect(0, 500, 1, 1));
+ EXPECT_EQ(1u, images.size());
+ EXPECT_EQ(gfx::Rect(0, 500, 1000, 100), images[0].image_rect);
+}
+
} // namespace cc
« no previous file with comments | « cc/playback/discardable_image_map.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698