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