blob: bb3878d7c40df8f131364e4f8926a00098618595 [file] [log] [blame]
[email protected]94f206c12012-08-25 00:09:141// 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 "config.h"
6
[email protected]d50c6862012-10-23 02:08:317#include "cc/layer_iterator.h"
[email protected]94f206c12012-08-25 00:09:148
[email protected]a8461d82012-10-16 21:11:149#include "cc/layer.h"
[email protected]d50c6862012-10-23 02:08:3110#include "cc/layer_tree_host_common.h"
[email protected]7f0c53db2012-10-02 00:23:1811#include "testing/gmock/include/gmock/gmock.h"
12#include "testing/gtest/include/gtest/gtest.h"
[email protected]94f206c12012-08-25 00:09:1413#include <public/WebTransformationMatrix.h>
14
[email protected]9c88e562012-09-14 22:21:3015using namespace cc;
[email protected]94f206c12012-08-25 00:09:1416using WebKit::WebTransformationMatrix;
17using ::testing::Mock;
18using ::testing::_;
19using ::testing::AtLeast;
20using ::testing::AnyNumber;
21
22namespace {
23
[email protected]96baf3e2012-10-22 23:09:5524class TestLayer : public Layer {
[email protected]94f206c12012-08-25 00:09:1425public:
[email protected]96baf3e2012-10-22 23:09:5526 static scoped_refptr<TestLayer> create() { return make_scoped_refptr(new TestLayer()); }
[email protected]94f206c12012-08-25 00:09:1427
28 int m_countRepresentingTargetSurface;
29 int m_countRepresentingContributingSurface;
30 int m_countRepresentingItself;
31
32 virtual bool drawsContent() const OVERRIDE { return m_drawsContent; }
33 void setDrawsContent(bool drawsContent) { m_drawsContent = drawsContent; }
34
35private:
[email protected]96baf3e2012-10-22 23:09:5536 TestLayer()
37 : Layer()
[email protected]94f206c12012-08-25 00:09:1438 , m_drawsContent(true)
39 {
40 setBounds(IntSize(100, 100));
[email protected]9c88e562012-09-14 22:21:3041 setPosition(IntPoint());
42 setAnchorPoint(IntPoint());
[email protected]94f206c12012-08-25 00:09:1443 }
[email protected]96baf3e2012-10-22 23:09:5544 virtual ~TestLayer()
[email protected]d58499a2012-10-09 22:27:4745 {
46 }
[email protected]94f206c12012-08-25 00:09:1447
48 bool m_drawsContent;
49};
50
51#define EXPECT_COUNT(layer, target, contrib, itself) \
52 EXPECT_EQ(target, layer->m_countRepresentingTargetSurface); \
53 EXPECT_EQ(contrib, layer->m_countRepresentingContributingSurface); \
54 EXPECT_EQ(itself, layer->m_countRepresentingItself);
55
[email protected]96baf3e2012-10-22 23:09:5556typedef LayerIterator<Layer, std::vector<scoped_refptr<Layer> >, RenderSurface, LayerIteratorActions::FrontToBack> FrontToBack;
57typedef LayerIterator<Layer, std::vector<scoped_refptr<Layer> >, RenderSurface, LayerIteratorActions::BackToFront> BackToFront;
[email protected]94f206c12012-08-25 00:09:1458
[email protected]96baf3e2012-10-22 23:09:5559void resetCounts(std::vector<scoped_refptr<Layer> >& renderSurfaceLayerList)
[email protected]94f206c12012-08-25 00:09:1460{
61 for (unsigned surfaceIndex = 0; surfaceIndex < renderSurfaceLayerList.size(); ++surfaceIndex) {
[email protected]96baf3e2012-10-22 23:09:5562 TestLayer* renderSurfaceLayer = static_cast<TestLayer*>(renderSurfaceLayerList[surfaceIndex].get());
63 RenderSurface* renderSurface = renderSurfaceLayer->renderSurface();
[email protected]94f206c12012-08-25 00:09:1464
65 renderSurfaceLayer->m_countRepresentingTargetSurface = -1;
66 renderSurfaceLayer->m_countRepresentingContributingSurface = -1;
67 renderSurfaceLayer->m_countRepresentingItself = -1;
68
69 for (unsigned layerIndex = 0; layerIndex < renderSurface->layerList().size(); ++layerIndex) {
[email protected]96baf3e2012-10-22 23:09:5570 TestLayer* layer = static_cast<TestLayer*>(renderSurface->layerList()[layerIndex].get());
[email protected]94f206c12012-08-25 00:09:1471
72 layer->m_countRepresentingTargetSurface = -1;
73 layer->m_countRepresentingContributingSurface = -1;
74 layer->m_countRepresentingItself = -1;
75 }
76 }
77}
78
[email protected]96baf3e2012-10-22 23:09:5579void iterateFrontToBack(std::vector<scoped_refptr<Layer> >* renderSurfaceLayerList)
[email protected]94f206c12012-08-25 00:09:1480{
81 resetCounts(*renderSurfaceLayerList);
82 int count = 0;
83 for (FrontToBack it = FrontToBack::begin(renderSurfaceLayerList); it != FrontToBack::end(renderSurfaceLayerList); ++it, ++count) {
[email protected]96baf3e2012-10-22 23:09:5584 TestLayer* layer = static_cast<TestLayer*>(*it);
[email protected]94f206c12012-08-25 00:09:1485 if (it.representsTargetRenderSurface())
86 layer->m_countRepresentingTargetSurface = count;
87 if (it.representsContributingRenderSurface())
88 layer->m_countRepresentingContributingSurface = count;
89 if (it.representsItself())
90 layer->m_countRepresentingItself = count;
91 }
92}
93
[email protected]96baf3e2012-10-22 23:09:5594void iterateBackToFront(std::vector<scoped_refptr<Layer> >* renderSurfaceLayerList)
[email protected]94f206c12012-08-25 00:09:1495{
96 resetCounts(*renderSurfaceLayerList);
97 int count = 0;
98 for (BackToFront it = BackToFront::begin(renderSurfaceLayerList); it != BackToFront::end(renderSurfaceLayerList); ++it, ++count) {
[email protected]96baf3e2012-10-22 23:09:5599 TestLayer* layer = static_cast<TestLayer*>(*it);
[email protected]94f206c12012-08-25 00:09:14100 if (it.representsTargetRenderSurface())
101 layer->m_countRepresentingTargetSurface = count;
102 if (it.representsContributingRenderSurface())
103 layer->m_countRepresentingContributingSurface = count;
104 if (it.representsItself())
105 layer->m_countRepresentingItself = count;
106 }
107}
108
[email protected]96baf3e2012-10-22 23:09:55109TEST(LayerIteratorTest, emptyTree)
[email protected]94f206c12012-08-25 00:09:14110{
[email protected]96baf3e2012-10-22 23:09:55111 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList;
[email protected]94f206c12012-08-25 00:09:14112
113 iterateBackToFront(&renderSurfaceLayerList);
114 iterateFrontToBack(&renderSurfaceLayerList);
115}
116
[email protected]96baf3e2012-10-22 23:09:55117TEST(LayerIteratorTest, simpleTree)
[email protected]94f206c12012-08-25 00:09:14118{
[email protected]96baf3e2012-10-22 23:09:55119 scoped_refptr<TestLayer> rootLayer = TestLayer::create();
120 scoped_refptr<TestLayer> first = TestLayer::create();
121 scoped_refptr<TestLayer> second = TestLayer::create();
122 scoped_refptr<TestLayer> third = TestLayer::create();
123 scoped_refptr<TestLayer> fourth = TestLayer::create();
[email protected]94f206c12012-08-25 00:09:14124
125 rootLayer->createRenderSurface();
126
127 rootLayer->addChild(first);
128 rootLayer->addChild(second);
129 rootLayer->addChild(third);
130 rootLayer->addChild(fourth);
131
[email protected]96baf3e2012-10-22 23:09:55132 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList;
133 LayerTreeHostCommon::calculateDrawTransforms(rootLayer.get(), rootLayer->bounds(), 1, 256, renderSurfaceLayerList);
[email protected]94f206c12012-08-25 00:09:14134
135 iterateBackToFront(&renderSurfaceLayerList);
136 EXPECT_COUNT(rootLayer, 0, -1, 1);
137 EXPECT_COUNT(first, -1, -1, 2);
138 EXPECT_COUNT(second, -1, -1, 3);
139 EXPECT_COUNT(third, -1, -1, 4);
140 EXPECT_COUNT(fourth, -1, -1, 5);
141
142 iterateFrontToBack(&renderSurfaceLayerList);
143 EXPECT_COUNT(rootLayer, 5, -1, 4);
144 EXPECT_COUNT(first, -1, -1, 3);
145 EXPECT_COUNT(second, -1, -1, 2);
146 EXPECT_COUNT(third, -1, -1, 1);
147 EXPECT_COUNT(fourth, -1, -1, 0);
148
149}
150
[email protected]96baf3e2012-10-22 23:09:55151TEST(LayerIteratorTest, complexTree)
[email protected]94f206c12012-08-25 00:09:14152{
[email protected]96baf3e2012-10-22 23:09:55153 scoped_refptr<TestLayer> rootLayer = TestLayer::create();
154 scoped_refptr<TestLayer> root1 = TestLayer::create();
155 scoped_refptr<TestLayer> root2 = TestLayer::create();
156 scoped_refptr<TestLayer> root3 = TestLayer::create();
157 scoped_refptr<TestLayer> root21 = TestLayer::create();
158 scoped_refptr<TestLayer> root22 = TestLayer::create();
159 scoped_refptr<TestLayer> root23 = TestLayer::create();
160 scoped_refptr<TestLayer> root221 = TestLayer::create();
161 scoped_refptr<TestLayer> root231 = TestLayer::create();
[email protected]94f206c12012-08-25 00:09:14162
163 rootLayer->createRenderSurface();
164
165 rootLayer->addChild(root1);
166 rootLayer->addChild(root2);
167 rootLayer->addChild(root3);
168 root2->addChild(root21);
169 root2->addChild(root22);
170 root2->addChild(root23);
171 root22->addChild(root221);
172 root23->addChild(root231);
173
[email protected]96baf3e2012-10-22 23:09:55174 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList;
175 LayerTreeHostCommon::calculateDrawTransforms(rootLayer.get(), rootLayer->bounds(), 1, 256, renderSurfaceLayerList);
[email protected]94f206c12012-08-25 00:09:14176
177 iterateBackToFront(&renderSurfaceLayerList);
178 EXPECT_COUNT(rootLayer, 0, -1, 1);
179 EXPECT_COUNT(root1, -1, -1, 2);
180 EXPECT_COUNT(root2, -1, -1, 3);
181 EXPECT_COUNT(root21, -1, -1, 4);
182 EXPECT_COUNT(root22, -1, -1, 5);
183 EXPECT_COUNT(root221, -1, -1, 6);
184 EXPECT_COUNT(root23, -1, -1, 7);
185 EXPECT_COUNT(root231, -1, -1, 8);
186 EXPECT_COUNT(root3, -1, -1, 9);
187
188 iterateFrontToBack(&renderSurfaceLayerList);
189 EXPECT_COUNT(rootLayer, 9, -1, 8);
190 EXPECT_COUNT(root1, -1, -1, 7);
191 EXPECT_COUNT(root2, -1, -1, 6);
192 EXPECT_COUNT(root21, -1, -1, 5);
193 EXPECT_COUNT(root22, -1, -1, 4);
194 EXPECT_COUNT(root221, -1, -1, 3);
195 EXPECT_COUNT(root23, -1, -1, 2);
196 EXPECT_COUNT(root231, -1, -1, 1);
197 EXPECT_COUNT(root3, -1, -1, 0);
198
199}
200
[email protected]96baf3e2012-10-22 23:09:55201TEST(LayerIteratorTest, complexTreeMultiSurface)
[email protected]94f206c12012-08-25 00:09:14202{
[email protected]96baf3e2012-10-22 23:09:55203 scoped_refptr<TestLayer> rootLayer = TestLayer::create();
204 scoped_refptr<TestLayer> root1 = TestLayer::create();
205 scoped_refptr<TestLayer> root2 = TestLayer::create();
206 scoped_refptr<TestLayer> root3 = TestLayer::create();
207 scoped_refptr<TestLayer> root21 = TestLayer::create();
208 scoped_refptr<TestLayer> root22 = TestLayer::create();
209 scoped_refptr<TestLayer> root23 = TestLayer::create();
210 scoped_refptr<TestLayer> root221 = TestLayer::create();
211 scoped_refptr<TestLayer> root231 = TestLayer::create();
[email protected]94f206c12012-08-25 00:09:14212
213 rootLayer->createRenderSurface();
214 rootLayer->renderSurface()->setContentRect(IntRect(IntPoint(), rootLayer->bounds()));
215
216 rootLayer->addChild(root1);
217 rootLayer->addChild(root2);
218 rootLayer->addChild(root3);
219 root2->setDrawsContent(false);
220 root2->setOpacity(0.5); // Force the layer to own a new surface.
221 root2->addChild(root21);
222 root2->addChild(root22);
223 root2->addChild(root23);
224 root22->setOpacity(0.5);
225 root22->addChild(root221);
226 root23->setOpacity(0.5);
227 root23->addChild(root231);
228
[email protected]96baf3e2012-10-22 23:09:55229 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList;
230 LayerTreeHostCommon::calculateDrawTransforms(rootLayer.get(), rootLayer->bounds(), 1, 256, renderSurfaceLayerList);
[email protected]94f206c12012-08-25 00:09:14231
232 iterateBackToFront(&renderSurfaceLayerList);
233 EXPECT_COUNT(rootLayer, 0, -1, 1);
234 EXPECT_COUNT(root1, -1, -1, 2);
235 EXPECT_COUNT(root2, 4, 3, -1);
236 EXPECT_COUNT(root21, -1, -1, 5);
237 EXPECT_COUNT(root22, 7, 6, 8);
238 EXPECT_COUNT(root221, -1, -1, 9);
239 EXPECT_COUNT(root23, 11, 10, 12);
240 EXPECT_COUNT(root231, -1, -1, 13);
241 EXPECT_COUNT(root3, -1, -1, 14);
242
243 iterateFrontToBack(&renderSurfaceLayerList);
244 EXPECT_COUNT(rootLayer, 14, -1, 13);
245 EXPECT_COUNT(root1, -1, -1, 12);
246 EXPECT_COUNT(root2, 10, 11, -1);
247 EXPECT_COUNT(root21, -1, -1, 9);
248 EXPECT_COUNT(root22, 7, 8, 6);
249 EXPECT_COUNT(root221, -1, -1, 5);
250 EXPECT_COUNT(root23, 3, 4, 2);
251 EXPECT_COUNT(root231, -1, -1, 1);
252 EXPECT_COUNT(root3, -1, -1, 0);
253}
254
255} // namespace