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