Home | History | Annotate | Download | only in layers
      1 // Copyright 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "cc/layers/layer_iterator.h"
      6 
      7 #include <vector>
      8 
      9 #include "cc/layers/layer.h"
     10 #include "cc/test/fake_layer_tree_host.h"
     11 #include "cc/trees/layer_tree_host_common.h"
     12 #include "testing/gmock/include/gmock/gmock.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 #include "ui/gfx/transform.h"
     15 
     16 using ::testing::Mock;
     17 using ::testing::_;
     18 using ::testing::AtLeast;
     19 using ::testing::AnyNumber;
     20 
     21 namespace cc {
     22 namespace {
     23 
     24 class TestLayer : public Layer {
     25  public:
     26   static scoped_refptr<TestLayer> Create() {
     27     return make_scoped_refptr(new TestLayer());
     28   }
     29 
     30   int count_representing_target_surface_;
     31   int count_representing_contributing_surface_;
     32   int count_representing_itself_;
     33 
     34   virtual bool DrawsContent() const OVERRIDE { return draws_content_; }
     35   void set_draws_content(bool draws_content) { draws_content_ = draws_content; }
     36 
     37  private:
     38   TestLayer() : Layer(), draws_content_(true) {
     39     SetBounds(gfx::Size(100, 100));
     40     SetPosition(gfx::Point());
     41   }
     42   virtual ~TestLayer() {}
     43 
     44   bool draws_content_;
     45 };
     46 
     47 #define EXPECT_COUNT(layer, target, contrib, itself)                           \
     48   EXPECT_EQ(target, layer->count_representing_target_surface_);                \
     49   EXPECT_EQ(contrib, layer->count_representing_contributing_surface_);         \
     50   EXPECT_EQ(itself, layer->count_representing_itself_);
     51 
     52 typedef LayerIterator<Layer> FrontToBack;
     53 
     54 void ResetCounts(RenderSurfaceLayerList* render_surface_layer_list) {
     55   for (unsigned surface_index = 0;
     56        surface_index < render_surface_layer_list->size();
     57        ++surface_index) {
     58     TestLayer* render_surface_layer = static_cast<TestLayer*>(
     59         render_surface_layer_list->at(surface_index));
     60     RenderSurface* render_surface = render_surface_layer->render_surface();
     61 
     62     render_surface_layer->count_representing_target_surface_ = -1;
     63     render_surface_layer->count_representing_contributing_surface_ = -1;
     64     render_surface_layer->count_representing_itself_ = -1;
     65 
     66     for (unsigned layer_index = 0;
     67          layer_index < render_surface->layer_list().size();
     68          ++layer_index) {
     69       TestLayer* layer = static_cast<TestLayer*>(
     70           render_surface->layer_list().at(layer_index).get());
     71 
     72       layer->count_representing_target_surface_ = -1;
     73       layer->count_representing_contributing_surface_ = -1;
     74       layer->count_representing_itself_ = -1;
     75     }
     76   }
     77 }
     78 
     79 void IterateFrontToBack(
     80     RenderSurfaceLayerList* render_surface_layer_list) {
     81   ResetCounts(render_surface_layer_list);
     82   int count = 0;
     83   for (FrontToBack it = FrontToBack::Begin(render_surface_layer_list);
     84        it != FrontToBack::End(render_surface_layer_list);
     85        ++it, ++count) {
     86     TestLayer* layer = static_cast<TestLayer*>(*it);
     87     if (it.represents_target_render_surface())
     88       layer->count_representing_target_surface_ = count;
     89     if (it.represents_contributing_render_surface())
     90       layer->count_representing_contributing_surface_ = count;
     91     if (it.represents_itself())
     92       layer->count_representing_itself_ = count;
     93   }
     94 }
     95 
     96 TEST(LayerIteratorTest, EmptyTree) {
     97   RenderSurfaceLayerList render_surface_layer_list;
     98 
     99   IterateFrontToBack(&render_surface_layer_list);
    100 }
    101 
    102 TEST(LayerIteratorTest, SimpleTree) {
    103   scoped_refptr<TestLayer> root_layer = TestLayer::Create();
    104   scoped_refptr<TestLayer> first = TestLayer::Create();
    105   scoped_refptr<TestLayer> second = TestLayer::Create();
    106   scoped_refptr<TestLayer> third = TestLayer::Create();
    107   scoped_refptr<TestLayer> fourth = TestLayer::Create();
    108 
    109   root_layer->AddChild(first);
    110   root_layer->AddChild(second);
    111   root_layer->AddChild(third);
    112   root_layer->AddChild(fourth);
    113 
    114   scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create();
    115   host->SetRootLayer(root_layer);
    116 
    117   RenderSurfaceLayerList render_surface_layer_list;
    118   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
    119       root_layer.get(), root_layer->bounds(), &render_surface_layer_list);
    120   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
    121 
    122   IterateFrontToBack(&render_surface_layer_list);
    123   EXPECT_COUNT(root_layer, 5, -1, 4);
    124   EXPECT_COUNT(first, -1, -1, 3);
    125   EXPECT_COUNT(second, -1, -1, 2);
    126   EXPECT_COUNT(third, -1, -1, 1);
    127   EXPECT_COUNT(fourth, -1, -1, 0);
    128 }
    129 
    130 TEST(LayerIteratorTest, ComplexTree) {
    131   scoped_refptr<TestLayer> root_layer = TestLayer::Create();
    132   scoped_refptr<TestLayer> root1 = TestLayer::Create();
    133   scoped_refptr<TestLayer> root2 = TestLayer::Create();
    134   scoped_refptr<TestLayer> root3 = TestLayer::Create();
    135   scoped_refptr<TestLayer> root21 = TestLayer::Create();
    136   scoped_refptr<TestLayer> root22 = TestLayer::Create();
    137   scoped_refptr<TestLayer> root23 = TestLayer::Create();
    138   scoped_refptr<TestLayer> root221 = TestLayer::Create();
    139   scoped_refptr<TestLayer> root231 = TestLayer::Create();
    140 
    141   root_layer->AddChild(root1);
    142   root_layer->AddChild(root2);
    143   root_layer->AddChild(root3);
    144   root2->AddChild(root21);
    145   root2->AddChild(root22);
    146   root2->AddChild(root23);
    147   root22->AddChild(root221);
    148   root23->AddChild(root231);
    149 
    150   scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create();
    151   host->SetRootLayer(root_layer);
    152 
    153   RenderSurfaceLayerList render_surface_layer_list;
    154   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
    155       root_layer.get(), root_layer->bounds(), &render_surface_layer_list);
    156   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
    157 
    158   IterateFrontToBack(&render_surface_layer_list);
    159   EXPECT_COUNT(root_layer, 9, -1, 8);
    160   EXPECT_COUNT(root1, -1, -1, 7);
    161   EXPECT_COUNT(root2, -1, -1, 6);
    162   EXPECT_COUNT(root21, -1, -1, 5);
    163   EXPECT_COUNT(root22, -1, -1, 4);
    164   EXPECT_COUNT(root221, -1, -1, 3);
    165   EXPECT_COUNT(root23, -1, -1, 2);
    166   EXPECT_COUNT(root231, -1, -1, 1);
    167   EXPECT_COUNT(root3, -1, -1, 0);
    168 }
    169 
    170 TEST(LayerIteratorTest, ComplexTreeMultiSurface) {
    171   scoped_refptr<TestLayer> root_layer = TestLayer::Create();
    172   scoped_refptr<TestLayer> root1 = TestLayer::Create();
    173   scoped_refptr<TestLayer> root2 = TestLayer::Create();
    174   scoped_refptr<TestLayer> root3 = TestLayer::Create();
    175   scoped_refptr<TestLayer> root21 = TestLayer::Create();
    176   scoped_refptr<TestLayer> root22 = TestLayer::Create();
    177   scoped_refptr<TestLayer> root23 = TestLayer::Create();
    178   scoped_refptr<TestLayer> root221 = TestLayer::Create();
    179   scoped_refptr<TestLayer> root231 = TestLayer::Create();
    180 
    181   root_layer->AddChild(root1);
    182   root_layer->AddChild(root2);
    183   root_layer->AddChild(root3);
    184   root2->set_draws_content(false);
    185   root2->SetOpacity(0.5f);
    186   root2->SetForceRenderSurface(true);  // Force the layer to own a new surface.
    187   root2->AddChild(root21);
    188   root2->AddChild(root22);
    189   root2->AddChild(root23);
    190   root22->SetOpacity(0.5f);
    191   root22->AddChild(root221);
    192   root23->SetOpacity(0.5f);
    193   root23->AddChild(root231);
    194 
    195   scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create();
    196   host->SetRootLayer(root_layer);
    197 
    198   RenderSurfaceLayerList render_surface_layer_list;
    199   LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
    200       root_layer.get(), root_layer->bounds(), &render_surface_layer_list);
    201   LayerTreeHostCommon::CalculateDrawProperties(&inputs);
    202 
    203   IterateFrontToBack(&render_surface_layer_list);
    204   EXPECT_COUNT(root_layer, 14, -1, 13);
    205   EXPECT_COUNT(root1, -1, -1, 12);
    206   EXPECT_COUNT(root2, 10, 11, -1);
    207   EXPECT_COUNT(root21, -1, -1, 9);
    208   EXPECT_COUNT(root22, 7, 8, 6);
    209   EXPECT_COUNT(root221, -1, -1, 5);
    210   EXPECT_COUNT(root23, 3, 4, 2);
    211   EXPECT_COUNT(root231, -1, -1, 1);
    212   EXPECT_COUNT(root3, -1, -1, 0);
    213 }
    214 
    215 }  // namespace
    216 }  // namespace cc
    217