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

Side by Side Diff: cc/layers/tiled_layer_unittest.cc

Issue 567743003: Fix bad scaling in TiledLayer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: integrate review feedback Created 6 years, 3 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 unified diff | Download patch
« no previous file with comments | « cc/layers/tiled_layer.cc ('k') | cc/resources/bitmap_content_layer_updater.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/layers/tiled_layer.h" 5 #include "cc/layers/tiled_layer.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 layer->InvalidateContentRect(gfx::Rect(0, 0, 100, 200)); 282 layer->InvalidateContentRect(gfx::Rect(0, 0, 100, 200));
283 layer->draw_properties().visible_content_rect = gfx::Rect(0, 0, 100, 100); 283 layer->draw_properties().visible_content_rect = gfx::Rect(0, 0, 100, 100);
284 UpdateAndPush(layer, layer_impl); 284 UpdateAndPush(layer, layer_impl);
285 285
286 // We should only have the first tile since the other tile was invalidated but 286 // We should only have the first tile since the other tile was invalidated but
287 // not painted. 287 // not painted.
288 EXPECT_TRUE(layer_impl->HasResourceIdForTileAt(0, 0)); 288 EXPECT_TRUE(layer_impl->HasResourceIdForTileAt(0, 0));
289 EXPECT_FALSE(layer_impl->HasResourceIdForTileAt(0, 1)); 289 EXPECT_FALSE(layer_impl->HasResourceIdForTileAt(0, 1));
290 } 290 }
291 291
292 TEST_F(TiledLayerTest, Scale) {
293 layer_tree_host_->SetDeviceScaleFactor(1.5);
294
295 scoped_refptr<FakeTiledLayer> layer =
296 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get()));
297 scoped_ptr<FakeTiledLayerImpl> layer_impl =
298 make_scoped_ptr(new FakeTiledLayerImpl(host_impl_->active_tree(), 1));
299 RenderSurfaceLayerList render_surface_layer_list;
300
301 layer_tree_host_->root_layer()->AddChild(layer);
302
303 layer->SetBounds(gfx::Size(100, 200));
304 CalcDrawProps(&render_surface_layer_list);
305
306 // Change the width so that it doesn't divide cleanly by the scale.
307 layer->SetBounds(gfx::Size(101, 200));
308 UpdateAndPush(layer, layer_impl);
309
310 EXPECT_EQ(1.5, layer->fake_layer_updater()->last_contents_width_scale());
311 }
312
292 TEST_F(TiledLayerTest, PushOccludedDirtyTiles) { 313 TEST_F(TiledLayerTest, PushOccludedDirtyTiles) {
293 scoped_refptr<FakeTiledLayer> layer = 314 scoped_refptr<FakeTiledLayer> layer =
294 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); 315 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get()));
295 scoped_ptr<FakeTiledLayerImpl> layer_impl = 316 scoped_ptr<FakeTiledLayerImpl> layer_impl =
296 make_scoped_ptr(new FakeTiledLayerImpl(host_impl_->active_tree(), 1)); 317 make_scoped_ptr(new FakeTiledLayerImpl(host_impl_->active_tree(), 1));
297 TestOcclusionTracker occluded; 318 TestOcclusionTracker occluded;
298 occlusion_ = &occluded; 319 occlusion_ = &occluded;
299 layer_tree_host_->SetViewportSize(gfx::Size(1000, 1000)); 320 layer_tree_host_->SetViewportSize(gfx::Size(1000, 1000));
300 321
301 layer_tree_host_->root_layer()->AddChild(layer); 322 layer_tree_host_->root_layer()->AddChild(layer);
(...skipping 554 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 layer->InvalidateContentRect(gfx::Rect(0, 0, 50, 50)); 877 layer->InvalidateContentRect(gfx::Rect(0, 0, 50, 50));
857 UpdateAndPush(layer, layer_impl); 878 UpdateAndPush(layer, layer_impl);
858 EXPECT_EQ(1, layer->fake_layer_updater()->prepare_count()); 879 EXPECT_EQ(1, layer->fake_layer_updater()->prepare_count());
859 layer->fake_layer_updater()->ClearPrepareCount(); 880 layer->fake_layer_updater()->ClearPrepareCount();
860 881
861 // The layer should still be invalid as update invoked invalidate. 882 // The layer should still be invalid as update invoked invalidate.
862 UpdateAndPush(layer, layer_impl); // visible 883 UpdateAndPush(layer, layer_impl); // visible
863 EXPECT_EQ(1, layer->fake_layer_updater()->prepare_count()); 884 EXPECT_EQ(1, layer->fake_layer_updater()->prepare_count());
864 } 885 }
865 886
866 TEST_F(TiledLayerTest, VerifyUpdateRectWhenContentBoundsAreScaled) {
sky 2014/09/22 18:00:00 This test didn't seem worth keeping around.
danakj 2014/09/22 19:21:18 This is testing the Layer::update_rect_ is in laye
sky 2014/09/22 21:23:55 Yes, because it didn't update the scales explicitl
867 // The update rect (that indicates what was actually painted) should be in
868 // layer space, not the content space.
869 scoped_refptr<FakeTiledLayerWithScaledBounds> layer = make_scoped_refptr(
870 new FakeTiledLayerWithScaledBounds(resource_manager_.get()));
871
872 layer_tree_host_->root_layer()->AddChild(layer);
873
874 gfx::Rect layer_bounds(0, 0, 300, 200);
875 gfx::Rect content_bounds(0, 0, 200, 250);
876
877 layer->SetBounds(layer_bounds.size());
878 layer->SetContentBounds(content_bounds.size());
879 layer->draw_properties().visible_content_rect = content_bounds;
880
881 // On first update, the update_rect includes all tiles, even beyond the
882 // boundaries of the layer.
883 // However, it should still be in layer space, not content space.
884 layer->InvalidateContentRect(content_bounds);
885
886 layer->SetTexturePriorities(priority_calculator_);
887 resource_manager_->PrioritizeTextures();
888 layer->SavePaintProperties();
889 layer->Update(queue_.get(), NULL);
890 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 300, 300 * 0.8), layer->update_rect());
891 UpdateTextures();
892
893 // After the tiles are updated once, another invalidate only needs to update
894 // the bounds of the layer.
895 layer->SetTexturePriorities(priority_calculator_);
896 resource_manager_->PrioritizeTextures();
897 layer->InvalidateContentRect(content_bounds);
898 layer->SavePaintProperties();
899 layer->Update(queue_.get(), NULL);
900 EXPECT_FLOAT_RECT_EQ(gfx::RectF(layer_bounds), layer->update_rect());
901 UpdateTextures();
902
903 // Partial re-paint should also be represented by the update rect in layer
904 // space, not content space.
905 gfx::Rect partial_damage(30, 100, 10, 10);
906 layer->InvalidateContentRect(partial_damage);
907 layer->SetTexturePriorities(priority_calculator_);
908 resource_manager_->PrioritizeTextures();
909 layer->SavePaintProperties();
910 layer->Update(queue_.get(), NULL);
911 EXPECT_FLOAT_RECT_EQ(gfx::RectF(45, 80, 15, 8), layer->update_rect());
912 }
913
914 TEST_F(TiledLayerTest, VerifyInvalidationWhenContentsScaleChanges) { 887 TEST_F(TiledLayerTest, VerifyInvalidationWhenContentsScaleChanges) {
915 scoped_refptr<FakeTiledLayer> layer = 888 scoped_refptr<FakeTiledLayer> layer =
916 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get())); 889 make_scoped_refptr(new FakeTiledLayer(resource_manager_.get()));
917 scoped_ptr<FakeTiledLayerImpl> layer_impl = 890 scoped_ptr<FakeTiledLayerImpl> layer_impl =
918 make_scoped_ptr(new FakeTiledLayerImpl(host_impl_->active_tree(), 1)); 891 make_scoped_ptr(new FakeTiledLayerImpl(host_impl_->active_tree(), 1));
919 RenderSurfaceLayerList render_surface_layer_list; 892 RenderSurfaceLayerList render_surface_layer_list;
920 893
921 layer_tree_host_->root_layer()->AddChild(layer); 894 layer_tree_host_->root_layer()->AddChild(layer);
922 895
923 // Create a layer with one tile. 896 // Create a layer with one tile.
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after
1685 layer->tracking_layer_painter()->ResetPaintedRect(); 1658 layer->tracking_layer_painter()->ResetPaintedRect();
1686 1659
1687 EXPECT_RECT_EQ(gfx::Rect(), layer->tracking_layer_painter()->PaintedRect()); 1660 EXPECT_RECT_EQ(gfx::Rect(), layer->tracking_layer_painter()->PaintedRect());
1688 UpdateTextures(); 1661 UpdateTextures();
1689 1662
1690 // Invalidate the entire layer in content space. When painting, the rect given 1663 // Invalidate the entire layer in content space. When painting, the rect given
1691 // to webkit should match the layer's bounds. 1664 // to webkit should match the layer's bounds.
1692 layer->InvalidateContentRect(content_rect); 1665 layer->InvalidateContentRect(content_rect);
1693 layer->Update(queue_.get(), NULL); 1666 layer->Update(queue_.get(), NULL);
1694 1667
1695 EXPECT_RECT_EQ(layer_rect, layer->tracking_layer_painter()->PaintedRect()); 1668 // Rounding errors may lead to an extra dip.
1669 EXPECT_RECT_NEAR(
danakj 2014/09/22 19:21:18 Can you instead EXPECT_EQ and just explain in a co
sky 2014/09/22 21:23:55 It's the 1.5 scale. Previously we calculated the s
1670 layer_rect, layer->tracking_layer_painter()->PaintedRect(), 1);
1696 } 1671 }
1697 1672
1698 TEST_F(TiledLayerTest, 1673 TEST_F(TiledLayerTest,
1699 NonIntegerContentsScaleIsNotDistortedDuringInvalidation) { 1674 NonIntegerContentsScaleIsNotDistortedDuringInvalidation) {
1700 scoped_refptr<UpdateTrackingTiledLayer> layer = 1675 scoped_refptr<UpdateTrackingTiledLayer> layer =
1701 make_scoped_refptr(new UpdateTrackingTiledLayer(resource_manager_.get())); 1676 make_scoped_refptr(new UpdateTrackingTiledLayer(resource_manager_.get()));
1702 1677
1703 layer_tree_host_->root_layer()->AddChild(layer); 1678 layer_tree_host_->root_layer()->AddChild(layer);
1704 1679
1705 gfx::Rect layer_rect(0, 0, 30, 31); 1680 gfx::Rect layer_rect(0, 0, 30, 31);
(...skipping 14 matching lines...) Expand all
1720 layer->tracking_layer_painter()->ResetPaintedRect(); 1695 layer->tracking_layer_painter()->ResetPaintedRect();
1721 1696
1722 EXPECT_RECT_EQ(gfx::Rect(), layer->tracking_layer_painter()->PaintedRect()); 1697 EXPECT_RECT_EQ(gfx::Rect(), layer->tracking_layer_painter()->PaintedRect());
1723 UpdateTextures(); 1698 UpdateTextures();
1724 1699
1725 // Invalidate the entire layer in layer space. When painting, the rect given 1700 // Invalidate the entire layer in layer space. When painting, the rect given
1726 // to webkit should match the layer's bounds. 1701 // to webkit should match the layer's bounds.
1727 layer->SetNeedsDisplayRect(layer_rect); 1702 layer->SetNeedsDisplayRect(layer_rect);
1728 layer->Update(queue_.get(), NULL); 1703 layer->Update(queue_.get(), NULL);
1729 1704
1730 EXPECT_RECT_EQ(layer_rect, layer->tracking_layer_painter()->PaintedRect()); 1705 // Rounding errors may lead to an extra dip.
1706 EXPECT_RECT_NEAR(
danakj 2014/09/22 19:21:18 Same comment.
1707 layer_rect, layer->tracking_layer_painter()->PaintedRect(), 1);
1731 } 1708 }
1732 1709
1733 } // namespace 1710 } // namespace
1734 } // namespace cc 1711 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layers/tiled_layer.cc ('k') | cc/resources/bitmap_content_layer_updater.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698