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) 7c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org#include "cc/layers/append_quads_data.h" 8c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org#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" 14c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org#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) } 26c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org 27c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org PictureLayerTilingSet* tilings() { return tilings_.get(); } 28c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org 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() 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (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) 41c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org scoped_ptr<TestablePictureImageLayerImpl> CreateLayer(int id, 42c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org WhichTree which_tree) { 43c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org LayerTreeImpl* tree = NULL; 44c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org switch (which_tree) { 45c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org case ACTIVE_TREE: 46c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org tree = host_impl_.active_tree(); 47c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org break; 48c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org case PENDING_TREE: 49c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org tree = host_impl_.pending_tree(); 50c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org break; 51c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org case NUM_TREES: 52c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org NOTREACHED(); 53c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org break; 54c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org } 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TestablePictureImageLayerImpl* layer = 56c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org 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) 68c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org 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) { 75c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org 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) { 90c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org 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) 107c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.orgTEST_F(PictureImageLayerImplTest, IgnoreIdealContentScale) { 108c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org scoped_ptr<TestablePictureImageLayerImpl> pending_layer( 109c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org CreateLayer(1, PENDING_TREE)); 110c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org pending_layer->SetDrawsContent(true); 111c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org 112c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org // Set PictureLayerImpl::ideal_contents_scale_ to 2.f which is not equal 113c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org // to the content scale used by PictureImageLayerImpl. 114c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org const float suggested_ideal_contents_scale = 2.f; 115c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org const float device_scale_factor = 3.f; 116c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org const float page_scale_factor = 4.f; 117c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org const bool animating_transform_to_screen = false; 118c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org float contents_scale_x; 119c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org float contents_scale_y; 120c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org gfx::Size content_bounds; 121c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org pending_layer->CalculateContentsScale(suggested_ideal_contents_scale, 122c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org device_scale_factor, 123c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org page_scale_factor, 124c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org animating_transform_to_screen, 125c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org &contents_scale_x, 126c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org &contents_scale_y, 127c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org &content_bounds); 128c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org 129c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org // Push to active layer. 130c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org host_impl_.ActivatePendingTree(); 131c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org scoped_ptr<TestablePictureImageLayerImpl> active_layer( 132c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org CreateLayer(1, ACTIVE_TREE)); 133c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org pending_layer->PushPropertiesTo(active_layer.get()); 134c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org active_layer->CalculateContentsScale(suggested_ideal_contents_scale, 135c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org device_scale_factor, 136c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org page_scale_factor, 137c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org animating_transform_to_screen, 138c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org &contents_scale_x, 139c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org &contents_scale_y, 140c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org &content_bounds); 141c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org 142c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org // Create tile and resource. 143c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org active_layer->tilings()->tiling_at(0)->CreateAllTilesForTesting(); 144c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting( 145c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org active_layer->tilings()->tiling_at(0)->AllTilesForTesting(), 146c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org host_impl_.resource_provider()); 147c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org 148c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org // Draw. 149c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org active_layer->draw_properties().visible_content_rect = 150c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org gfx::Rect(active_layer->bounds()); 151c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org MockQuadCuller quad_culler; 152c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org AppendQuadsData data; 153c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org active_layer->WillDraw(DRAW_MODE_SOFTWARE, NULL); 154c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org active_layer->AppendQuads(&quad_culler, &data); 155c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org active_layer->DidDraw(NULL); 156c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org 157c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org EXPECT_EQ(DrawQuad::TILED_CONTENT, quad_culler.quad_list()[0]->material); 158c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org 159c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org // Tiles are ready at correct scale, so should not set had_incomplete_tile. 160c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org EXPECT_FALSE(data.had_incomplete_tile); 161c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org} 162c0a2024fa1318649ee7d91c4e630f1e529444550boliu@chromium.org 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace cc 165