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" 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/resources/tile_priority.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_impl_proxy.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_impl.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_picture_layer_tiling_client.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/impl_side_painting_settings.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/test/mock_quad_culler.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace cc { 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestablePictureImageLayerImpl : public PictureImageLayerImpl { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestablePictureImageLayerImpl(LayerTreeImpl* tree_impl, int id) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : PictureImageLayerImpl(tree_impl, id) { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PictureLayerTilingSet* tilings() { return tilings_.get(); } 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) friend class PictureImageLayerImplTest; 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PictureImageLayerImplTest : public testing::Test { 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PictureImageLayerImplTest() 3531fc3ed1513c41bdd4a09cdd402f3c4f53b0cecdTorne (Richard Coles) : host_impl_(ImplSidePaintingSettings(), &proxy_) { 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tiling_client_.SetTileSize(ImplSidePaintingSettings().default_tile_size); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_impl_.CreatePendingTree(); 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_impl_.InitializeRenderer(CreateFakeOutputSurface()); 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<TestablePictureImageLayerImpl> CreateLayer(int id, 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WhichTree which_tree) { 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) LayerTreeImpl* tree = NULL; 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (which_tree) { 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case ACTIVE_TREE: 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) tree = host_impl_.active_tree(); 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case PENDING_TREE: 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) tree = host_impl_.pending_tree(); 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case NUM_TREES: 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NOTREACHED(); 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestablePictureImageLayerImpl* layer = 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new TestablePictureImageLayerImpl(tree, id); 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetBounds(gfx::Size(100, 200)); 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->tilings_.reset(new PictureLayerTilingSet(&tiling_client_, 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->bounds())); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->pile_ = tiling_client_.pile(); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return make_scoped_ptr(layer); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void UpdateDrawProperties() { 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host_impl_.pending_tree()->UpdateDrawProperties(); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected: 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeImplProxy proxy_; 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeLayerTreeHostImpl host_impl_; 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakePictureLayerTilingClient tiling_client_; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PictureImageLayerImplTest, CalculateContentsScale) { 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<TestablePictureImageLayerImpl> layer(CreateLayer(1, PENDING_TREE)); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetDrawsContent(true); 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float contents_scale_x; 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float contents_scale_y; 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size content_bounds; 81b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer->CalculateContentsScale(2.f, 3.f, 4.f, false, 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &contents_scale_x, &contents_scale_y, 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &content_bounds); 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FLOAT_EQ(1.f, contents_scale_x); 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FLOAT_EQ(1.f, contents_scale_y); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(layer->bounds(), content_bounds); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PictureImageLayerImplTest, AreVisibleResourcesReady) { 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<TestablePictureImageLayerImpl> layer(CreateLayer(1, PENDING_TREE)); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetBounds(gfx::Size(100, 200)); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetDrawsContent(true); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateDrawProperties(); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float contents_scale_x; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float contents_scale_y; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size content_bounds; 99b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) layer->CalculateContentsScale(2.f, 3.f, 4.f, false, 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &contents_scale_x, &contents_scale_y, 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &content_bounds); 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->UpdateTilePriorities(); 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(layer->AreVisibleResourcesReady()); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(PictureImageLayerImplTest, IgnoreIdealContentScale) { 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<TestablePictureImageLayerImpl> pending_layer( 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateLayer(1, PENDING_TREE)); 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) pending_layer->SetDrawsContent(true); 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Set PictureLayerImpl::ideal_contents_scale_ to 2.f which is not equal 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // to the content scale used by PictureImageLayerImpl. 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const float suggested_ideal_contents_scale = 2.f; 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const float device_scale_factor = 3.f; 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const float page_scale_factor = 4.f; 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const bool animating_transform_to_screen = false; 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float contents_scale_x; 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) float contents_scale_y; 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size content_bounds; 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) pending_layer->CalculateContentsScale(suggested_ideal_contents_scale, 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) device_scale_factor, 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) page_scale_factor, 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) animating_transform_to_screen, 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &contents_scale_x, 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &contents_scale_y, 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &content_bounds); 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Push to active layer. 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl_.ActivatePendingTree(); 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<TestablePictureImageLayerImpl> active_layer( 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateLayer(1, ACTIVE_TREE)); 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) pending_layer->PushPropertiesTo(active_layer.get()); 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) active_layer->CalculateContentsScale(suggested_ideal_contents_scale, 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) device_scale_factor, 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) page_scale_factor, 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) animating_transform_to_screen, 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &contents_scale_x, 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &contents_scale_y, 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &content_bounds); 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Create tile and resource. 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) active_layer->tilings()->tiling_at(0)->CreateAllTilesForTesting(); 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting( 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) active_layer->tilings()->tiling_at(0)->AllTilesForTesting(), 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_impl_.resource_provider()); 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()); 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MockQuadCuller quad_culler; 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AppendQuadsData data; 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) active_layer->WillDraw(DRAW_MODE_SOFTWARE, NULL); 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) active_layer->AppendQuads(&quad_culler, &data); 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) active_layer->DidDraw(NULL); 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(DrawQuad::TILED_CONTENT, quad_culler.quad_list()[0]->material); 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Tiles are ready at correct scale, so should not set had_incomplete_tile. 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(data.had_incomplete_tile); 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace cc 165