| // Copyright 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "cc/layers/layer_iterator.h" |
| |
| #include <vector> |
| |
| #include "cc/layers/layer.h" |
| #include "cc/test/fake_layer_tree_host.h" |
| #include "cc/trees/layer_tree_host_common.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/gfx/transform.h" |
| |
| using ::testing::Mock; |
| using ::testing::_; |
| using ::testing::AtLeast; |
| using ::testing::AnyNumber; |
| |
| namespace cc { |
| namespace { |
| |
| class TestLayer : public Layer { |
| public: |
| static scoped_refptr<TestLayer> Create() { |
| return make_scoped_refptr(new TestLayer()); |
| } |
| |
| int count_representing_target_surface_; |
| int count_representing_contributing_surface_; |
| int count_representing_itself_; |
| |
| virtual bool DrawsContent() const OVERRIDE { return draws_content_; } |
| void set_draws_content(bool draws_content) { draws_content_ = draws_content; } |
| |
| private: |
| TestLayer() : Layer(), draws_content_(true) { |
| SetBounds(gfx::Size(100, 100)); |
| SetPosition(gfx::Point()); |
| } |
| virtual ~TestLayer() {} |
| |
| bool draws_content_; |
| }; |
| |
| #define EXPECT_COUNT(layer, target, contrib, itself) \ |
| EXPECT_EQ(target, layer->count_representing_target_surface_); \ |
| EXPECT_EQ(contrib, layer->count_representing_contributing_surface_); \ |
| EXPECT_EQ(itself, layer->count_representing_itself_); |
| |
| typedef LayerIterator<Layer> FrontToBack; |
| |
| void ResetCounts(RenderSurfaceLayerList* render_surface_layer_list) { |
| for (unsigned surface_index = 0; |
| surface_index < render_surface_layer_list->size(); |
| ++surface_index) { |
| TestLayer* render_surface_layer = static_cast<TestLayer*>( |
| render_surface_layer_list->at(surface_index)); |
| RenderSurface* render_surface = render_surface_layer->render_surface(); |
| |
| render_surface_layer->count_representing_target_surface_ = -1; |
| render_surface_layer->count_representing_contributing_surface_ = -1; |
| render_surface_layer->count_representing_itself_ = -1; |
| |
| for (unsigned layer_index = 0; |
| layer_index < render_surface->layer_list().size(); |
| ++layer_index) { |
| TestLayer* layer = static_cast<TestLayer*>( |
| render_surface->layer_list().at(layer_index).get()); |
| |
| layer->count_representing_target_surface_ = -1; |
| layer->count_representing_contributing_surface_ = -1; |
| layer->count_representing_itself_ = -1; |
| } |
| } |
| } |
| |
| void IterateFrontToBack( |
| RenderSurfaceLayerList* render_surface_layer_list) { |
| ResetCounts(render_surface_layer_list); |
| int count = 0; |
| for (FrontToBack it = FrontToBack::Begin(render_surface_layer_list); |
| it != FrontToBack::End(render_surface_layer_list); |
| ++it, ++count) { |
| TestLayer* layer = static_cast<TestLayer*>(*it); |
| if (it.represents_target_render_surface()) |
| layer->count_representing_target_surface_ = count; |
| if (it.represents_contributing_render_surface()) |
| layer->count_representing_contributing_surface_ = count; |
| if (it.represents_itself()) |
| layer->count_representing_itself_ = count; |
| } |
| } |
| |
| TEST(LayerIteratorTest, EmptyTree) { |
| RenderSurfaceLayerList render_surface_layer_list; |
| |
| IterateFrontToBack(&render_surface_layer_list); |
| } |
| |
| TEST(LayerIteratorTest, SimpleTree) { |
| scoped_refptr<TestLayer> root_layer = TestLayer::Create(); |
| scoped_refptr<TestLayer> first = TestLayer::Create(); |
| scoped_refptr<TestLayer> second = TestLayer::Create(); |
| scoped_refptr<TestLayer> third = TestLayer::Create(); |
| scoped_refptr<TestLayer> fourth = TestLayer::Create(); |
| |
| root_layer->AddChild(first); |
| root_layer->AddChild(second); |
| root_layer->AddChild(third); |
| root_layer->AddChild(fourth); |
| |
| scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(); |
| host->SetRootLayer(root_layer); |
| |
| RenderSurfaceLayerList render_surface_layer_list; |
| LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs( |
| root_layer.get(), root_layer->bounds(), &render_surface_layer_list); |
| LayerTreeHostCommon::CalculateDrawProperties(&inputs); |
| |
| IterateFrontToBack(&render_surface_layer_list); |
| EXPECT_COUNT(root_layer, 5, -1, 4); |
| EXPECT_COUNT(first, -1, -1, 3); |
| EXPECT_COUNT(second, -1, -1, 2); |
| EXPECT_COUNT(third, -1, -1, 1); |
| EXPECT_COUNT(fourth, -1, -1, 0); |
| } |
| |
| TEST(LayerIteratorTest, ComplexTree) { |
| scoped_refptr<TestLayer> root_layer = TestLayer::Create(); |
| scoped_refptr<TestLayer> root1 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root2 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root3 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root21 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root22 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root23 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root221 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root231 = TestLayer::Create(); |
| |
| root_layer->AddChild(root1); |
| root_layer->AddChild(root2); |
| root_layer->AddChild(root3); |
| root2->AddChild(root21); |
| root2->AddChild(root22); |
| root2->AddChild(root23); |
| root22->AddChild(root221); |
| root23->AddChild(root231); |
| |
| scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(); |
| host->SetRootLayer(root_layer); |
| |
| RenderSurfaceLayerList render_surface_layer_list; |
| LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs( |
| root_layer.get(), root_layer->bounds(), &render_surface_layer_list); |
| LayerTreeHostCommon::CalculateDrawProperties(&inputs); |
| |
| IterateFrontToBack(&render_surface_layer_list); |
| EXPECT_COUNT(root_layer, 9, -1, 8); |
| EXPECT_COUNT(root1, -1, -1, 7); |
| EXPECT_COUNT(root2, -1, -1, 6); |
| EXPECT_COUNT(root21, -1, -1, 5); |
| EXPECT_COUNT(root22, -1, -1, 4); |
| EXPECT_COUNT(root221, -1, -1, 3); |
| EXPECT_COUNT(root23, -1, -1, 2); |
| EXPECT_COUNT(root231, -1, -1, 1); |
| EXPECT_COUNT(root3, -1, -1, 0); |
| } |
| |
| TEST(LayerIteratorTest, ComplexTreeMultiSurface) { |
| scoped_refptr<TestLayer> root_layer = TestLayer::Create(); |
| scoped_refptr<TestLayer> root1 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root2 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root3 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root21 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root22 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root23 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root221 = TestLayer::Create(); |
| scoped_refptr<TestLayer> root231 = TestLayer::Create(); |
| |
| root_layer->AddChild(root1); |
| root_layer->AddChild(root2); |
| root_layer->AddChild(root3); |
| root2->set_draws_content(false); |
| root2->SetOpacity(0.5f); |
| root2->SetForceRenderSurface(true); // Force the layer to own a new surface. |
| root2->AddChild(root21); |
| root2->AddChild(root22); |
| root2->AddChild(root23); |
| root22->SetOpacity(0.5f); |
| root22->AddChild(root221); |
| root23->SetOpacity(0.5f); |
| root23->AddChild(root231); |
| |
| scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(); |
| host->SetRootLayer(root_layer); |
| |
| RenderSurfaceLayerList render_surface_layer_list; |
| LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs( |
| root_layer.get(), root_layer->bounds(), &render_surface_layer_list); |
| LayerTreeHostCommon::CalculateDrawProperties(&inputs); |
| |
| IterateFrontToBack(&render_surface_layer_list); |
| EXPECT_COUNT(root_layer, 14, -1, 13); |
| EXPECT_COUNT(root1, -1, -1, 12); |
| EXPECT_COUNT(root2, 10, 11, -1); |
| EXPECT_COUNT(root21, -1, -1, 9); |
| EXPECT_COUNT(root22, 7, 8, 6); |
| EXPECT_COUNT(root221, -1, -1, 5); |
| EXPECT_COUNT(root23, 3, 4, 2); |
| EXPECT_COUNT(root231, -1, -1, 1); |
| EXPECT_COUNT(root3, -1, -1, 0); |
| } |
| |
| } // namespace |
| } // namespace cc |