diff options
author | vmpstr <vmpstr@chromium.org> | 2015-10-20 17:19:14 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-10-21 00:20:41 +0000 |
commit | 90c16164be8c91a954a2e69bfa5a13ec3560a17f (patch) | |
tree | 5626b4b0f01424840c7d658c2c067689c295a356 /cc/playback | |
parent | 83e47b933a49ee7ba011a862eb706a0d25ec1624 (diff) | |
download | chromium_src-90c16164be8c91a954a2e69bfa5a13ec3560a17f.zip chromium_src-90c16164be8c91a954a2e69bfa5a13ec3560a17f.tar.gz chromium_src-90c16164be8c91a954a2e69bfa5a13ec3560a17f.tar.bz2 |
cc: Save only the scale for discardable images.
This patch replaces storing a matrix with storing a scale in DrawImage.
This means when copying this, we're copying a lot fewer floats.
This patch also adds raster scale to functions that get the
images at raster tile. The raster scale ensures that the
returned image has correctly adjusted scale.
R=enne
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review URL: https://codereview.chromium.org/1419743002
Cr-Commit-Position: refs/heads/master@{#355198}
Diffstat (limited to 'cc/playback')
-rw-r--r-- | cc/playback/discardable_image_map.cc | 17 | ||||
-rw-r--r-- | cc/playback/discardable_image_map.h | 1 | ||||
-rw-r--r-- | cc/playback/discardable_image_map_unittest.cc | 2 | ||||
-rw-r--r-- | cc/playback/display_item_list.cc | 3 | ||||
-rw-r--r-- | cc/playback/display_item_list.h | 1 | ||||
-rw-r--r-- | cc/playback/display_list_raster_source.cc | 3 | ||||
-rw-r--r-- | cc/playback/display_list_raster_source.h | 4 | ||||
-rw-r--r-- | cc/playback/display_list_raster_source_unittest.cc | 10 | ||||
-rw-r--r-- | cc/playback/display_list_recording_source_unittest.cc | 48 | ||||
-rw-r--r-- | cc/playback/draw_image.h | 16 |
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_; }; |