12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/solid_color_layer_impl.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/append_quads_data.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/solid_color_layer.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/quads/solid_color_draw_quad.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_impl_proxy.h"
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_layer_tree_host.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_test_common.h"
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(SolidColorLayerImplTest, VerifyTilingCompleteAndNoOverlap) {
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  MockOcclusionTracker<LayerImpl> occlusion_tracker;
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<RenderPass> render_pass = RenderPass::Create();
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size layer_size = gfx::Size(800, 600);
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect visible_content_rect = gfx::Rect(layer_size);
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeImplProxy proxy;
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestSharedBitmapManager shared_bitmap_manager;
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SolidColorLayerImpl> layer =
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SolidColorLayerImpl::Create(host_impl.active_tree(), 1);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->draw_properties().visible_content_rect = visible_content_rect;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetBounds(layer_size);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetContentBounds(layer_size);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->CreateRenderSurface();
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->draw_properties().render_target = layer.get();
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendQuadsData data;
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  layer->AppendQuads(render_pass.get(), occlusion_tracker, &data);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  LayerTestCommon::VerifyQuadsExactlyCoverRect(render_pass->quad_list,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               visible_content_rect);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(SolidColorLayerImplTest, VerifyCorrectBackgroundColorInQuad) {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkColor test_color = 0xFFA55AFF;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  MockOcclusionTracker<LayerImpl> occlusion_tracker;
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<RenderPass> render_pass = RenderPass::Create();
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size layer_size = gfx::Size(100, 100);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect visible_content_rect = gfx::Rect(layer_size);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeImplProxy proxy;
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestSharedBitmapManager shared_bitmap_manager;
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SolidColorLayerImpl> layer =
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SolidColorLayerImpl::Create(host_impl.active_tree(), 1);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->draw_properties().visible_content_rect = visible_content_rect;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetBounds(layer_size);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetContentBounds(layer_size);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetBackgroundColor(test_color);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->CreateRenderSurface();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->draw_properties().render_target = layer.get();
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendQuadsData data;
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  layer->AppendQuads(render_pass.get(), occlusion_tracker, &data);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(render_pass->quad_list.size(), 1U);
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      SolidColorDrawQuad::MaterialCast(render_pass->quad_list.front())->color,
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test_color);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(SolidColorLayerImplTest, VerifyCorrectOpacityInQuad) {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const float opacity = 0.5f;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  MockOcclusionTracker<LayerImpl> occlusion_tracker;
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<RenderPass> render_pass = RenderPass::Create();
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size layer_size = gfx::Size(100, 100);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect visible_content_rect = gfx::Rect(layer_size);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeImplProxy proxy;
8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TestSharedBitmapManager shared_bitmap_manager;
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<SolidColorLayerImpl> layer =
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SolidColorLayerImpl::Create(host_impl.active_tree(), 1);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->draw_properties().visible_content_rect = visible_content_rect;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetBounds(layer_size);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetContentBounds(layer_size);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->draw_properties().opacity = opacity;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->CreateRenderSurface();
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->draw_properties().render_target = layer.get();
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AppendQuadsData data;
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  layer->AppendQuads(render_pass.get(), occlusion_tracker, &data);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(render_pass->quad_list.size(), 1U);
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(opacity,
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            SolidColorDrawQuad::MaterialCast(render_pass->quad_list.front())
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ->opacity());
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(SolidColorLayerImplTest, VerifyOpaqueRect) {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size layer_size = gfx::Size(100, 100);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect visible_content_rect = gfx::Rect(layer_size);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<SolidColorLayer> layer = SolidColorLayer::Create();
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetBounds(layer_size);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetForceRenderSurface(true);
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Layer> root = Layer::Create();
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root->AddChild(layer);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(&client);
121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  host->SetRootLayer(root);
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RenderSurfaceLayerList render_surface_layer_list;
124558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      root.get(), gfx::Size(500, 500), &render_surface_layer_list);
126558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(layer->contents_opaque());
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetBackgroundColor(SkColorSetARGBInline(255, 10, 20, 30));
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(layer->contents_opaque());
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<SolidColorLayerImpl> layer_impl =
133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        SolidColorLayerImpl::Create(host->host_impl()->active_tree(),
134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                    layer->id());
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->PushPropertiesTo(layer_impl.get());
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The impl layer should call itself opaque as well.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(layer_impl->contents_opaque());
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Impl layer has 1 opacity, and the color is opaque, so the opaque_rect
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // should be the full tile.
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_impl->draw_properties().opacity = 1;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MockOcclusionTracker<LayerImpl> occlusion_tracker;
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<RenderPass> render_pass = RenderPass::Create();
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendQuadsData data;
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    layer_impl->AppendQuads(render_pass.get(), occlusion_tracker, &data);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_EQ(render_pass->quad_list.size(), 1U);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(visible_content_rect.ToString(),
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              render_pass->quad_list.front()->opaque_rect.ToString());
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(layer->contents_opaque());
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetBackgroundColor(SkColorSetARGBInline(254, 10, 20, 30));
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(layer->contents_opaque());
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<SolidColorLayerImpl> layer_impl =
160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        SolidColorLayerImpl::Create(host->host_impl()->active_tree(),
161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                    layer->id());
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->PushPropertiesTo(layer_impl.get());
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The impl layer should callnot itself opaque anymore.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FALSE(layer_impl->contents_opaque());
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Impl layer has 1 opacity, but the color is not opaque, so the opaque_rect
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // should be empty.
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_impl->draw_properties().opacity = 1;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    MockOcclusionTracker<LayerImpl> occlusion_tracker;
172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_ptr<RenderPass> render_pass = RenderPass::Create();
173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AppendQuadsData data;
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    layer_impl->AppendQuads(render_pass.get(), occlusion_tracker, &data);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_EQ(render_pass->quad_list.size(), 1U);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(gfx::Rect().ToString(),
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              render_pass->quad_list.front()->opaque_rect.ToString());
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST(SolidColorLayerImplTest, Occlusion) {
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Size layer_size(1000, 1000);
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Size viewport_size(1000, 1000);
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  LayerTestCommon::LayerImplTest impl;
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SolidColorLayerImpl* solid_color_layer_impl =
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      impl.AddChildToRoot<SolidColorLayerImpl>();
191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  solid_color_layer_impl->SetBackgroundColor(SkColorSetARGB(255, 10, 20, 30));
192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  solid_color_layer_impl->SetBounds(layer_size);
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  solid_color_layer_impl->SetContentBounds(layer_size);
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  solid_color_layer_impl->SetDrawsContent(true);
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  impl.CalcDrawProps(viewport_size);
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
19923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    SCOPED_TRACE("No occlusion");
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect occluded;
20123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    impl.AppendQuadsWithOcclusion(solid_color_layer_impl, occluded);
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
20323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(),
20423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                 gfx::Rect(layer_size));
20523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(16u, impl.quad_list().size());
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
20923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    SCOPED_TRACE("Full occlusion");
21023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    gfx::Rect occluded(solid_color_layer_impl->visible_content_rect());
21123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    impl.AppendQuadsWithOcclusion(solid_color_layer_impl, occluded);
21223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
21323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(), gfx::Rect());
21423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(impl.quad_list().size(), 0u);
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {
21823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    SCOPED_TRACE("Partial occlusion");
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Rect occluded(200, 200, 256 * 3, 256 * 3);
22023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    impl.AppendQuadsWithOcclusion(solid_color_layer_impl, occluded);
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    size_t partially_occluded_count = 0;
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    LayerTestCommon::VerifyQuadsAreOccluded(
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        impl.quad_list(), occluded, &partially_occluded_count);
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // 4 quads are completely occluded, 8 are partially occluded.
22623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(16u - 4u, impl.quad_list().size());
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(8u, partially_occluded_count);
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
233