summaryrefslogtreecommitdiffstats
path: root/cc/playback
diff options
context:
space:
mode:
Diffstat (limited to 'cc/playback')
-rw-r--r--cc/playback/discardable_image_map.cc17
-rw-r--r--cc/playback/discardable_image_map.h1
-rw-r--r--cc/playback/discardable_image_map_unittest.cc2
-rw-r--r--cc/playback/display_item_list.cc3
-rw-r--r--cc/playback/display_item_list.h1
-rw-r--r--cc/playback/display_list_raster_source.cc3
-rw-r--r--cc/playback/display_list_raster_source.h4
-rw-r--r--cc/playback/display_list_raster_source_unittest.cc10
-rw-r--r--cc/playback/display_list_recording_source_unittest.cc48
-rw-r--r--cc/playback/draw_image.h16
10 files changed, 67 insertions, 38 deletions
diff --git a/cc/playback/discardable_image_map.cc b/cc/playback/discardable_image_map.cc
index 66eab3b9..1333475 100644
--- a/cc/playback/discardable_image_map.cc
+++ b/cc/playback/discardable_image_map.cc
@@ -23,6 +23,15 @@ SkRect MapRect(const SkMatrix& matrix, const SkRect& src) {
return dst;
}
+SkSize ExtractScale(const SkMatrix& matrix) {
+ SkSize scale = SkSize::Make(matrix.getScaleX(), matrix.getScaleY());
+ if (matrix.getType() & SkMatrix::kAffine_Mask) {
+ if (!matrix.decomposeScale(&scale))
+ scale.set(1, 1);
+ }
+ return scale;
+}
+
// We're using an NWay canvas with no added canvases, so in effect
// non-overridden functions are no-ops.
class DiscardableImagesMetadataCanvas : public SkNWayCanvas {
@@ -88,8 +97,9 @@ class DiscardableImagesMetadataCanvas : public SkNWayCanvas {
if (paint) {
filter_quality = paint->getFilterQuality();
}
- image_set_->push_back(std::make_pair(
- DrawImage(image, matrix, filter_quality), gfx::SkRectToRectF(rect)));
+ image_set_->push_back(
+ std::make_pair(DrawImage(image, ExtractScale(matrix), filter_quality),
+ gfx::SkRectToRectF(rect)));
}
}
@@ -117,11 +127,12 @@ void DiscardableImageMap::EndGeneratingMetadata() {
void DiscardableImageMap::GetDiscardableImagesInRect(
const gfx::Rect& rect,
+ float raster_scale,
std::vector<DrawImage>* images) const {
std::vector<size_t> indices;
images_rtree_.Search(gfx::RectF(rect), &indices);
for (size_t index : indices)
- images->push_back(all_images_[index].first);
+ images->push_back(all_images_[index].first.ApplyScale(raster_scale));
}
DiscardableImageMap::ScopedMetadataGenerator::ScopedMetadataGenerator(
diff --git a/cc/playback/discardable_image_map.h b/cc/playback/discardable_image_map.h
index 53028b2..db6b17f 100644
--- a/cc/playback/discardable_image_map.h
+++ b/cc/playback/discardable_image_map.h
@@ -43,6 +43,7 @@ class CC_EXPORT DiscardableImageMap {
bool empty() const { return all_images_.empty(); }
void GetDiscardableImagesInRect(const gfx::Rect& rect,
+ float raster_scale,
std::vector<DrawImage>* images) const;
private:
diff --git a/cc/playback/discardable_image_map_unittest.cc b/cc/playback/discardable_image_map_unittest.cc
index 7fc7900..9797a2f 100644
--- a/cc/playback/discardable_image_map_unittest.cc
+++ b/cc/playback/discardable_image_map_unittest.cc
@@ -35,7 +35,7 @@ class DiscardableImageMapTest : public testing::Test {
const DiscardableImageMap& image_map,
const gfx::Rect& rect) {
std::vector<DrawImage> draw_images;
- image_map.GetDiscardableImagesInRect(rect, &draw_images);
+ image_map.GetDiscardableImagesInRect(rect, 1.f, &draw_images);
std::vector<size_t> indices;
image_map.images_rtree_.Search(gfx::RectF(rect), &indices);
diff --git a/cc/playback/display_item_list.cc b/cc/playback/display_item_list.cc
index 4fb92a7..7614bfd 100644
--- a/cc/playback/display_item_list.cc
+++ b/cc/playback/display_item_list.cc
@@ -288,8 +288,9 @@ void DisplayItemList::GenerateDiscardableImagesMetadata() {
void DisplayItemList::GetDiscardableImagesInRect(
const gfx::Rect& rect,
+ float raster_scale,
std::vector<DrawImage>* images) {
- image_map_.GetDiscardableImagesInRect(rect, images);
+ image_map_.GetDiscardableImagesInRect(rect, raster_scale, images);
}
} // namespace cc
diff --git a/cc/playback/display_item_list.h b/cc/playback/display_item_list.h
index 7e2d793..95342ed 100644
--- a/cc/playback/display_item_list.h
+++ b/cc/playback/display_item_list.h
@@ -78,6 +78,7 @@ class CC_EXPORT DisplayItemList
void GenerateDiscardableImagesMetadata();
void GetDiscardableImagesInRect(const gfx::Rect& rect,
+ float raster_scale,
std::vector<DrawImage>* images);
private:
diff --git a/cc/playback/display_list_raster_source.cc b/cc/playback/display_list_raster_source.cc
index 3060c04..cc4f7a7 100644
--- a/cc/playback/display_list_raster_source.cc
+++ b/cc/playback/display_list_raster_source.cc
@@ -235,9 +235,10 @@ void DisplayListRasterSource::PerformSolidColorAnalysis(
void DisplayListRasterSource::GetDiscardableImagesInRect(
const gfx::Rect& layer_rect,
+ float raster_scale,
std::vector<DrawImage>* images) const {
DCHECK_EQ(0u, images->size());
- display_list_->GetDiscardableImagesInRect(layer_rect, images);
+ display_list_->GetDiscardableImagesInRect(layer_rect, raster_scale, images);
}
bool DisplayListRasterSource::CoversRect(const gfx::Rect& layer_rect) const {
diff --git a/cc/playback/display_list_raster_source.h b/cc/playback/display_list_raster_source.h
index a322dcb..8c06c8d 100644
--- a/cc/playback/display_list_raster_source.h
+++ b/cc/playback/display_list_raster_source.h
@@ -71,8 +71,10 @@ class CC_EXPORT DisplayListRasterSource
gfx::Size GetSize() const;
// Populate the given list with all images that may overlap the given
- // rect in layer space.
+ // rect in layer space. The returned draw images' matrices are modified as if
+ // they were being using during raster at scale |raster_scale|.
void GetDiscardableImagesInRect(const gfx::Rect& layer_rect,
+ float raster_scale,
std::vector<DrawImage>* images) const;
// Return true iff this raster source can raster the given rect in layer
diff --git a/cc/playback/display_list_raster_source_unittest.cc b/cc/playback/display_list_raster_source_unittest.cc
index 40f083f..c7b3af9 100644
--- a/cc/playback/display_list_raster_source_unittest.cc
+++ b/cc/playback/display_list_raster_source_unittest.cc
@@ -202,27 +202,29 @@ TEST(DisplayListRasterSourceTest, PixelRefIteratorDiscardableRefsOneTile) {
// Tile sized iterators. These should find only one pixel ref.
{
std::vector<DrawImage> images;
- raster->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256), &images);
+ raster->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256), 1.f, &images);
EXPECT_EQ(1u, images.size());
EXPECT_EQ(discardable_image[0][0].get(), images[0].image());
}
// Shifted tile sized iterators. These should find only one pixel ref.
{
std::vector<DrawImage> images;
- raster->GetDiscardableImagesInRect(gfx::Rect(260, 260, 256, 256), &images);
+ raster->GetDiscardableImagesInRect(gfx::Rect(260, 260, 256, 256), 1.f,
+ &images);
EXPECT_EQ(1u, images.size());
EXPECT_EQ(discardable_image[1][1].get(), images[0].image());
}
// Ensure there's no discardable pixel refs in the empty cell
{
std::vector<DrawImage> images;
- raster->GetDiscardableImagesInRect(gfx::Rect(0, 256, 256, 256), &images);
+ raster->GetDiscardableImagesInRect(gfx::Rect(0, 256, 256, 256), 1.f,
+ &images);
EXPECT_EQ(0u, images.size());
}
// Layer sized iterators. These should find three pixel ref.
{
std::vector<DrawImage> images;
- raster->GetDiscardableImagesInRect(gfx::Rect(0, 0, 512, 512), &images);
+ raster->GetDiscardableImagesInRect(gfx::Rect(0, 0, 512, 512), 1.f, &images);
EXPECT_EQ(3u, images.size());
EXPECT_EQ(discardable_image[0][0].get(), images[0].image());
EXPECT_EQ(discardable_image[0][1].get(), images[1].image());
diff --git a/cc/playback/display_list_recording_source_unittest.cc b/cc/playback/display_list_recording_source_unittest.cc
index 05d035a..98f827b 100644
--- a/cc/playback/display_list_recording_source_unittest.cc
+++ b/cc/playback/display_list_recording_source_unittest.cc
@@ -73,7 +73,7 @@ TEST(DisplayListRecordingSourceTest, DiscardableImagesWithTransform) {
// Tile sized iterators. These should find only one pixel ref.
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 128, 128),
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 128, 128), 1.f,
&images);
EXPECT_EQ(2u, images.size());
EXPECT_TRUE(images[0].image() == discardable_image[0][0].get());
@@ -84,7 +84,7 @@ TEST(DisplayListRecordingSourceTest, DiscardableImagesWithTransform) {
{
std::vector<DrawImage> images;
raster_source->GetDiscardableImagesInRect(gfx::Rect(130, 140, 128, 128),
- &images);
+ 1.f, &images);
EXPECT_EQ(1u, images.size());
EXPECT_TRUE(images[0].image() == discardable_image[1][1].get());
}
@@ -92,7 +92,7 @@ TEST(DisplayListRecordingSourceTest, DiscardableImagesWithTransform) {
// The rotated bitmap would still be in the top right tile.
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(gfx::Rect(130, 0, 128, 128),
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(130, 0, 128, 128), 1.f,
&images);
EXPECT_EQ(1u, images.size());
EXPECT_TRUE(images[0].image() == discardable_image[1][1].get());
@@ -101,7 +101,7 @@ TEST(DisplayListRecordingSourceTest, DiscardableImagesWithTransform) {
// Layer sized iterators. These should find all pixel refs.
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256),
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256), 1.f,
&images);
EXPECT_EQ(3u, images.size());
// Top left tile with bitmap[0][0] and bitmap[1][1].
@@ -109,6 +109,16 @@ TEST(DisplayListRecordingSourceTest, DiscardableImagesWithTransform) {
EXPECT_TRUE(images[1].image() == discardable_image[1][0].get());
EXPECT_TRUE(images[2].image() == discardable_image[1][1].get());
}
+
+ // Verify different raster scales
+ for (float scale = 1.f; scale <= 5.f; scale += 0.5f) {
+ std::vector<DrawImage> images;
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(130, 0, 128, 128),
+ scale, &images);
+ EXPECT_EQ(1u, images.size());
+ EXPECT_FLOAT_EQ(scale, images[0].scale().width());
+ EXPECT_FLOAT_EQ(scale, images[0].scale().height());
+ }
}
TEST(DisplayListRecordingSourceTest, ExposesEnoughNewAreaEmpty) {
@@ -257,7 +267,7 @@ TEST(DisplayListRecordingSourceTest, NoGatherImageEmptyImages) {
// get images.
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(recorded_viewport, &images);
+ raster_source->GetDiscardableImagesInRect(recorded_viewport, 1.f, &images);
EXPECT_TRUE(images.empty());
}
}
@@ -276,7 +286,7 @@ TEST(DisplayListRecordingSourceTest, EmptyImages) {
// Tile sized iterators.
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 128, 128),
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 128, 128), 1.f,
&images);
EXPECT_TRUE(images.empty());
}
@@ -284,13 +294,13 @@ TEST(DisplayListRecordingSourceTest, EmptyImages) {
{
std::vector<DrawImage> images;
raster_source->GetDiscardableImagesInRect(gfx::Rect(140, 140, 128, 128),
- &images);
+ 1.f, &images);
EXPECT_TRUE(images.empty());
}
// Layer sized iterators.
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256),
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256), 1.f,
&images);
EXPECT_TRUE(images.empty());
}
@@ -334,7 +344,7 @@ TEST(DisplayListRecordingSourceTest, NoDiscardableImages) {
// Tile sized iterators.
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 128, 128),
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 128, 128), 1.f,
&images);
EXPECT_TRUE(images.empty());
}
@@ -342,13 +352,13 @@ TEST(DisplayListRecordingSourceTest, NoDiscardableImages) {
{
std::vector<DrawImage> images;
raster_source->GetDiscardableImagesInRect(gfx::Rect(140, 140, 128, 128),
- &images);
+ 1.f, &images);
EXPECT_TRUE(images.empty());
}
// Layer sized iterators.
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256),
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256), 1.f,
&images);
EXPECT_TRUE(images.empty());
}
@@ -386,7 +396,7 @@ TEST(DisplayListRecordingSourceTest, DiscardableImages) {
// Tile sized iterators. These should find only one image.
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 128, 128),
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 128, 128), 1.f,
&images);
EXPECT_EQ(1u, images.size());
EXPECT_TRUE(images[0].image() == discardable_image[0][0].get());
@@ -396,7 +406,7 @@ TEST(DisplayListRecordingSourceTest, DiscardableImages) {
{
std::vector<DrawImage> images;
raster_source->GetDiscardableImagesInRect(gfx::Rect(140, 140, 128, 128),
- &images);
+ 1.f, &images);
EXPECT_EQ(1u, images.size());
EXPECT_TRUE(images[0].image() == discardable_image[1][1].get());
}
@@ -404,7 +414,7 @@ TEST(DisplayListRecordingSourceTest, DiscardableImages) {
// Ensure there's no discardable images in the empty cell
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(gfx::Rect(140, 0, 128, 128),
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(140, 0, 128, 128), 1.f,
&images);
EXPECT_TRUE(images.empty());
}
@@ -412,7 +422,7 @@ TEST(DisplayListRecordingSourceTest, DiscardableImages) {
// Layer sized iterators. These should find all 3 images.
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256),
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256), 1.f,
&images);
EXPECT_EQ(3u, images.size());
EXPECT_TRUE(images[0].image() == discardable_image[0][0].get());
@@ -462,7 +472,7 @@ TEST(DisplayListRecordingSourceTest, DiscardableImagesBaseNonDiscardable) {
// Tile sized iterators. These should find only one image.
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256),
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 256, 256), 1.f,
&images);
EXPECT_EQ(1u, images.size());
EXPECT_TRUE(images[0].image() == discardable_image[0][0].get());
@@ -471,21 +481,21 @@ TEST(DisplayListRecordingSourceTest, DiscardableImagesBaseNonDiscardable) {
{
std::vector<DrawImage> images;
raster_source->GetDiscardableImagesInRect(gfx::Rect(260, 260, 256, 256),
- &images);
+ 1.f, &images);
EXPECT_EQ(1u, images.size());
EXPECT_TRUE(images[0].image() == discardable_image[1][1].get());
}
// Ensure there's no discardable images in the empty cell
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 256, 256, 256),
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 256, 256, 256), 1.f,
&images);
EXPECT_TRUE(images.empty());
}
// Layer sized iterators. These should find three images.
{
std::vector<DrawImage> images;
- raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 512, 512),
+ raster_source->GetDiscardableImagesInRect(gfx::Rect(0, 0, 512, 512), 1.f,
&images);
EXPECT_EQ(3u, images.size());
EXPECT_TRUE(images[0].image() == discardable_image[0][0].get());
diff --git a/cc/playback/draw_image.h b/cc/playback/draw_image.h
index 459f543..3dbce12 100644
--- a/cc/playback/draw_image.h
+++ b/cc/playback/draw_image.h
@@ -15,23 +15,23 @@ class DrawImage {
public:
DrawImage() : image_(nullptr), filter_quality_(kNone_SkFilterQuality) {}
DrawImage(const SkImage* image,
- const SkMatrix& matrix,
+ const SkSize& scale,
SkFilterQuality filter_quality)
- : image_(image), matrix_(matrix), filter_quality_(filter_quality) {}
+ : image_(image), scale_(scale), filter_quality_(filter_quality) {}
const SkImage* image() const { return image_; }
- const SkMatrix& matrix() const { return matrix_; }
+ const SkSize& scale() const { return scale_; }
SkFilterQuality filter_quality() const { return filter_quality_; }
- DrawImage ApplyScale(float scale) {
- SkMatrix scaled_matrix = matrix_;
- scaled_matrix.preScale(scale, scale);
- return DrawImage(image_, scaled_matrix, filter_quality_);
+ DrawImage ApplyScale(float scale) const {
+ return DrawImage(
+ image_, SkSize::Make(scale_.width() * scale, scale_.height() * scale),
+ filter_quality_);
}
private:
const SkImage* image_;
- SkMatrix matrix_;
+ SkSize scale_;
SkFilterQuality filter_quality_;
};