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