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

Unified Diff: cc/playback/discardable_image_map_unittest.cc

Issue 2748263002: Move cc::DisplayItemList and related classes into cc/paint/ (Closed)
Patch Set: Merge branch 'master' into ccpaint Created 3 years, 9 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') | cc/playback/display_item.h » ('j') | 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
deleted file mode 100644
index eee782e7a826a824d0616e596b9c28dcd5a9f4b9..0000000000000000000000000000000000000000
--- a/cc/playback/discardable_image_map_unittest.cc
+++ /dev/null
@@ -1,646 +0,0 @@
-// Copyright 2015 The Chromium 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 "cc/playback/discardable_image_map.h"
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "base/memory/ref_counted.h"
-#include "base/values.h"
-#include "cc/base/region.h"
-#include "cc/test/fake_content_layer_client.h"
-#include "cc/test/fake_recording_source.h"
-#include "cc/test/skia_common.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/skia/include/core/SkCanvas.h"
-#include "third_party/skia/include/core/SkGraphics.h"
-#include "third_party/skia/include/core/SkImageGenerator.h"
-#include "third_party/skia/include/core/SkRefCnt.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/skia_util.h"
-
-namespace cc {
-namespace {
-
-struct PositionScaleDrawImage {
- PositionScaleDrawImage(sk_sp<const SkImage> image,
- const gfx::Rect& image_rect,
- const SkSize& scale)
- : image(std::move(image)), image_rect(image_rect), scale(scale) {}
- sk_sp<const SkImage> image;
- gfx::Rect image_rect;
- SkSize scale;
-};
-
-} // namespace
-
-class DiscardableImageMapTest : public testing::Test {
- public:
- std::vector<PositionScaleDrawImage> GetDiscardableImagesInRect(
- const DiscardableImageMap& image_map,
- const gfx::Rect& rect) {
- std::vector<DrawImage> draw_images;
- image_map.GetDiscardableImagesInRect(rect, 1.f, &draw_images);
-
- std::vector<size_t> indices;
- image_map.images_rtree_.Search(rect, &indices);
- std::vector<PositionScaleDrawImage> position_draw_images;
- for (size_t index : indices) {
- position_draw_images.push_back(
- PositionScaleDrawImage(image_map.all_images_[index].first.image(),
- image_map.all_images_[index].second,
- image_map.all_images_[index].first.scale()));
- }
-
- EXPECT_EQ(draw_images.size(), position_draw_images.size());
- for (size_t i = 0; i < draw_images.size(); ++i)
- EXPECT_TRUE(draw_images[i].image() == position_draw_images[i].image);
- return position_draw_images;
- }
-
- // Note that the image rtree outsets the images by 1, see the comment in
- // DiscardableImagesMetadataCanvas::AddImage.
- std::vector<gfx::Rect> InsetImageRects(
- const std::vector<PositionScaleDrawImage>& images) {
- std::vector<gfx::Rect> result;
- for (auto& image : images) {
- result.push_back(image.image_rect);
- result.back().Inset(1, 1, 1, 1);
- }
- return result;
- }
-};
-
-TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectTest) {
- gfx::Rect visible_rect(2048, 2048);
- FakeContentLayerClient content_layer_client;
- content_layer_client.set_bounds(visible_rect.size());
-
- // Discardable pixel refs are found in the following grids:
- // |---|---|---|---|
- // | | x | | x |
- // |---|---|---|---|
- // | x | | x | |
- // |---|---|---|---|
- // | | x | | x |
- // |---|---|---|---|
- // | x | | x | |
- // |---|---|---|---|
- sk_sp<SkImage> discardable_image[4][4];
- for (int y = 0; y < 4; ++y) {
- for (int x = 0; x < 4; ++x) {
- if ((x + y) & 1) {
- discardable_image[y][x] = CreateDiscardableImage(gfx::Size(500, 500));
- PaintFlags flags;
- content_layer_client.add_draw_image(
- discardable_image[y][x], gfx::Point(x * 512 + 6, y * 512 + 6),
- flags);
- }
- }
- }
-
- 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, gfx::Rect(), 1.f);
- }
-
- for (int y = 0; y < 4; ++y) {
- for (int x = 0; x < 4; ++x) {
- std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect(
- image_map, gfx::Rect(x * 512, y * 512, 500, 500));
- std::vector<gfx::Rect> inset_rects = InsetImageRects(images);
- if ((x + y) & 1) {
- EXPECT_EQ(1u, images.size()) << x << " " << y;
- EXPECT_TRUE(images[0].image == discardable_image[y][x]) << x << " "
- << y;
- EXPECT_EQ(gfx::Rect(x * 512 + 6, y * 512 + 6, 500, 500),
- inset_rects[0]);
- EXPECT_EQ(images[0].image_rect,
- image_map.GetRectForImage(images[0].image->uniqueID()));
- } else {
- EXPECT_EQ(0u, images.size()) << x << " " << y;
- }
- }
- }
-
- // Capture 4 pixel refs.
- std::vector<PositionScaleDrawImage> images =
- GetDiscardableImagesInRect(image_map, gfx::Rect(512, 512, 2048, 2048));
- std::vector<gfx::Rect> inset_rects = InsetImageRects(images);
- EXPECT_EQ(4u, images.size());
-
- EXPECT_TRUE(images[0].image == discardable_image[1][2]);
- EXPECT_EQ(gfx::Rect(2 * 512 + 6, 512 + 6, 500, 500), inset_rects[0]);
- EXPECT_EQ(images[0].image_rect,
- image_map.GetRectForImage(images[0].image->uniqueID()));
-
- EXPECT_TRUE(images[1].image == discardable_image[2][1]);
- EXPECT_EQ(gfx::Rect(512 + 6, 2 * 512 + 6, 500, 500), inset_rects[1]);
- EXPECT_EQ(images[1].image_rect,
- image_map.GetRectForImage(images[1].image->uniqueID()));
-
- EXPECT_TRUE(images[2].image == discardable_image[2][3]);
- EXPECT_EQ(gfx::Rect(3 * 512 + 6, 2 * 512 + 6, 500, 500), inset_rects[2]);
- EXPECT_EQ(images[2].image_rect,
- image_map.GetRectForImage(images[2].image->uniqueID()));
-
- EXPECT_TRUE(images[3].image == discardable_image[3][2]);
- EXPECT_EQ(gfx::Rect(2 * 512 + 6, 3 * 512 + 6, 500, 500), inset_rects[3]);
- EXPECT_EQ(images[3].image_rect,
- image_map.GetRectForImage(images[3].image->uniqueID()));
-}
-
-TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectNonZeroLayer) {
- gfx::Rect visible_rect(1024, 0, 2048, 2048);
- // Make sure visible rect fits into the layer size.
- gfx::Size layer_size(visible_rect.right(), visible_rect.bottom());
- FakeContentLayerClient content_layer_client;
- content_layer_client.set_bounds(layer_size);
-
- // Discardable pixel refs are found in the following grids:
- // |---|---|---|---|
- // | | x | | x |
- // |---|---|---|---|
- // | x | | x | |
- // |---|---|---|---|
- // | | x | | x |
- // |---|---|---|---|
- // | x | | x | |
- // |---|---|---|---|
- sk_sp<SkImage> discardable_image[4][4];
- for (int y = 0; y < 4; ++y) {
- for (int x = 0; x < 4; ++x) {
- if ((x + y) & 1) {
- discardable_image[y][x] = CreateDiscardableImage(gfx::Size(500, 500));
- PaintFlags flags;
- content_layer_client.add_draw_image(
- discardable_image[y][x],
- gfx::Point(1024 + x * 512 + 6, y * 512 + 6), flags);
- }
- }
- }
-
- scoped_refptr<DisplayItemList> display_list =
- content_layer_client.PaintContentsToDisplayList(
- ContentLayerClient::PAINTING_BEHAVIOR_NORMAL);
-
- DiscardableImageMap image_map;
- {
- DiscardableImageMap::ScopedMetadataGenerator generator(&image_map,
- layer_size);
- display_list->Raster(generator.canvas(), nullptr, gfx::Rect(), 1.f);
- }
-
- for (int y = 0; y < 4; ++y) {
- for (int x = 0; x < 4; ++x) {
- std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect(
- image_map, gfx::Rect(1024 + x * 512, y * 512, 500, 500));
- std::vector<gfx::Rect> inset_rects = InsetImageRects(images);
- if ((x + y) & 1) {
- EXPECT_EQ(1u, images.size()) << x << " " << y;
- EXPECT_TRUE(images[0].image == discardable_image[y][x]) << x << " "
- << y;
- EXPECT_EQ(gfx::Rect(1024 + x * 512 + 6, y * 512 + 6, 500, 500),
- inset_rects[0]);
- EXPECT_EQ(images[0].image_rect,
- image_map.GetRectForImage(images[0].image->uniqueID()));
- } else {
- EXPECT_EQ(0u, images.size()) << x << " " << y;
- }
- }
- }
- // Capture 4 pixel refs.
- {
- std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect(
- image_map, gfx::Rect(1024 + 512, 512, 2048, 2048));
- std::vector<gfx::Rect> inset_rects = InsetImageRects(images);
- EXPECT_EQ(4u, images.size());
-
- EXPECT_TRUE(images[0].image == discardable_image[1][2]);
- EXPECT_EQ(gfx::Rect(1024 + 2 * 512 + 6, 512 + 6, 500, 500), inset_rects[0]);
- EXPECT_EQ(images[0].image_rect,
- image_map.GetRectForImage(images[0].image->uniqueID()));
-
- EXPECT_TRUE(images[1].image == discardable_image[2][1]);
- EXPECT_EQ(gfx::Rect(1024 + 512 + 6, 2 * 512 + 6, 500, 500), inset_rects[1]);
- EXPECT_EQ(images[1].image_rect,
- image_map.GetRectForImage(images[1].image->uniqueID()));
-
- EXPECT_TRUE(images[2].image == discardable_image[2][3]);
- EXPECT_EQ(gfx::Rect(1024 + 3 * 512 + 6, 2 * 512 + 6, 500, 500),
- inset_rects[2]);
- EXPECT_EQ(images[2].image_rect,
- image_map.GetRectForImage(images[2].image->uniqueID()));
-
- EXPECT_TRUE(images[3].image == discardable_image[3][2]);
- EXPECT_EQ(gfx::Rect(1024 + 2 * 512 + 6, 3 * 512 + 6, 500, 500),
- inset_rects[3]);
- EXPECT_EQ(images[3].image_rect,
- image_map.GetRectForImage(images[3].image->uniqueID()));
- }
-
- // Non intersecting rects
- {
- std::vector<PositionScaleDrawImage> images =
- GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1000, 1000));
- EXPECT_EQ(0u, images.size());
- }
- {
- std::vector<PositionScaleDrawImage> images =
- GetDiscardableImagesInRect(image_map, gfx::Rect(3500, 0, 1000, 1000));
- EXPECT_EQ(0u, images.size());
- }
- {
- std::vector<PositionScaleDrawImage> images =
- GetDiscardableImagesInRect(image_map, gfx::Rect(0, 1100, 1000, 1000));
- EXPECT_EQ(0u, images.size());
- }
- {
- std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect(
- image_map, gfx::Rect(3500, 1100, 1000, 1000));
- EXPECT_EQ(0u, images.size());
- }
-
- // Image not present in the list.
- {
- sk_sp<SkImage> image = CreateDiscardableImage(gfx::Size(500, 500));
- EXPECT_EQ(gfx::Rect(), image_map.GetRectForImage(image->uniqueID()));
- }
-}
-
-TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectOnePixelQuery) {
- gfx::Rect visible_rect(2048, 2048);
- FakeContentLayerClient content_layer_client;
- content_layer_client.set_bounds(visible_rect.size());
-
- // Discardable pixel refs are found in the following grids:
- // |---|---|---|---|
- // | | x | | x |
- // |---|---|---|---|
- // | x | | x | |
- // |---|---|---|---|
- // | | x | | x |
- // |---|---|---|---|
- // | x | | x | |
- // |---|---|---|---|
- sk_sp<SkImage> discardable_image[4][4];
- for (int y = 0; y < 4; ++y) {
- for (int x = 0; x < 4; ++x) {
- if ((x + y) & 1) {
- discardable_image[y][x] = CreateDiscardableImage(gfx::Size(500, 500));
- PaintFlags flags;
- content_layer_client.add_draw_image(
- discardable_image[y][x], gfx::Point(x * 512 + 6, y * 512 + 6),
- flags);
- }
- }
- }
-
- 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, gfx::Rect(), 1.f);
- }
-
- for (int y = 0; y < 4; ++y) {
- for (int x = 0; x < 4; ++x) {
- std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect(
- image_map, gfx::Rect(x * 512 + 256, y * 512 + 256, 1, 1));
- std::vector<gfx::Rect> inset_rects = InsetImageRects(images);
- if ((x + y) & 1) {
- EXPECT_EQ(1u, images.size()) << x << " " << y;
- EXPECT_TRUE(images[0].image == discardable_image[y][x]) << x << " "
- << y;
- EXPECT_EQ(gfx::Rect(x * 512 + 6, y * 512 + 6, 500, 500),
- inset_rects[0]);
- EXPECT_EQ(images[0].image_rect,
- image_map.GetRectForImage(images[0].image->uniqueID()));
- } else {
- EXPECT_EQ(0u, images.size()) << x << " " << y;
- }
- }
- }
-}
-
-TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMassiveImage) {
- gfx::Rect visible_rect(2048, 2048);
- FakeContentLayerClient content_layer_client;
- content_layer_client.set_bounds(visible_rect.size());
-
- sk_sp<SkImage> discardable_image =
- CreateDiscardableImage(gfx::Size(1 << 25, 1 << 25));
- PaintFlags flags;
- content_layer_client.add_draw_image(discardable_image, gfx::Point(0, 0),
- flags);
-
- 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, gfx::Rect(), 1.f);
- }
- std::vector<PositionScaleDrawImage> images =
- GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1));
- std::vector<gfx::Rect> inset_rects = InsetImageRects(images);
- EXPECT_EQ(1u, images.size());
- EXPECT_TRUE(images[0].image == discardable_image);
- EXPECT_EQ(gfx::Rect(0, 0, 2048, 2048), inset_rects[0]);
- EXPECT_EQ(images[0].image_rect,
- image_map.GetRectForImage(images[0].image->uniqueID()));
-}
-
-TEST_F(DiscardableImageMapTest, PaintDestroyedWhileImageIsDrawn) {
- gfx::Rect visible_rect(2048, 2048);
- FakeContentLayerClient content_layer_client;
- content_layer_client.set_bounds(visible_rect.size());
-
- sk_sp<SkImage> discardable_image = CreateDiscardableImage(gfx::Size(10, 10));
-
- DiscardableImageMap image_map;
- {
- DiscardableImageMap::ScopedMetadataGenerator generator(&image_map,
- visible_rect.size());
- {
- std::unique_ptr<SkPaint> paint(new SkPaint());
- generator.canvas()->saveLayer(gfx::RectToSkRect(visible_rect),
- paint.get());
- }
- generator.canvas()->drawImage(discardable_image, 0, 0, nullptr);
- generator.canvas()->restore();
- }
-
- std::vector<PositionScaleDrawImage> images =
- GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1));
- EXPECT_EQ(1u, images.size());
- EXPECT_TRUE(images[0].image == discardable_image);
-}
-
-TEST_F(DiscardableImageMapTest, NullPaintOnSaveLayer) {
- gfx::Rect visible_rect(2048, 2048);
- FakeContentLayerClient content_layer_client;
- content_layer_client.set_bounds(visible_rect.size());
-
- sk_sp<SkImage> discardable_image = CreateDiscardableImage(gfx::Size(10, 10));
-
- DiscardableImageMap image_map;
- {
- DiscardableImageMap::ScopedMetadataGenerator generator(&image_map,
- visible_rect.size());
- SkPaint* null_paint = nullptr;
- generator.canvas()->saveLayer(gfx::RectToSkRect(visible_rect), null_paint);
- generator.canvas()->drawImage(discardable_image, 0, 0, nullptr);
- generator.canvas()->restore();
- }
-
- std::vector<PositionScaleDrawImage> images =
- GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1));
- EXPECT_EQ(1u, images.size());
- 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));
- PaintFlags flags;
- content_layer_client.add_draw_image(discardable_image, gfx::Point(42, 42),
- flags);
-
- 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<PositionScaleDrawImage> images =
- GetDiscardableImagesInRect(image_map, gfx::Rect(42, 42, 1, 1));
- std::vector<gfx::Rect> inset_rects = InsetImageRects(images);
- EXPECT_EQ(1u, images.size());
- EXPECT_TRUE(images[0].image == discardable_image);
- EXPECT_EQ(gfx::Rect(42, 42, 2006, 2006), inset_rects[0]);
- EXPECT_EQ(images[0].image_rect,
- image_map.GetRectForImage(images[0].image->uniqueID()));
-}
-
-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));
- PaintFlags flags;
- content_layer_client.add_draw_image(discardable_image, gfx::Point(0, 0),
- flags);
- content_layer_client.add_draw_image(discardable_image, gfx::Point(10000, 0),
- flags);
- content_layer_client.add_draw_image(discardable_image,
- gfx::Point(-10000, 500), flags);
-
- 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<PositionScaleDrawImage> images =
- GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1));
- std::vector<gfx::Rect> inset_rects = InsetImageRects(images);
- EXPECT_EQ(1u, images.size());
- EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), inset_rects[0]);
-
- images = GetDiscardableImagesInRect(image_map, gfx::Rect(10000, 0, 1, 1));
- inset_rects = InsetImageRects(images);
- EXPECT_EQ(2u, images.size());
- EXPECT_EQ(gfx::Rect(10000, 0, dimension - 10000, dimension), inset_rects[1]);
- EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), inset_rects[0]);
-
- // Since we adjust negative offsets before using ToEnclosingRect, the expected
- // width will be converted to float, which means that we lose some precision.
- // The expected value is whatever the value is converted to float and then
- // back to int.
- int expected10k = static_cast<int>(static_cast<float>(dimension - 10000));
- images = GetDiscardableImagesInRect(image_map, gfx::Rect(0, 500, 1, 1));
- inset_rects = InsetImageRects(images);
- EXPECT_EQ(2u, images.size());
- EXPECT_EQ(gfx::Rect(0, 500, expected10k, dimension - 500), inset_rects[1]);
- EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), inset_rects[0]);
-
- EXPECT_EQ(images[0].image_rect,
- image_map.GetRectForImage(discardable_image->uniqueID()));
-}
-
-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));
-
- PaintFlags flags;
- content_layer_client.add_draw_image(discardable_image, gfx::Point(-10, -11),
- flags);
- content_layer_client.add_draw_image(discardable_image, gfx::Point(950, 951),
- flags);
- content_layer_client.add_draw_image(long_discardable_image,
- gfx::Point(-100, 500), flags);
-
- 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<PositionScaleDrawImage> images =
- GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1));
- std::vector<gfx::Rect> inset_rects = InsetImageRects(images);
- EXPECT_EQ(1u, images.size());
- EXPECT_EQ(gfx::Rect(0, 0, 90, 89), inset_rects[0]);
-
- images = GetDiscardableImagesInRect(image_map, gfx::Rect(999, 999, 1, 1));
- inset_rects = InsetImageRects(images);
- EXPECT_EQ(1u, images.size());
- EXPECT_EQ(gfx::Rect(950, 951, 50, 49), inset_rects[0]);
-
- images = GetDiscardableImagesInRect(image_map, gfx::Rect(0, 500, 1, 1));
- inset_rects = InsetImageRects(images);
- EXPECT_EQ(1u, images.size());
- EXPECT_EQ(gfx::Rect(0, 500, 1000, 100), inset_rects[0]);
-
- gfx::Rect discardable_image_rect;
- discardable_image_rect.Union(gfx::Rect(0, 0, 90, 89));
- discardable_image_rect.Union(gfx::Rect(950, 951, 50, 49));
- discardable_image_rect.Inset(-1, -1, -1, -1);
- EXPECT_EQ(discardable_image_rect,
- image_map.GetRectForImage(discardable_image->uniqueID()));
-
- EXPECT_EQ(gfx::Rect(-1, 499, 1002, 102),
- image_map.GetRectForImage(long_discardable_image->uniqueID()));
-}
-
-TEST_F(DiscardableImageMapTest, GetDiscardableImagesInShader) {
- gfx::Rect visible_rect(2048, 2048);
- FakeContentLayerClient content_layer_client;
- content_layer_client.set_bounds(visible_rect.size());
-
- // Discardable pixel refs are found in the following grids:
- // |---|---|---|---|
- // | | x | | x |
- // |---|---|---|---|
- // | x | | x | |
- // |---|---|---|---|
- // | | x | | x |
- // |---|---|---|---|
- // | x | | x | |
- // |---|---|---|---|
- sk_sp<SkImage> discardable_image[4][4];
-
- // Skia doesn't allow shader instantiation with non-invertible local
- // transforms, so we can't let the scale drop all the way to 0.
- static constexpr float kMinScale = 0.1f;
-
- for (int y = 0; y < 4; ++y) {
- for (int x = 0; x < 4; ++x) {
- if ((x + y) & 1) {
- discardable_image[y][x] = CreateDiscardableImage(gfx::Size(500, 500));
- SkMatrix scale = SkMatrix::MakeScale(std::max(x * 0.5f, kMinScale),
- std::max(y * 0.5f, kMinScale));
- PaintFlags flags;
- flags.setShader(discardable_image[y][x]->makeShader(
- SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, &scale));
- content_layer_client.add_draw_rect(
- gfx::Rect(x * 512 + 6, y * 512 + 6, 500, 500), flags);
- }
- }
- }
-
- 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, gfx::Rect(), 1.f);
- }
-
- for (int y = 0; y < 4; ++y) {
- for (int x = 0; x < 4; ++x) {
- std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect(
- image_map, gfx::Rect(x * 512, y * 512, 500, 500));
- std::vector<gfx::Rect> inset_rects = InsetImageRects(images);
- if ((x + y) & 1) {
- EXPECT_EQ(1u, images.size()) << x << " " << y;
- EXPECT_TRUE(images[0].image == discardable_image[y][x]) << x << " "
- << y;
- EXPECT_EQ(gfx::Rect(x * 512 + 6, y * 512 + 6, 500, 500),
- inset_rects[0]);
- EXPECT_EQ(std::max(x * 0.5f, kMinScale), images[0].scale.fWidth);
- EXPECT_EQ(std::max(y * 0.5f, kMinScale), images[0].scale.fHeight);
- } else {
- EXPECT_EQ(0u, images.size()) << x << " " << y;
- }
- }
- }
-
- // Capture 4 pixel refs.
- std::vector<PositionScaleDrawImage> images =
- GetDiscardableImagesInRect(image_map, gfx::Rect(512, 512, 2048, 2048));
- std::vector<gfx::Rect> inset_rects = InsetImageRects(images);
- EXPECT_EQ(4u, images.size());
- EXPECT_TRUE(images[0].image == discardable_image[1][2]);
- EXPECT_EQ(gfx::Rect(2 * 512 + 6, 512 + 6, 500, 500), inset_rects[0]);
- EXPECT_TRUE(images[1].image == discardable_image[2][1]);
- EXPECT_EQ(gfx::Rect(512 + 6, 2 * 512 + 6, 500, 500), inset_rects[1]);
- EXPECT_TRUE(images[2].image == discardable_image[2][3]);
- EXPECT_EQ(gfx::Rect(3 * 512 + 6, 2 * 512 + 6, 500, 500), inset_rects[2]);
- EXPECT_TRUE(images[3].image == discardable_image[3][2]);
- EXPECT_EQ(gfx::Rect(2 * 512 + 6, 3 * 512 + 6, 500, 500), inset_rects[3]);
-}
-
-} // namespace cc
« no previous file with comments | « cc/playback/discardable_image_map.cc ('k') | cc/playback/display_item.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698