1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/picture_image_layer_impl.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/layers/append_quads_data.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/quads/draw_quad.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/resources/tile_priority.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_impl_proxy.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_impl.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_picture_layer_tiling_client.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/impl_side_painting_settings.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/test/mock_occlusion_tracker.h" 1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace cc { 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestablePictureImageLayerImpl : public PictureImageLayerImpl { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestablePictureImageLayerImpl(LayerTreeImpl* tree_impl, int id) 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : PictureImageLayerImpl(tree_impl, id) { 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) using PictureLayerImpl::UpdateIdealScales; 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) using PictureLayerImpl::MaximumTilingContentsScale; 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) using PictureLayerImpl::DoPostCommitInitializationIfNeeded; 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PictureLayerTilingSet* tilings() { return tilings_.get(); } 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) friend class PictureImageLayerImplTest; 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PictureImageLayerImplTest : public testing::Test { 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PictureImageLayerImplTest() 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : proxy_(base::MessageLoopProxy::current()), 4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) host_impl_(ImplSidePaintingSettings(), 4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) &proxy_, 4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) &shared_bitmap_manager_) { 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tiling_client_.SetTileSize(ImplSidePaintingSettings().default_tile_size); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_impl_.CreatePendingTree(); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) host_impl_.InitializeRenderer( 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FakeOutputSurface::Create3d().PassAs<OutputSurface>()); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<TestablePictureImageLayerImpl> CreateLayer(int id, 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WhichTree which_tree) { 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeImpl* tree = NULL; 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (which_tree) { 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case ACTIVE_TREE: 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) tree = host_impl_.active_tree(); 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case PENDING_TREE: 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) tree = host_impl_.pending_tree(); 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case NUM_TREES: 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NOTREACHED(); 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestablePictureImageLayerImpl* layer = 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new TestablePictureImageLayerImpl(tree, id); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetBounds(gfx::Size(100, 200)); 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layer->SetContentBounds(gfx::Size(100, 200)); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->tilings_.reset(new PictureLayerTilingSet(&tiling_client_, 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->bounds())); 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch layer->pile_ = tiling_client_.GetPile(); 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_ptr(layer); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void SetupDrawPropertiesAndUpdateTiles(TestablePictureImageLayerImpl* layer, 756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) float ideal_contents_scale, 766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) float device_scale_factor, 776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) float page_scale_factor, 786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) float maximum_animation_contents_scale, 796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool animating_transform_to_screen) { 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layer->draw_properties().ideal_contents_scale = ideal_contents_scale; 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layer->draw_properties().device_scale_factor = device_scale_factor; 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layer->draw_properties().page_scale_factor = page_scale_factor; 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layer->draw_properties().maximum_animation_contents_scale = 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) maximum_animation_contents_scale; 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layer->draw_properties().screen_space_transform_is_animating = 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) animating_transform_to_screen; 8734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) bool resourceless_software_draw = false; 8834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) layer->UpdateTiles(Occlusion(), resourceless_software_draw); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected: 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeImplProxy proxy_; 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostImpl host_impl_; 9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) TestSharedBitmapManager shared_bitmap_manager_; 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakePictureLayerTilingClient tiling_client_; 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PictureImageLayerImplTest, CalculateContentsScale) { 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<TestablePictureImageLayerImpl> layer(CreateLayer(1, PENDING_TREE)); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetDrawsContent(true); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SetupDrawPropertiesAndUpdateTiles(layer.get(), 2.f, 3.f, 4.f, 1.f, false); 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FLOAT_EQ(1.f, layer->contents_scale_x()); 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FLOAT_EQ(1.f, layer->contents_scale_y()); 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FLOAT_EQ(1.f, layer->MaximumTilingContentsScale()); 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(PictureImageLayerImplTest, IgnoreIdealContentScale) { 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<TestablePictureImageLayerImpl> pending_layer( 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateLayer(1, PENDING_TREE)); 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) pending_layer->SetDrawsContent(true); 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Set PictureLayerImpl::ideal_contents_scale_ to 2.f which is not equal 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // to the content scale used by PictureImageLayerImpl. 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const float suggested_ideal_contents_scale = 2.f; 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const float device_scale_factor = 3.f; 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const float page_scale_factor = 4.f; 119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const float maximum_animation_contents_scale = 1.f; 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const bool animating_transform_to_screen = false; 1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SetupDrawPropertiesAndUpdateTiles(pending_layer.get(), 1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) suggested_ideal_contents_scale, 1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) device_scale_factor, 1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) page_scale_factor, 1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) maximum_animation_contents_scale, 1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) animating_transform_to_screen); 1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(1.f, pending_layer->tilings()->tiling_at(0)->contents_scale()); 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Push to active layer. 1306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) host_impl_.pending_tree()->SetRootLayer(pending_layer.PassAs<LayerImpl>()); 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_impl_.ActivateSyncTree(); 1326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) TestablePictureImageLayerImpl* active_layer = 1336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) static_cast<TestablePictureImageLayerImpl*>( 1346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) host_impl_.active_tree()->root_layer()); 1356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SetupDrawPropertiesAndUpdateTiles(active_layer, 1366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) suggested_ideal_contents_scale, 1376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) device_scale_factor, 1386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) page_scale_factor, 1396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) maximum_animation_contents_scale, 1406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) animating_transform_to_screen); 1416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(1.f, active_layer->tilings()->tiling_at(0)->contents_scale()); 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Create tile and resource. 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) active_layer->tilings()->tiling_at(0)->CreateAllTilesForTesting(); 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting( 146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch active_layer->tilings()->tiling_at(0)->AllTilesForTesting()); 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Draw. 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) active_layer->draw_properties().visible_content_rect = 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Rect(active_layer->bounds()); 151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MockOcclusionTracker<LayerImpl> occlusion_tracker; 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<RenderPass> render_pass = RenderPass::Create(); 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AppendQuadsData data; 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) active_layer->WillDraw(DRAW_MODE_SOFTWARE, NULL); 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch active_layer->AppendQuads(render_pass.get(), occlusion_tracker, &data); 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) active_layer->DidDraw(NULL); 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(DrawQuad::TILED_CONTENT, render_pass->quad_list.front()->material); 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Tiles are ready at correct scale, so should not set had_incomplete_tile. 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0, data.num_incomplete_tiles); 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace cc 166