Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: cc/trees/layer_tree_host_common_unittest.cc

Issue 1057283003: Remove parts of //cc we aren't using (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/layer_tree_host_common_perftest.cc ('k') | cc/trees/layer_tree_host_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2011 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/trees/layer_tree_host_common.h"
6
7 #include <algorithm>
8 #include <set>
9
10 #include "cc/animation/layer_animation_controller.h"
11 #include "cc/animation/transform_operations.h"
12 #include "cc/base/math_util.h"
13 #include "cc/layers/content_layer.h"
14 #include "cc/layers/content_layer_client.h"
15 #include "cc/layers/layer.h"
16 #include "cc/layers/layer_client.h"
17 #include "cc/layers/layer_impl.h"
18 #include "cc/layers/layer_iterator.h"
19 #include "cc/layers/render_surface.h"
20 #include "cc/layers/render_surface_impl.h"
21 #include "cc/output/copy_output_request.h"
22 #include "cc/output/copy_output_result.h"
23 #include "cc/test/animation_test_common.h"
24 #include "cc/test/fake_impl_proxy.h"
25 #include "cc/test/fake_layer_tree_host.h"
26 #include "cc/test/fake_layer_tree_host_impl.h"
27 #include "cc/test/fake_picture_layer.h"
28 #include "cc/test/fake_picture_layer_impl.h"
29 #include "cc/test/geometry_test_utils.h"
30 #include "cc/test/layer_tree_host_common_test.h"
31 #include "cc/test/test_task_graph_runner.h"
32 #include "cc/trees/layer_tree_impl.h"
33 #include "cc/trees/proxy.h"
34 #include "cc/trees/single_thread_proxy.h"
35 #include "testing/gmock/include/gmock/gmock.h"
36 #include "testing/gtest/include/gtest/gtest.h"
37 #include "ui/gfx/geometry/quad_f.h"
38 #include "ui/gfx/geometry/vector2d_conversions.h"
39 #include "ui/gfx/transform.h"
40
41 namespace cc {
42 namespace {
43
44 class LayerWithForcedDrawsContent : public Layer {
45 public:
46 LayerWithForcedDrawsContent() {}
47
48 bool DrawsContent() const override;
49
50 private:
51 ~LayerWithForcedDrawsContent() override {}
52 };
53
54 bool LayerWithForcedDrawsContent::DrawsContent() const { return true; }
55
56 class MockContentLayerClient : public ContentLayerClient {
57 public:
58 MockContentLayerClient() {}
59 ~MockContentLayerClient() override {}
60 void PaintContents(SkCanvas* canvas,
61 const gfx::Rect& clip,
62 PaintingControlSetting picture_control) override {}
63 scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
64 const gfx::Rect& clip,
65 PaintingControlSetting picture_control) override {
66 NOTIMPLEMENTED();
67 return DisplayItemList::Create();
68 }
69 bool FillsBoundsCompletely() const override { return false; }
70 };
71
72 scoped_refptr<FakePictureLayer> CreateDrawablePictureLayer(
73 ContentLayerClient* delegate) {
74 scoped_refptr<FakePictureLayer> to_return =
75 FakePictureLayer::Create(delegate);
76 to_return->SetIsDrawable(true);
77 return to_return;
78 }
79
80 scoped_refptr<ContentLayer> CreateDrawableContentLayer(
81 ContentLayerClient* delegate) {
82 scoped_refptr<ContentLayer> to_return = ContentLayer::Create(delegate);
83 to_return->SetIsDrawable(true);
84 return to_return;
85 }
86
87 #define EXPECT_CONTENTS_SCALE_EQ(expected, layer) \
88 do { \
89 EXPECT_FLOAT_EQ(expected, layer->contents_scale_x()); \
90 EXPECT_FLOAT_EQ(expected, layer->contents_scale_y()); \
91 } while (false)
92
93 #define EXPECT_IDEAL_SCALE_EQ(expected, layer) \
94 do { \
95 EXPECT_FLOAT_EQ(expected, layer->draw_properties().ideal_contents_scale); \
96 } while (false)
97
98 TEST_F(LayerTreeHostCommonTest, TransformsForNoOpLayer) {
99 // Sanity check: For layers positioned at zero, with zero size,
100 // and with identity transforms, then the draw transform,
101 // screen space transform, and the hierarchy passed on to children
102 // layers should also be identity transforms.
103
104 scoped_refptr<Layer> parent = Layer::Create();
105 scoped_refptr<Layer> child = Layer::Create();
106 scoped_refptr<Layer> grand_child = Layer::Create();
107 parent->AddChild(child);
108 child->AddChild(grand_child);
109
110 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
111 host->SetRootLayer(parent);
112
113 gfx::Transform identity_matrix;
114 SetLayerPropertiesForTesting(parent.get(),
115 identity_matrix,
116 gfx::Point3F(),
117 gfx::PointF(),
118 gfx::Size(100, 100),
119 true,
120 false);
121 SetLayerPropertiesForTesting(child.get(),
122 identity_matrix,
123 gfx::Point3F(),
124 gfx::PointF(),
125 gfx::Size(),
126 true,
127 false);
128 SetLayerPropertiesForTesting(grand_child.get(),
129 identity_matrix,
130 gfx::Point3F(),
131 gfx::PointF(),
132 gfx::Size(),
133 true,
134 false);
135
136 ExecuteCalculateDrawProperties(parent.get());
137
138 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->draw_transform());
139 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
140 child->screen_space_transform());
141 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
142 grand_child->draw_transform());
143 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
144 grand_child->screen_space_transform());
145 }
146
147 TEST_F(LayerTreeHostCommonTest, DoNotSkipLayersWithHandlers) {
148 scoped_refptr<Layer> parent = Layer::Create();
149 scoped_refptr<Layer> child = Layer::Create();
150 scoped_refptr<Layer> grand_child = Layer::Create();
151 parent->AddChild(child);
152 child->AddChild(grand_child);
153
154 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
155 host->SetRootLayer(parent);
156
157 gfx::Transform identity_matrix;
158 SetLayerPropertiesForTesting(parent.get(),
159 identity_matrix,
160 gfx::Point3F(),
161 gfx::PointF(),
162 gfx::Size(100, 100),
163 true,
164 false);
165 SetLayerPropertiesForTesting(child.get(),
166 identity_matrix,
167 gfx::Point3F(),
168 gfx::PointF(10, 10),
169 gfx::Size(100, 100),
170 true,
171 false);
172 // This would have previously caused us to skip our subtree, but this would be
173 // wrong; we need up-to-date draw properties to do hit testing on the layers
174 // with handlers.
175 child->SetOpacity(0.f);
176 SetLayerPropertiesForTesting(grand_child.get(),
177 identity_matrix,
178 gfx::Point3F(),
179 gfx::PointF(10, 10),
180 gfx::Size(100, 100),
181 true,
182 false);
183 grand_child->SetTouchEventHandlerRegion(gfx::Rect(0, 0, 100, 100));
184
185 ExecuteCalculateDrawProperties(parent.get());
186
187 // Check that we've computed draw properties for the subtree rooted at
188 // |child|.
189 EXPECT_FALSE(child->draw_transform().IsIdentity());
190 EXPECT_FALSE(grand_child->draw_transform().IsIdentity());
191 }
192
193 TEST_F(LayerTreeHostCommonTest, TransformsForSingleLayer) {
194 gfx::Transform identity_matrix;
195 scoped_refptr<Layer> layer = Layer::Create();
196
197 scoped_refptr<Layer> root = Layer::Create();
198 SetLayerPropertiesForTesting(root.get(),
199 identity_matrix,
200 gfx::Point3F(),
201 gfx::PointF(),
202 gfx::Size(1, 2),
203 true,
204 false);
205 root->AddChild(layer);
206
207 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
208 host->SetRootLayer(root);
209
210 // Case 2: Setting the bounds of the layer should not affect either the draw
211 // transform or the screenspace transform.
212 gfx::Transform translation_to_center;
213 translation_to_center.Translate(5.0, 6.0);
214 SetLayerPropertiesForTesting(layer.get(),
215 identity_matrix,
216 gfx::Point3F(),
217 gfx::PointF(),
218 gfx::Size(10, 12),
219 true,
220 false);
221 ExecuteCalculateDrawProperties(root.get());
222 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, layer->draw_transform());
223 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
224 layer->screen_space_transform());
225
226 // Case 3: The anchor point by itself (without a layer transform) should have
227 // no effect on the transforms.
228 SetLayerPropertiesForTesting(layer.get(),
229 identity_matrix,
230 gfx::Point3F(2.5f, 3.0f, 0.f),
231 gfx::PointF(),
232 gfx::Size(10, 12),
233 true,
234 false);
235 ExecuteCalculateDrawProperties(root.get());
236 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, layer->draw_transform());
237 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
238 layer->screen_space_transform());
239
240 // Case 4: A change in actual position affects both the draw transform and
241 // screen space transform.
242 gfx::Transform position_transform;
243 position_transform.Translate(0.f, 1.2f);
244 SetLayerPropertiesForTesting(layer.get(),
245 identity_matrix,
246 gfx::Point3F(2.5f, 3.0f, 0.f),
247 gfx::PointF(0.f, 1.2f),
248 gfx::Size(10, 12),
249 true,
250 false);
251 ExecuteCalculateDrawProperties(root.get());
252 EXPECT_TRANSFORMATION_MATRIX_EQ(position_transform, layer->draw_transform());
253 EXPECT_TRANSFORMATION_MATRIX_EQ(position_transform,
254 layer->screen_space_transform());
255
256 // Case 5: In the correct sequence of transforms, the layer transform should
257 // pre-multiply the translation_to_center. This is easily tested by using a
258 // scale transform, because scale and translation are not commutative.
259 gfx::Transform layer_transform;
260 layer_transform.Scale3d(2.0, 2.0, 1.0);
261 SetLayerPropertiesForTesting(layer.get(),
262 layer_transform,
263 gfx::Point3F(),
264 gfx::PointF(),
265 gfx::Size(10, 12),
266 true,
267 false);
268 ExecuteCalculateDrawProperties(root.get());
269 EXPECT_TRANSFORMATION_MATRIX_EQ(layer_transform, layer->draw_transform());
270 EXPECT_TRANSFORMATION_MATRIX_EQ(layer_transform,
271 layer->screen_space_transform());
272
273 // Case 6: The layer transform should occur with respect to the anchor point.
274 gfx::Transform translation_to_anchor;
275 translation_to_anchor.Translate(5.0, 0.0);
276 gfx::Transform expected_result =
277 translation_to_anchor * layer_transform * Inverse(translation_to_anchor);
278 SetLayerPropertiesForTesting(layer.get(),
279 layer_transform,
280 gfx::Point3F(5.0f, 0.f, 0.f),
281 gfx::PointF(),
282 gfx::Size(10, 12),
283 true,
284 false);
285 ExecuteCalculateDrawProperties(root.get());
286 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_result, layer->draw_transform());
287 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_result,
288 layer->screen_space_transform());
289
290 // Case 7: Verify that position pre-multiplies the layer transform. The
291 // current implementation of CalculateDrawProperties does this implicitly, but
292 // it is still worth testing to detect accidental regressions.
293 expected_result = position_transform * translation_to_anchor *
294 layer_transform * Inverse(translation_to_anchor);
295 SetLayerPropertiesForTesting(layer.get(),
296 layer_transform,
297 gfx::Point3F(5.0f, 0.f, 0.f),
298 gfx::PointF(0.f, 1.2f),
299 gfx::Size(10, 12),
300 true,
301 false);
302 ExecuteCalculateDrawProperties(root.get());
303 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_result, layer->draw_transform());
304 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_result,
305 layer->screen_space_transform());
306 }
307
308 TEST_F(LayerTreeHostCommonTest, TransformsAboutScrollOffset) {
309 const gfx::ScrollOffset kScrollOffset(50, 100);
310 const gfx::Vector2dF kScrollDelta(2.34f, 5.67f);
311 const gfx::Vector2d kMaxScrollOffset(200, 200);
312 const gfx::PointF kScrollLayerPosition(-kScrollOffset.x(),
313 -kScrollOffset.y());
314 const float kPageScale = 0.888f;
315 const float kDeviceScale = 1.666f;
316
317 FakeImplProxy proxy;
318 TestSharedBitmapManager shared_bitmap_manager;
319 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
320
321 gfx::Transform identity_matrix;
322 scoped_ptr<LayerImpl> sublayer_scoped_ptr(
323 LayerImpl::Create(host_impl.active_tree(), 1));
324 LayerImpl* sublayer = sublayer_scoped_ptr.get();
325 sublayer->SetContentsScale(kPageScale * kDeviceScale,
326 kPageScale * kDeviceScale);
327 SetLayerPropertiesForTesting(sublayer, identity_matrix, gfx::Point3F(),
328 gfx::PointF(), gfx::Size(500, 500), true, false,
329 false);
330
331 scoped_ptr<LayerImpl> scroll_layer_scoped_ptr(
332 LayerImpl::Create(host_impl.active_tree(), 2));
333 LayerImpl* scroll_layer = scroll_layer_scoped_ptr.get();
334 SetLayerPropertiesForTesting(scroll_layer, identity_matrix, gfx::Point3F(),
335 gfx::PointF(), gfx::Size(10, 20), true, false,
336 false);
337 scoped_ptr<LayerImpl> clip_layer_scoped_ptr(
338 LayerImpl::Create(host_impl.active_tree(), 4));
339 LayerImpl* clip_layer = clip_layer_scoped_ptr.get();
340
341 scroll_layer->SetScrollClipLayer(clip_layer->id());
342 clip_layer->SetBounds(
343 gfx::Size(scroll_layer->bounds().width() + kMaxScrollOffset.x(),
344 scroll_layer->bounds().height() + kMaxScrollOffset.y()));
345 scroll_layer->SetScrollClipLayer(clip_layer->id());
346 scroll_layer->SetScrollDelta(kScrollDelta);
347 gfx::Transform impl_transform;
348 scroll_layer->AddChild(sublayer_scoped_ptr.Pass());
349 LayerImpl* scroll_layer_raw_ptr = scroll_layer_scoped_ptr.get();
350 clip_layer->AddChild(scroll_layer_scoped_ptr.Pass());
351 scroll_layer_raw_ptr->PushScrollOffsetFromMainThread(kScrollOffset);
352
353 scoped_ptr<LayerImpl> root(LayerImpl::Create(host_impl.active_tree(), 3));
354 SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
355 gfx::PointF(), gfx::Size(3, 4), true, false,
356 false);
357 root->AddChild(clip_layer_scoped_ptr.Pass());
358 root->SetHasRenderSurface(true);
359
360 ExecuteCalculateDrawProperties(
361 root.get(), kDeviceScale, kPageScale, scroll_layer->parent());
362 gfx::Transform expected_transform = identity_matrix;
363 gfx::PointF sub_layer_screen_position = kScrollLayerPosition - kScrollDelta;
364 sub_layer_screen_position.Scale(kPageScale * kDeviceScale);
365 expected_transform.Translate(MathUtil::Round(sub_layer_screen_position.x()),
366 MathUtil::Round(sub_layer_screen_position.y()));
367 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_transform,
368 sublayer->draw_transform());
369 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_transform,
370 sublayer->screen_space_transform());
371
372 gfx::Transform arbitrary_translate;
373 const float kTranslateX = 10.6f;
374 const float kTranslateY = 20.6f;
375 arbitrary_translate.Translate(kTranslateX, kTranslateY);
376 SetLayerPropertiesForTesting(scroll_layer, arbitrary_translate,
377 gfx::Point3F(), gfx::PointF(), gfx::Size(10, 20),
378 true, false, false);
379 ExecuteCalculateDrawProperties(
380 root.get(), kDeviceScale, kPageScale, scroll_layer->parent());
381 expected_transform.MakeIdentity();
382 expected_transform.Translate(
383 MathUtil::Round(kTranslateX * kPageScale * kDeviceScale +
384 sub_layer_screen_position.x()),
385 MathUtil::Round(kTranslateY * kPageScale * kDeviceScale +
386 sub_layer_screen_position.y()));
387 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_transform,
388 sublayer->draw_transform());
389 }
390
391 TEST_F(LayerTreeHostCommonTest, TransformsForSimpleHierarchy) {
392 gfx::Transform identity_matrix;
393 scoped_refptr<Layer> root = Layer::Create();
394 scoped_refptr<Layer> parent = Layer::Create();
395 scoped_refptr<Layer> child = Layer::Create();
396 scoped_refptr<Layer> grand_child = Layer::Create();
397 root->AddChild(parent);
398 parent->AddChild(child);
399 child->AddChild(grand_child);
400
401 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
402 host->SetRootLayer(root);
403
404 // One-time setup of root layer
405 SetLayerPropertiesForTesting(root.get(),
406 identity_matrix,
407 gfx::Point3F(),
408 gfx::PointF(),
409 gfx::Size(1, 2),
410 true,
411 false);
412
413 // Case 1: parent's anchor point should not affect child or grand_child.
414 SetLayerPropertiesForTesting(parent.get(),
415 identity_matrix,
416 gfx::Point3F(2.5f, 3.0f, 0.f),
417 gfx::PointF(),
418 gfx::Size(10, 12),
419 true,
420 false);
421 SetLayerPropertiesForTesting(child.get(),
422 identity_matrix,
423 gfx::Point3F(),
424 gfx::PointF(),
425 gfx::Size(16, 18),
426 true,
427 false);
428 SetLayerPropertiesForTesting(grand_child.get(),
429 identity_matrix,
430 gfx::Point3F(),
431 gfx::PointF(),
432 gfx::Size(76, 78),
433 true,
434 false);
435 ExecuteCalculateDrawProperties(root.get());
436 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->draw_transform());
437 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
438 child->screen_space_transform());
439 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
440 grand_child->draw_transform());
441 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
442 grand_child->screen_space_transform());
443
444 // Case 2: parent's position affects child and grand_child.
445 gfx::Transform parent_position_transform;
446 parent_position_transform.Translate(0.f, 1.2f);
447 SetLayerPropertiesForTesting(parent.get(),
448 identity_matrix,
449 gfx::Point3F(2.5f, 3.0f, 0.f),
450 gfx::PointF(0.f, 1.2f),
451 gfx::Size(10, 12),
452 true,
453 false);
454 SetLayerPropertiesForTesting(child.get(),
455 identity_matrix,
456 gfx::Point3F(),
457 gfx::PointF(),
458 gfx::Size(16, 18),
459 true,
460 false);
461 SetLayerPropertiesForTesting(grand_child.get(),
462 identity_matrix,
463 gfx::Point3F(),
464 gfx::PointF(),
465 gfx::Size(76, 78),
466 true,
467 false);
468 ExecuteCalculateDrawProperties(root.get());
469 EXPECT_TRANSFORMATION_MATRIX_EQ(parent_position_transform,
470 child->draw_transform());
471 EXPECT_TRANSFORMATION_MATRIX_EQ(parent_position_transform,
472 child->screen_space_transform());
473 EXPECT_TRANSFORMATION_MATRIX_EQ(parent_position_transform,
474 grand_child->draw_transform());
475 EXPECT_TRANSFORMATION_MATRIX_EQ(parent_position_transform,
476 grand_child->screen_space_transform());
477
478 // Case 3: parent's local transform affects child and grandchild
479 gfx::Transform parent_layer_transform;
480 parent_layer_transform.Scale3d(2.0, 2.0, 1.0);
481 gfx::Transform parent_translation_to_anchor;
482 parent_translation_to_anchor.Translate(2.5, 3.0);
483 gfx::Transform parent_composite_transform =
484 parent_translation_to_anchor * parent_layer_transform *
485 Inverse(parent_translation_to_anchor);
486 SetLayerPropertiesForTesting(parent.get(),
487 parent_layer_transform,
488 gfx::Point3F(2.5f, 3.0f, 0.f),
489 gfx::PointF(),
490 gfx::Size(10, 12),
491 true,
492 false);
493 SetLayerPropertiesForTesting(child.get(),
494 identity_matrix,
495 gfx::Point3F(),
496 gfx::PointF(),
497 gfx::Size(16, 18),
498 true,
499 false);
500 SetLayerPropertiesForTesting(grand_child.get(),
501 identity_matrix,
502 gfx::Point3F(),
503 gfx::PointF(),
504 gfx::Size(76, 78),
505 true,
506 false);
507 ExecuteCalculateDrawProperties(root.get());
508 EXPECT_TRANSFORMATION_MATRIX_EQ(parent_composite_transform,
509 child->draw_transform());
510 EXPECT_TRANSFORMATION_MATRIX_EQ(parent_composite_transform,
511 child->screen_space_transform());
512 EXPECT_TRANSFORMATION_MATRIX_EQ(parent_composite_transform,
513 grand_child->draw_transform());
514 EXPECT_TRANSFORMATION_MATRIX_EQ(parent_composite_transform,
515 grand_child->screen_space_transform());
516 }
517
518 TEST_F(LayerTreeHostCommonTest, TransformsForSingleRenderSurface) {
519 scoped_refptr<Layer> root = Layer::Create();
520 scoped_refptr<Layer> parent = Layer::Create();
521 scoped_refptr<Layer> child = Layer::Create();
522 scoped_refptr<LayerWithForcedDrawsContent> grand_child =
523 make_scoped_refptr(new LayerWithForcedDrawsContent());
524 root->AddChild(parent);
525 parent->AddChild(child);
526 child->AddChild(grand_child);
527
528 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
529 host->SetRootLayer(root);
530
531 // One-time setup of root layer
532 gfx::Transform identity_matrix;
533 SetLayerPropertiesForTesting(root.get(),
534 identity_matrix,
535 gfx::Point3F(),
536 gfx::PointF(),
537 gfx::Size(1, 2),
538 true,
539 false);
540
541 // Child is set up so that a new render surface should be created.
542 child->SetOpacity(0.5f);
543 child->SetForceRenderSurface(true);
544
545 gfx::Transform parent_layer_transform;
546 parent_layer_transform.Scale3d(1.f, 0.9f, 1.f);
547 gfx::Transform parent_translation_to_anchor;
548 parent_translation_to_anchor.Translate(25.0, 30.0);
549
550 gfx::Transform parent_composite_transform =
551 parent_translation_to_anchor * parent_layer_transform *
552 Inverse(parent_translation_to_anchor);
553 gfx::Vector2dF parent_composite_scale =
554 MathUtil::ComputeTransform2dScaleComponents(parent_composite_transform,
555 1.f);
556 gfx::Transform surface_sublayer_transform;
557 surface_sublayer_transform.Scale(parent_composite_scale.x(),
558 parent_composite_scale.y());
559 gfx::Transform surface_sublayer_composite_transform =
560 parent_composite_transform * Inverse(surface_sublayer_transform);
561
562 // Child's render surface should not exist yet.
563 ASSERT_FALSE(child->render_surface());
564
565 SetLayerPropertiesForTesting(parent.get(),
566 parent_layer_transform,
567 gfx::Point3F(25.0f, 30.0f, 0.f),
568 gfx::PointF(),
569 gfx::Size(100, 120),
570 true,
571 false);
572 SetLayerPropertiesForTesting(child.get(),
573 identity_matrix,
574 gfx::Point3F(),
575 gfx::PointF(),
576 gfx::Size(16, 18),
577 true,
578 false);
579 SetLayerPropertiesForTesting(grand_child.get(),
580 identity_matrix,
581 gfx::Point3F(),
582 gfx::PointF(),
583 gfx::Size(8, 10),
584 true,
585 false);
586 ExecuteCalculateDrawProperties(root.get());
587
588 // Render surface should have been created now.
589 ASSERT_TRUE(child->render_surface());
590 ASSERT_EQ(child.get(), child->render_target());
591
592 // The child layer's draw transform should refer to its new render surface.
593 // The screen-space transform, however, should still refer to the root.
594 EXPECT_TRANSFORMATION_MATRIX_EQ(surface_sublayer_transform,
595 child->draw_transform());
596 EXPECT_TRANSFORMATION_MATRIX_EQ(parent_composite_transform,
597 child->screen_space_transform());
598
599 // Because the grand_child is the only drawable content, the child's render
600 // surface will tighten its bounds to the grand_child. The scale at which the
601 // surface's subtree is drawn must be removed from the composite transform.
602 EXPECT_TRANSFORMATION_MATRIX_EQ(
603 surface_sublayer_composite_transform,
604 child->render_target()->render_surface()->draw_transform());
605
606 // The screen space is the same as the target since the child surface draws
607 // into the root.
608 EXPECT_TRANSFORMATION_MATRIX_EQ(
609 surface_sublayer_composite_transform,
610 child->render_target()->render_surface()->screen_space_transform());
611 }
612
613 TEST_F(LayerTreeHostCommonTest, TransformsForReplica) {
614 scoped_refptr<Layer> root = Layer::Create();
615 scoped_refptr<Layer> parent = Layer::Create();
616 scoped_refptr<Layer> child = Layer::Create();
617 scoped_refptr<Layer> child_replica = Layer::Create();
618 scoped_refptr<LayerWithForcedDrawsContent> grand_child =
619 make_scoped_refptr(new LayerWithForcedDrawsContent());
620 root->AddChild(parent);
621 parent->AddChild(child);
622 child->AddChild(grand_child);
623 child->SetReplicaLayer(child_replica.get());
624
625 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
626 host->SetRootLayer(root);
627
628 // One-time setup of root layer
629 gfx::Transform identity_matrix;
630 SetLayerPropertiesForTesting(root.get(),
631 identity_matrix,
632 gfx::Point3F(),
633 gfx::PointF(),
634 gfx::Size(1, 2),
635 true,
636 false);
637
638 // Child is set up so that a new render surface should be created.
639 child->SetOpacity(0.5f);
640
641 gfx::Transform parent_layer_transform;
642 parent_layer_transform.Scale3d(2.0, 2.0, 1.0);
643 gfx::Transform parent_translation_to_anchor;
644 parent_translation_to_anchor.Translate(2.5, 3.0);
645 gfx::Transform parent_composite_transform =
646 parent_translation_to_anchor * parent_layer_transform *
647 Inverse(parent_translation_to_anchor);
648 gfx::Transform replica_layer_transform;
649 replica_layer_transform.Scale3d(3.0, 3.0, 1.0);
650 gfx::Vector2dF parent_composite_scale =
651 MathUtil::ComputeTransform2dScaleComponents(parent_composite_transform,
652 1.f);
653 gfx::Transform surface_sublayer_transform;
654 surface_sublayer_transform.Scale(parent_composite_scale.x(),
655 parent_composite_scale.y());
656 gfx::Transform replica_composite_transform =
657 parent_composite_transform * replica_layer_transform *
658 Inverse(surface_sublayer_transform);
659 child_replica->SetIsDrawable(true);
660 // Child's render surface should not exist yet.
661 ASSERT_FALSE(child->render_surface());
662
663 SetLayerPropertiesForTesting(parent.get(),
664 parent_layer_transform,
665 gfx::Point3F(2.5f, 3.0f, 0.f),
666 gfx::PointF(),
667 gfx::Size(10, 12),
668 true,
669 false);
670 SetLayerPropertiesForTesting(child.get(),
671 identity_matrix,
672 gfx::Point3F(),
673 gfx::PointF(),
674 gfx::Size(16, 18),
675 true,
676 false);
677 SetLayerPropertiesForTesting(grand_child.get(),
678 identity_matrix,
679 gfx::Point3F(),
680 gfx::PointF(-0.5f, -0.5f),
681 gfx::Size(1, 1),
682 true,
683 false);
684 SetLayerPropertiesForTesting(child_replica.get(),
685 replica_layer_transform,
686 gfx::Point3F(),
687 gfx::PointF(),
688 gfx::Size(),
689 true,
690 false);
691 ExecuteCalculateDrawProperties(root.get());
692
693 // Render surface should have been created now.
694 ASSERT_TRUE(child->render_surface());
695 ASSERT_EQ(child.get(), child->render_target());
696
697 EXPECT_TRANSFORMATION_MATRIX_EQ(
698 replica_composite_transform,
699 child->render_target()->render_surface()->replica_draw_transform());
700 EXPECT_TRANSFORMATION_MATRIX_EQ(replica_composite_transform,
701 child->render_target()
702 ->render_surface()
703 ->replica_screen_space_transform());
704 }
705
706 TEST_F(LayerTreeHostCommonTest, TransformsForRenderSurfaceHierarchy) {
707 // This test creates a more complex tree and verifies it all at once. This
708 // covers the following cases:
709 // - layers that are described w.r.t. a render surface: should have draw
710 // transforms described w.r.t. that surface
711 // - A render surface described w.r.t. an ancestor render surface: should
712 // have a draw transform described w.r.t. that ancestor surface
713 // - Replicas of a render surface are described w.r.t. the replica's
714 // transform around its anchor, along with the surface itself.
715 // - Sanity check on recursion: verify transforms of layers described w.r.t.
716 // a render surface that is described w.r.t. an ancestor render surface.
717 // - verifying that each layer has a reference to the correct render surface
718 // and render target values.
719
720 scoped_refptr<Layer> root = Layer::Create();
721 scoped_refptr<Layer> parent = Layer::Create();
722 scoped_refptr<Layer> render_surface1 = Layer::Create();
723 scoped_refptr<Layer> render_surface2 = Layer::Create();
724 scoped_refptr<Layer> child_of_root = Layer::Create();
725 scoped_refptr<Layer> child_of_rs1 = Layer::Create();
726 scoped_refptr<Layer> child_of_rs2 = Layer::Create();
727 scoped_refptr<Layer> replica_of_rs1 = Layer::Create();
728 scoped_refptr<Layer> replica_of_rs2 = Layer::Create();
729 scoped_refptr<Layer> grand_child_of_root = Layer::Create();
730 scoped_refptr<LayerWithForcedDrawsContent> grand_child_of_rs1 =
731 make_scoped_refptr(new LayerWithForcedDrawsContent());
732 scoped_refptr<LayerWithForcedDrawsContent> grand_child_of_rs2 =
733 make_scoped_refptr(new LayerWithForcedDrawsContent());
734 root->AddChild(parent);
735 parent->AddChild(render_surface1);
736 parent->AddChild(child_of_root);
737 render_surface1->AddChild(child_of_rs1);
738 render_surface1->AddChild(render_surface2);
739 render_surface2->AddChild(child_of_rs2);
740 child_of_root->AddChild(grand_child_of_root);
741 child_of_rs1->AddChild(grand_child_of_rs1);
742 child_of_rs2->AddChild(grand_child_of_rs2);
743 render_surface1->SetReplicaLayer(replica_of_rs1.get());
744 render_surface2->SetReplicaLayer(replica_of_rs2.get());
745
746 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
747 host->SetRootLayer(root);
748
749 // In combination with descendant draws content, opacity != 1 forces the layer
750 // to have a new render surface.
751 render_surface1->SetOpacity(0.5f);
752 render_surface2->SetOpacity(0.33f);
753
754 // One-time setup of root layer
755 gfx::Transform identity_matrix;
756 SetLayerPropertiesForTesting(root.get(),
757 identity_matrix,
758 gfx::Point3F(),
759 gfx::PointF(),
760 gfx::Size(1, 2),
761 true,
762 false);
763
764 // All layers in the tree are initialized with an anchor at .25 and a size of
765 // (10,10). matrix "A" is the composite layer transform used in all layers,
766 // Matrix "R" is the composite replica transform used in all replica layers.
767 gfx::Transform translation_to_anchor;
768 translation_to_anchor.Translate(2.5, 0.0);
769 gfx::Transform layer_transform;
770 layer_transform.Translate(1.0, 1.0);
771 gfx::Transform replica_layer_transform;
772 replica_layer_transform.Scale3d(-2.0, 5.0, 1.0);
773
774 gfx::Transform A =
775 translation_to_anchor * layer_transform * Inverse(translation_to_anchor);
776 gfx::Transform R = A * translation_to_anchor * replica_layer_transform *
777 Inverse(translation_to_anchor);
778
779 gfx::Vector2dF surface1_parent_transform_scale =
780 MathUtil::ComputeTransform2dScaleComponents(A, 1.f);
781 gfx::Transform surface1_sublayer_transform;
782 surface1_sublayer_transform.Scale(surface1_parent_transform_scale.x(),
783 surface1_parent_transform_scale.y());
784
785 // SS1 = transform given to the subtree of render_surface1
786 gfx::Transform SS1 = surface1_sublayer_transform;
787 // S1 = transform to move from render_surface1 pixels to the layer space of
788 // the owning layer
789 gfx::Transform S1 = Inverse(surface1_sublayer_transform);
790
791 gfx::Vector2dF surface2_parent_transform_scale =
792 MathUtil::ComputeTransform2dScaleComponents(SS1 * A, 1.f);
793 gfx::Transform surface2_sublayer_transform;
794 surface2_sublayer_transform.Scale(surface2_parent_transform_scale.x(),
795 surface2_parent_transform_scale.y());
796
797 // SS2 = transform given to the subtree of render_surface2
798 gfx::Transform SS2 = surface2_sublayer_transform;
799 // S2 = transform to move from render_surface2 pixels to the layer space of
800 // the owning layer
801 gfx::Transform S2 = Inverse(surface2_sublayer_transform);
802
803 SetLayerPropertiesForTesting(parent.get(),
804 layer_transform,
805 gfx::Point3F(2.5f, 0.f, 0.f),
806 gfx::PointF(),
807 gfx::Size(10, 10),
808 true,
809 false);
810 SetLayerPropertiesForTesting(render_surface1.get(),
811 layer_transform,
812 gfx::Point3F(2.5f, 0.f, 0.f),
813 gfx::PointF(),
814 gfx::Size(10, 10),
815 true,
816 false);
817 SetLayerPropertiesForTesting(render_surface2.get(),
818 layer_transform,
819 gfx::Point3F(2.5f, 0.f, 0.f),
820 gfx::PointF(),
821 gfx::Size(10, 10),
822 true,
823 false);
824 SetLayerPropertiesForTesting(child_of_root.get(),
825 layer_transform,
826 gfx::Point3F(2.5f, 0.f, 0.f),
827 gfx::PointF(),
828 gfx::Size(10, 10),
829 true,
830 false);
831 SetLayerPropertiesForTesting(child_of_rs1.get(),
832 layer_transform,
833 gfx::Point3F(2.5f, 0.f, 0.f),
834 gfx::PointF(),
835 gfx::Size(10, 10),
836 true,
837 false);
838 SetLayerPropertiesForTesting(child_of_rs2.get(),
839 layer_transform,
840 gfx::Point3F(2.5f, 0.f, 0.f),
841 gfx::PointF(),
842 gfx::Size(10, 10),
843 true,
844 false);
845 SetLayerPropertiesForTesting(grand_child_of_root.get(),
846 layer_transform,
847 gfx::Point3F(2.5f, 0.f, 0.f),
848 gfx::PointF(),
849 gfx::Size(10, 10),
850 true,
851 false);
852 SetLayerPropertiesForTesting(grand_child_of_rs1.get(),
853 layer_transform,
854 gfx::Point3F(2.5f, 0.f, 0.f),
855 gfx::PointF(),
856 gfx::Size(10, 10),
857 true,
858 false);
859 SetLayerPropertiesForTesting(grand_child_of_rs2.get(),
860 layer_transform,
861 gfx::Point3F(2.5f, 0.f, 0.f),
862 gfx::PointF(),
863 gfx::Size(10, 10),
864 true,
865 false);
866 SetLayerPropertiesForTesting(replica_of_rs1.get(),
867 replica_layer_transform,
868 gfx::Point3F(2.5f, 0.f, 0.f),
869 gfx::PointF(),
870 gfx::Size(),
871 true,
872 false);
873 SetLayerPropertiesForTesting(replica_of_rs2.get(),
874 replica_layer_transform,
875 gfx::Point3F(2.5f, 0.f, 0.f),
876 gfx::PointF(),
877 gfx::Size(),
878 true,
879 false);
880
881 ExecuteCalculateDrawProperties(root.get());
882
883 // Only layers that are associated with render surfaces should have an actual
884 // RenderSurface() value.
885 ASSERT_TRUE(root->render_surface());
886 ASSERT_FALSE(child_of_root->render_surface());
887 ASSERT_FALSE(grand_child_of_root->render_surface());
888
889 ASSERT_TRUE(render_surface1->render_surface());
890 ASSERT_FALSE(child_of_rs1->render_surface());
891 ASSERT_FALSE(grand_child_of_rs1->render_surface());
892
893 ASSERT_TRUE(render_surface2->render_surface());
894 ASSERT_FALSE(child_of_rs2->render_surface());
895 ASSERT_FALSE(grand_child_of_rs2->render_surface());
896
897 // Verify all render target accessors
898 EXPECT_EQ(root.get(), parent->render_target());
899 EXPECT_EQ(root.get(), child_of_root->render_target());
900 EXPECT_EQ(root.get(), grand_child_of_root->render_target());
901
902 EXPECT_EQ(render_surface1.get(), render_surface1->render_target());
903 EXPECT_EQ(render_surface1.get(), child_of_rs1->render_target());
904 EXPECT_EQ(render_surface1.get(), grand_child_of_rs1->render_target());
905
906 EXPECT_EQ(render_surface2.get(), render_surface2->render_target());
907 EXPECT_EQ(render_surface2.get(), child_of_rs2->render_target());
908 EXPECT_EQ(render_surface2.get(), grand_child_of_rs2->render_target());
909
910 // Verify layer draw transforms note that draw transforms are described with
911 // respect to the nearest ancestor render surface but screen space transforms
912 // are described with respect to the root.
913 EXPECT_TRANSFORMATION_MATRIX_EQ(A, parent->draw_transform());
914 EXPECT_TRANSFORMATION_MATRIX_EQ(A * A, child_of_root->draw_transform());
915 EXPECT_TRANSFORMATION_MATRIX_EQ(A * A * A,
916 grand_child_of_root->draw_transform());
917
918 EXPECT_TRANSFORMATION_MATRIX_EQ(SS1, render_surface1->draw_transform());
919 EXPECT_TRANSFORMATION_MATRIX_EQ(SS1 * A, child_of_rs1->draw_transform());
920 EXPECT_TRANSFORMATION_MATRIX_EQ(SS1 * A * A,
921 grand_child_of_rs1->draw_transform());
922
923 EXPECT_TRANSFORMATION_MATRIX_EQ(SS2, render_surface2->draw_transform());
924 EXPECT_TRANSFORMATION_MATRIX_EQ(SS2 * A, child_of_rs2->draw_transform());
925 EXPECT_TRANSFORMATION_MATRIX_EQ(SS2 * A * A,
926 grand_child_of_rs2->draw_transform());
927
928 // Verify layer screen-space transforms
929 //
930 EXPECT_TRANSFORMATION_MATRIX_EQ(A, parent->screen_space_transform());
931 EXPECT_TRANSFORMATION_MATRIX_EQ(A * A,
932 child_of_root->screen_space_transform());
933 EXPECT_TRANSFORMATION_MATRIX_EQ(
934 A * A * A, grand_child_of_root->screen_space_transform());
935
936 EXPECT_TRANSFORMATION_MATRIX_EQ(A * A,
937 render_surface1->screen_space_transform());
938 EXPECT_TRANSFORMATION_MATRIX_EQ(A * A * A,
939 child_of_rs1->screen_space_transform());
940 EXPECT_TRANSFORMATION_MATRIX_EQ(A * A * A * A,
941 grand_child_of_rs1->screen_space_transform());
942
943 EXPECT_TRANSFORMATION_MATRIX_EQ(A * A * A,
944 render_surface2->screen_space_transform());
945 EXPECT_TRANSFORMATION_MATRIX_EQ(A * A * A * A,
946 child_of_rs2->screen_space_transform());
947 EXPECT_TRANSFORMATION_MATRIX_EQ(A * A * A * A * A,
948 grand_child_of_rs2->screen_space_transform());
949
950 // Verify render surface transforms.
951 //
952 // Draw transform of render surface 1 is described with respect to root.
953 EXPECT_TRANSFORMATION_MATRIX_EQ(
954 A * A * S1, render_surface1->render_surface()->draw_transform());
955 EXPECT_TRANSFORMATION_MATRIX_EQ(
956 A * R * S1, render_surface1->render_surface()->replica_draw_transform());
957 EXPECT_TRANSFORMATION_MATRIX_EQ(
958 A * A * S1, render_surface1->render_surface()->screen_space_transform());
959 EXPECT_TRANSFORMATION_MATRIX_EQ(
960 A * R * S1,
961 render_surface1->render_surface()->replica_screen_space_transform());
962 // Draw transform of render surface 2 is described with respect to render
963 // surface 1.
964 EXPECT_TRANSFORMATION_MATRIX_EQ(
965 SS1 * A * S2, render_surface2->render_surface()->draw_transform());
966 EXPECT_TRANSFORMATION_MATRIX_EQ(
967 SS1 * R * S2,
968 render_surface2->render_surface()->replica_draw_transform());
969 EXPECT_TRANSFORMATION_MATRIX_EQ(
970 A * A * A * S2,
971 render_surface2->render_surface()->screen_space_transform());
972 EXPECT_TRANSFORMATION_MATRIX_EQ(
973 A * A * R * S2,
974 render_surface2->render_surface()->replica_screen_space_transform());
975
976 // Sanity check. If these fail there is probably a bug in the test itself. It
977 // is expected that we correctly set up transforms so that the y-component of
978 // the screen-space transform encodes the "depth" of the layer in the tree.
979 EXPECT_FLOAT_EQ(1.0, parent->screen_space_transform().matrix().get(1, 3));
980 EXPECT_FLOAT_EQ(2.0,
981 child_of_root->screen_space_transform().matrix().get(1, 3));
982 EXPECT_FLOAT_EQ(
983 3.0, grand_child_of_root->screen_space_transform().matrix().get(1, 3));
984
985 EXPECT_FLOAT_EQ(2.0,
986 render_surface1->screen_space_transform().matrix().get(1, 3));
987 EXPECT_FLOAT_EQ(3.0,
988 child_of_rs1->screen_space_transform().matrix().get(1, 3));
989 EXPECT_FLOAT_EQ(
990 4.0, grand_child_of_rs1->screen_space_transform().matrix().get(1, 3));
991
992 EXPECT_FLOAT_EQ(3.0,
993 render_surface2->screen_space_transform().matrix().get(1, 3));
994 EXPECT_FLOAT_EQ(4.0,
995 child_of_rs2->screen_space_transform().matrix().get(1, 3));
996 EXPECT_FLOAT_EQ(
997 5.0, grand_child_of_rs2->screen_space_transform().matrix().get(1, 3));
998 }
999
1000 TEST_F(LayerTreeHostCommonTest, TransformsForFlatteningLayer) {
1001 // For layers that flatten their subtree, there should be an orthographic
1002 // projection (for x and y values) in the middle of the transform sequence.
1003 // Note that the way the code is currently implemented, it is not expected to
1004 // use a canonical orthographic projection.
1005
1006 scoped_refptr<Layer> root = Layer::Create();
1007 scoped_refptr<Layer> child = Layer::Create();
1008 scoped_refptr<LayerWithForcedDrawsContent> grand_child =
1009 make_scoped_refptr(new LayerWithForcedDrawsContent());
1010 scoped_refptr<LayerWithForcedDrawsContent> great_grand_child =
1011 make_scoped_refptr(new LayerWithForcedDrawsContent());
1012
1013 gfx::Transform rotation_about_y_axis;
1014 rotation_about_y_axis.RotateAboutYAxis(30.0);
1015
1016 const gfx::Transform identity_matrix;
1017 SetLayerPropertiesForTesting(root.get(),
1018 identity_matrix,
1019 gfx::Point3F(),
1020 gfx::PointF(),
1021 gfx::Size(100, 100),
1022 true,
1023 false);
1024 SetLayerPropertiesForTesting(child.get(),
1025 rotation_about_y_axis,
1026 gfx::Point3F(),
1027 gfx::PointF(),
1028 gfx::Size(10, 10),
1029 true,
1030 false);
1031 SetLayerPropertiesForTesting(grand_child.get(),
1032 rotation_about_y_axis,
1033 gfx::Point3F(),
1034 gfx::PointF(),
1035 gfx::Size(10, 10),
1036 true,
1037 false);
1038 SetLayerPropertiesForTesting(great_grand_child.get(), identity_matrix,
1039 gfx::Point3F(), gfx::PointF(), gfx::Size(10, 10),
1040 true, false);
1041
1042 root->AddChild(child);
1043 child->AddChild(grand_child);
1044 grand_child->AddChild(great_grand_child);
1045 child->SetForceRenderSurface(true);
1046
1047 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
1048 host->SetRootLayer(root);
1049
1050 // No layers in this test should preserve 3d.
1051 ASSERT_TRUE(root->should_flatten_transform());
1052 ASSERT_TRUE(child->should_flatten_transform());
1053 ASSERT_TRUE(grand_child->should_flatten_transform());
1054 ASSERT_TRUE(great_grand_child->should_flatten_transform());
1055
1056 gfx::Transform expected_child_draw_transform = rotation_about_y_axis;
1057 gfx::Transform expected_child_screen_space_transform = rotation_about_y_axis;
1058 gfx::Transform expected_grand_child_draw_transform =
1059 rotation_about_y_axis; // draws onto child's render surface
1060 gfx::Transform flattened_rotation_about_y = rotation_about_y_axis;
1061 flattened_rotation_about_y.FlattenTo2d();
1062 gfx::Transform expected_grand_child_screen_space_transform =
1063 flattened_rotation_about_y * rotation_about_y_axis;
1064 gfx::Transform expected_great_grand_child_draw_transform =
1065 flattened_rotation_about_y;
1066 gfx::Transform expected_great_grand_child_screen_space_transform =
1067 flattened_rotation_about_y * flattened_rotation_about_y;
1068
1069 ExecuteCalculateDrawProperties(root.get());
1070
1071 // The child's draw transform should have been taken by its surface.
1072 ASSERT_TRUE(child->render_surface());
1073 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_draw_transform,
1074 child->render_surface()->draw_transform());
1075 EXPECT_TRANSFORMATION_MATRIX_EQ(
1076 expected_child_screen_space_transform,
1077 child->render_surface()->screen_space_transform());
1078 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->draw_transform());
1079 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_screen_space_transform,
1080 child->screen_space_transform());
1081 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_draw_transform,
1082 grand_child->draw_transform());
1083 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_screen_space_transform,
1084 grand_child->screen_space_transform());
1085 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_great_grand_child_draw_transform,
1086 great_grand_child->draw_transform());
1087 EXPECT_TRANSFORMATION_MATRIX_EQ(
1088 expected_great_grand_child_screen_space_transform,
1089 great_grand_child->screen_space_transform());
1090 }
1091
1092 TEST_F(LayerTreeHostCommonTest, TransformsForDegenerateIntermediateLayer) {
1093 // A layer that is empty in one axis, but not the other, was accidentally
1094 // skipping a necessary translation. Without that translation, the coordinate
1095 // space of the layer's draw transform is incorrect.
1096 //
1097 // Normally this isn't a problem, because the layer wouldn't be drawn anyway,
1098 // but if that layer becomes a render surface, then its draw transform is
1099 // implicitly inherited by the rest of the subtree, which then is positioned
1100 // incorrectly as a result.
1101
1102 scoped_refptr<Layer> root = Layer::Create();
1103 scoped_refptr<Layer> child = Layer::Create();
1104 scoped_refptr<LayerWithForcedDrawsContent> grand_child =
1105 make_scoped_refptr(new LayerWithForcedDrawsContent());
1106
1107 // The child height is zero, but has non-zero width that should be accounted
1108 // for while computing draw transforms.
1109 const gfx::Transform identity_matrix;
1110 SetLayerPropertiesForTesting(root.get(),
1111 identity_matrix,
1112 gfx::Point3F(),
1113 gfx::PointF(),
1114 gfx::Size(100, 100),
1115 true,
1116 false);
1117 SetLayerPropertiesForTesting(child.get(),
1118 identity_matrix,
1119 gfx::Point3F(),
1120 gfx::PointF(),
1121 gfx::Size(10, 0),
1122 true,
1123 false);
1124 SetLayerPropertiesForTesting(grand_child.get(),
1125 identity_matrix,
1126 gfx::Point3F(),
1127 gfx::PointF(),
1128 gfx::Size(10, 10),
1129 true,
1130 false);
1131
1132 root->AddChild(child);
1133 child->AddChild(grand_child);
1134 child->SetForceRenderSurface(true);
1135
1136 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
1137 host->SetRootLayer(root);
1138
1139 ExecuteCalculateDrawProperties(root.get());
1140
1141 ASSERT_TRUE(child->render_surface());
1142 // This is the real test, the rest are sanity checks.
1143 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
1144 child->render_surface()->draw_transform());
1145 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->draw_transform());
1146 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
1147 grand_child->draw_transform());
1148 }
1149
1150 TEST_F(LayerTreeHostCommonTest, TransformAboveRootLayer) {
1151 // Transformations applied at the root of the tree should be forwarded
1152 // to child layers instead of applied to the root RenderSurface.
1153 const gfx::Transform identity_matrix;
1154 scoped_refptr<LayerWithForcedDrawsContent> root =
1155 new LayerWithForcedDrawsContent;
1156 scoped_refptr<LayerWithForcedDrawsContent> child =
1157 new LayerWithForcedDrawsContent;
1158 child->SetScrollClipLayerId(root->id());
1159 root->AddChild(child);
1160
1161 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
1162 host->SetRootLayer(root);
1163
1164 SetLayerPropertiesForTesting(root.get(),
1165 identity_matrix,
1166 gfx::Point3F(),
1167 gfx::PointF(),
1168 gfx::Size(20, 20),
1169 true,
1170 false);
1171 SetLayerPropertiesForTesting(child.get(),
1172 identity_matrix,
1173 gfx::Point3F(),
1174 gfx::PointF(),
1175 gfx::Size(20, 20),
1176 true,
1177 false);
1178
1179 gfx::Transform translate;
1180 translate.Translate(50, 50);
1181 {
1182 RenderSurfaceLayerList render_surface_layer_list;
1183 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1184 root.get(), root->bounds(), translate, &render_surface_layer_list);
1185 inputs.can_adjust_raster_scales = true;
1186 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1187 EXPECT_EQ(translate, root->draw_properties().target_space_transform);
1188 EXPECT_EQ(translate, child->draw_properties().target_space_transform);
1189 EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
1190 EXPECT_EQ(1.f, root->draw_properties().device_scale_factor);
1191 EXPECT_EQ(1.f, child->draw_properties().device_scale_factor);
1192 }
1193
1194 gfx::Transform scale;
1195 scale.Scale(2, 2);
1196 {
1197 RenderSurfaceLayerList render_surface_layer_list;
1198 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1199 root.get(), root->bounds(), scale, &render_surface_layer_list);
1200 inputs.can_adjust_raster_scales = true;
1201 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1202 EXPECT_EQ(scale, root->draw_properties().target_space_transform);
1203 EXPECT_EQ(scale, child->draw_properties().target_space_transform);
1204 EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
1205 EXPECT_EQ(2.f, root->draw_properties().device_scale_factor);
1206 EXPECT_EQ(2.f, child->draw_properties().device_scale_factor);
1207 }
1208
1209 gfx::Transform rotate;
1210 rotate.Rotate(2);
1211 {
1212 RenderSurfaceLayerList render_surface_layer_list;
1213 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1214 root.get(), root->bounds(), rotate, &render_surface_layer_list);
1215 inputs.can_adjust_raster_scales = true;
1216 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1217 EXPECT_EQ(rotate, root->draw_properties().target_space_transform);
1218 EXPECT_EQ(rotate, child->draw_properties().target_space_transform);
1219 EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
1220 EXPECT_EQ(1.f, root->draw_properties().device_scale_factor);
1221 EXPECT_EQ(1.f, child->draw_properties().device_scale_factor);
1222 }
1223
1224 gfx::Transform composite;
1225 composite.ConcatTransform(translate);
1226 composite.ConcatTransform(scale);
1227 composite.ConcatTransform(rotate);
1228 {
1229 RenderSurfaceLayerList render_surface_layer_list;
1230 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1231 root.get(), root->bounds(), composite, &render_surface_layer_list);
1232 inputs.can_adjust_raster_scales = true;
1233 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1234 EXPECT_EQ(composite, root->draw_properties().target_space_transform);
1235 EXPECT_EQ(composite, child->draw_properties().target_space_transform);
1236 EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
1237 }
1238
1239 // Verify it composes correctly with device scale.
1240 float device_scale_factor = 1.5f;
1241
1242 {
1243 RenderSurfaceLayerList render_surface_layer_list;
1244 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1245 root.get(), root->bounds(), translate, &render_surface_layer_list);
1246 inputs.device_scale_factor = device_scale_factor;
1247 inputs.can_adjust_raster_scales = true;
1248 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1249 gfx::Transform device_scaled_translate = translate;
1250 device_scaled_translate.Scale(device_scale_factor, device_scale_factor);
1251 EXPECT_EQ(device_scaled_translate,
1252 root->draw_properties().target_space_transform);
1253 EXPECT_EQ(device_scaled_translate,
1254 child->draw_properties().target_space_transform);
1255 EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
1256 EXPECT_EQ(device_scale_factor, root->draw_properties().device_scale_factor);
1257 EXPECT_EQ(device_scale_factor,
1258 child->draw_properties().device_scale_factor);
1259 }
1260
1261 // Verify it composes correctly with page scale.
1262 float page_scale_factor = 2.f;
1263
1264 {
1265 RenderSurfaceLayerList render_surface_layer_list;
1266 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1267 root.get(), root->bounds(), translate, &render_surface_layer_list);
1268 inputs.page_scale_factor = page_scale_factor;
1269 inputs.page_scale_application_layer = root.get();
1270 inputs.can_adjust_raster_scales = true;
1271 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1272 gfx::Transform page_scaled_translate = translate;
1273 page_scaled_translate.Scale(page_scale_factor, page_scale_factor);
1274 EXPECT_EQ(translate, root->draw_properties().target_space_transform);
1275 EXPECT_EQ(page_scaled_translate,
1276 child->draw_properties().target_space_transform);
1277 EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
1278 EXPECT_EQ(1.f, root->draw_properties().device_scale_factor);
1279 EXPECT_EQ(1.f, child->draw_properties().device_scale_factor);
1280 }
1281
1282 // Verify that it composes correctly with transforms directly on root layer.
1283 root->SetTransform(composite);
1284
1285 {
1286 RenderSurfaceLayerList render_surface_layer_list;
1287 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1288 root.get(), root->bounds(), composite, &render_surface_layer_list);
1289 inputs.can_adjust_raster_scales = true;
1290 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1291 gfx::Transform compositeSquared = composite;
1292 compositeSquared.ConcatTransform(composite);
1293 EXPECT_TRANSFORMATION_MATRIX_EQ(
1294 compositeSquared, root->draw_properties().target_space_transform);
1295 EXPECT_TRANSFORMATION_MATRIX_EQ(
1296 compositeSquared, child->draw_properties().target_space_transform);
1297 EXPECT_EQ(identity_matrix, root->render_surface()->draw_transform());
1298 }
1299 }
1300
1301 TEST_F(LayerTreeHostCommonTest,
1302 RenderSurfaceListForRenderSurfaceWithClippedLayer) {
1303 scoped_refptr<Layer> parent = Layer::Create();
1304 scoped_refptr<Layer> render_surface1 = Layer::Create();
1305 scoped_refptr<LayerWithForcedDrawsContent> child =
1306 make_scoped_refptr(new LayerWithForcedDrawsContent());
1307
1308 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
1309 host->SetRootLayer(parent);
1310
1311 const gfx::Transform identity_matrix;
1312 SetLayerPropertiesForTesting(parent.get(),
1313 identity_matrix,
1314 gfx::Point3F(),
1315 gfx::PointF(),
1316 gfx::Size(10, 10),
1317 true,
1318 false);
1319 SetLayerPropertiesForTesting(render_surface1.get(),
1320 identity_matrix,
1321 gfx::Point3F(),
1322 gfx::PointF(),
1323 gfx::Size(10, 10),
1324 true,
1325 false);
1326 SetLayerPropertiesForTesting(child.get(),
1327 identity_matrix,
1328 gfx::Point3F(),
1329 gfx::PointF(30.f, 30.f),
1330 gfx::Size(10, 10),
1331 true,
1332 false);
1333
1334 parent->AddChild(render_surface1);
1335 parent->SetMasksToBounds(true);
1336 render_surface1->AddChild(child);
1337 render_surface1->SetForceRenderSurface(true);
1338
1339 RenderSurfaceLayerList render_surface_layer_list;
1340 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1341 parent.get(),
1342 parent->bounds(),
1343 gfx::Transform(),
1344 &render_surface_layer_list);
1345 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1346
1347 // The child layer's content is entirely outside the parent's clip rect, so
1348 // the intermediate render surface should not be listed here, even if it was
1349 // forced to be created. Render surfaces without children or visible content
1350 // are unexpected at draw time (e.g. we might try to create a content texture
1351 // of size 0).
1352 ASSERT_TRUE(parent->render_surface());
1353 EXPECT_EQ(1U, render_surface_layer_list.size());
1354 }
1355
1356 TEST_F(LayerTreeHostCommonTest, RenderSurfaceListForTransparentChild) {
1357 scoped_refptr<Layer> parent = Layer::Create();
1358 scoped_refptr<Layer> render_surface1 = Layer::Create();
1359 scoped_refptr<LayerWithForcedDrawsContent> child =
1360 make_scoped_refptr(new LayerWithForcedDrawsContent());
1361
1362 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
1363 host->SetRootLayer(parent);
1364
1365 const gfx::Transform identity_matrix;
1366 SetLayerPropertiesForTesting(render_surface1.get(),
1367 identity_matrix,
1368 gfx::Point3F(),
1369 gfx::PointF(),
1370 gfx::Size(10, 10),
1371 true,
1372 false);
1373 SetLayerPropertiesForTesting(child.get(),
1374 identity_matrix,
1375 gfx::Point3F(),
1376 gfx::PointF(),
1377 gfx::Size(10, 10),
1378 true,
1379 false);
1380
1381 parent->AddChild(render_surface1);
1382 render_surface1->AddChild(child);
1383 render_surface1->SetForceRenderSurface(true);
1384 render_surface1->SetOpacity(0.f);
1385
1386 RenderSurfaceLayerList render_surface_layer_list;
1387 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1388 parent.get(), parent->bounds(), &render_surface_layer_list);
1389 inputs.can_adjust_raster_scales = true;
1390 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1391
1392 // Since the layer is transparent, render_surface1->render_surface() should
1393 // not have gotten added anywhere. Also, the drawable content rect should not
1394 // have been extended by the children.
1395 ASSERT_TRUE(parent->render_surface());
1396 EXPECT_EQ(0U, parent->render_surface()->layer_list().size());
1397 EXPECT_EQ(1U, render_surface_layer_list.size());
1398 EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
1399 EXPECT_EQ(gfx::Rect(), parent->drawable_content_rect());
1400 }
1401
1402 TEST_F(LayerTreeHostCommonTest, RenderSurfaceForBlendMode) {
1403 scoped_refptr<Layer> parent = Layer::Create();
1404 scoped_refptr<LayerWithForcedDrawsContent> child =
1405 make_scoped_refptr(new LayerWithForcedDrawsContent());
1406
1407 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
1408 host->SetRootLayer(parent);
1409
1410 const gfx::Transform identity_matrix;
1411 const SkXfermode::Mode blend_mode = SkXfermode::kMultiply_Mode;
1412 SetLayerPropertiesForTesting(child.get(), identity_matrix, gfx::Point3F(),
1413 gfx::PointF(), gfx::Size(10, 10), true, false);
1414
1415 parent->AddChild(child);
1416 child->SetBlendMode(blend_mode);
1417
1418 RenderSurfaceLayerList render_surface_layer_list;
1419 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1420 parent.get(), parent->bounds(), &render_surface_layer_list);
1421 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1422
1423 // Since the child layer has a blend mode other than normal, it should get
1424 // its own render surface. Also, layer's draw_properties should contain the
1425 // default blend mode, since the render surface becomes responsible for
1426 // applying the blend mode.
1427 ASSERT_TRUE(child->render_surface());
1428 EXPECT_EQ(1U, child->render_surface()->layer_list().size());
1429 EXPECT_EQ(SkXfermode::kSrcOver_Mode, child->draw_properties().blend_mode);
1430 }
1431
1432 TEST_F(LayerTreeHostCommonTest, ForceRenderSurface) {
1433 scoped_refptr<Layer> parent = Layer::Create();
1434 scoped_refptr<Layer> render_surface1 = Layer::Create();
1435 scoped_refptr<LayerWithForcedDrawsContent> child =
1436 make_scoped_refptr(new LayerWithForcedDrawsContent());
1437 render_surface1->SetForceRenderSurface(true);
1438
1439 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
1440 host->SetRootLayer(parent);
1441
1442 const gfx::Transform identity_matrix;
1443 SetLayerPropertiesForTesting(parent.get(),
1444 identity_matrix,
1445 gfx::Point3F(),
1446 gfx::PointF(),
1447 gfx::Size(10, 10),
1448 true,
1449 false);
1450 SetLayerPropertiesForTesting(render_surface1.get(),
1451 identity_matrix,
1452 gfx::Point3F(),
1453 gfx::PointF(),
1454 gfx::Size(10, 10),
1455 true,
1456 false);
1457 SetLayerPropertiesForTesting(child.get(),
1458 identity_matrix,
1459 gfx::Point3F(),
1460 gfx::PointF(),
1461 gfx::Size(10, 10),
1462 true,
1463 false);
1464
1465 parent->AddChild(render_surface1);
1466 render_surface1->AddChild(child);
1467
1468 // Sanity check before the actual test
1469 EXPECT_FALSE(parent->render_surface());
1470 EXPECT_FALSE(render_surface1->render_surface());
1471
1472 {
1473 RenderSurfaceLayerList render_surface_layer_list;
1474 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1475 parent.get(), parent->bounds(), &render_surface_layer_list);
1476 inputs.can_adjust_raster_scales = true;
1477 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1478
1479 // The root layer always creates a render surface
1480 EXPECT_TRUE(parent->render_surface());
1481 EXPECT_TRUE(render_surface1->render_surface());
1482 EXPECT_EQ(2U, render_surface_layer_list.size());
1483 }
1484
1485 {
1486 RenderSurfaceLayerList render_surface_layer_list;
1487 render_surface1->SetForceRenderSurface(false);
1488 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1489 parent.get(), parent->bounds(), &render_surface_layer_list);
1490 inputs.can_adjust_raster_scales = true;
1491 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1492 EXPECT_TRUE(parent->render_surface());
1493 EXPECT_FALSE(render_surface1->render_surface());
1494 EXPECT_EQ(1U, render_surface_layer_list.size());
1495 }
1496 }
1497
1498 TEST_F(LayerTreeHostCommonTest, RenderSurfacesFlattenScreenSpaceTransform) {
1499 // Render surfaces act as a flattening point for their subtree, so should
1500 // always flatten the target-to-screen space transform seen by descendants.
1501
1502 scoped_refptr<Layer> root = Layer::Create();
1503 scoped_refptr<Layer> parent = Layer::Create();
1504 scoped_refptr<LayerWithForcedDrawsContent> child =
1505 make_scoped_refptr(new LayerWithForcedDrawsContent());
1506 scoped_refptr<LayerWithForcedDrawsContent> grand_child =
1507 make_scoped_refptr(new LayerWithForcedDrawsContent());
1508
1509 gfx::Transform rotation_about_y_axis;
1510 rotation_about_y_axis.RotateAboutYAxis(30.0);
1511 // Make |parent| have a render surface.
1512 parent->SetOpacity(0.9f);
1513
1514 const gfx::Transform identity_matrix;
1515 SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
1516 gfx::PointF(), gfx::Size(100, 100), true, false);
1517 SetLayerPropertiesForTesting(parent.get(), rotation_about_y_axis,
1518 gfx::Point3F(), gfx::PointF(), gfx::Size(10, 10),
1519 true, false);
1520 SetLayerPropertiesForTesting(child.get(), identity_matrix, gfx::Point3F(),
1521 gfx::PointF(), gfx::Size(10, 10), true, false);
1522 SetLayerPropertiesForTesting(grand_child.get(), identity_matrix,
1523 gfx::Point3F(), gfx::PointF(), gfx::Size(10, 10),
1524 true, false);
1525
1526 root->AddChild(parent);
1527 parent->AddChild(child);
1528 child->AddChild(grand_child);
1529
1530 grand_child->SetShouldFlattenTransform(false);
1531
1532 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
1533 host->SetRootLayer(root);
1534
1535 // Only grand_child should preserve 3d.
1536 EXPECT_TRUE(root->should_flatten_transform());
1537 EXPECT_TRUE(parent->should_flatten_transform());
1538 EXPECT_TRUE(child->should_flatten_transform());
1539 EXPECT_FALSE(grand_child->should_flatten_transform());
1540
1541 gfx::Transform expected_child_draw_transform = identity_matrix;
1542 gfx::Transform expected_grand_child_draw_transform = identity_matrix;
1543
1544 gfx::Transform flattened_rotation_about_y = rotation_about_y_axis;
1545 flattened_rotation_about_y.FlattenTo2d();
1546
1547 ExecuteCalculateDrawProperties(root.get());
1548
1549 EXPECT_TRUE(parent->render_surface());
1550 EXPECT_FALSE(child->render_surface());
1551 EXPECT_FALSE(grand_child->render_surface());
1552
1553 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix, child->draw_transform());
1554 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_matrix,
1555 grand_child->draw_transform());
1556
1557 // The screen-space transform inherited by |child| and |grand_child| should
1558 // have been flattened at their render target. In particular, the fact that
1559 // |grand_child| happens to preserve 3d shouldn't affect this flattening.
1560 EXPECT_TRANSFORMATION_MATRIX_EQ(flattened_rotation_about_y,
1561 child->screen_space_transform());
1562 EXPECT_TRANSFORMATION_MATRIX_EQ(flattened_rotation_about_y,
1563 grand_child->screen_space_transform());
1564 }
1565
1566 TEST_F(LayerTreeHostCommonTest, ClipRectCullsRenderSurfaces) {
1567 // The entire subtree of layers that are outside the clip rect should be
1568 // culled away, and should not affect the render_surface_layer_list.
1569 //
1570 // The test tree is set up as follows:
1571 // - all layers except the leaf_nodes are forced to be a new render surface
1572 // that have something to draw.
1573 // - parent is a large container layer.
1574 // - child has masksToBounds=true to cause clipping.
1575 // - grand_child is positioned outside of the child's bounds
1576 // - great_grand_child is also kept outside child's bounds.
1577 //
1578 // In this configuration, grand_child and great_grand_child are completely
1579 // outside the clip rect, and they should never get scheduled on the list of
1580 // render surfaces.
1581 //
1582
1583 const gfx::Transform identity_matrix;
1584 scoped_refptr<Layer> parent = Layer::Create();
1585 scoped_refptr<Layer> child = Layer::Create();
1586 scoped_refptr<Layer> grand_child = Layer::Create();
1587 scoped_refptr<Layer> great_grand_child = Layer::Create();
1588 scoped_refptr<LayerWithForcedDrawsContent> leaf_node1 =
1589 make_scoped_refptr(new LayerWithForcedDrawsContent());
1590 scoped_refptr<LayerWithForcedDrawsContent> leaf_node2 =
1591 make_scoped_refptr(new LayerWithForcedDrawsContent());
1592 parent->AddChild(child);
1593 child->AddChild(grand_child);
1594 grand_child->AddChild(great_grand_child);
1595
1596 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
1597 host->SetRootLayer(parent);
1598
1599 // leaf_node1 ensures that parent and child are kept on the
1600 // render_surface_layer_list, even though grand_child and great_grand_child
1601 // should be clipped.
1602 child->AddChild(leaf_node1);
1603 great_grand_child->AddChild(leaf_node2);
1604
1605 SetLayerPropertiesForTesting(parent.get(),
1606 identity_matrix,
1607 gfx::Point3F(),
1608 gfx::PointF(),
1609 gfx::Size(500, 500),
1610 true,
1611 false);
1612 SetLayerPropertiesForTesting(child.get(),
1613 identity_matrix,
1614 gfx::Point3F(),
1615 gfx::PointF(),
1616 gfx::Size(20, 20),
1617 true,
1618 false);
1619 SetLayerPropertiesForTesting(grand_child.get(),
1620 identity_matrix,
1621 gfx::Point3F(),
1622 gfx::PointF(45.f, 45.f),
1623 gfx::Size(10, 10),
1624 true,
1625 false);
1626 SetLayerPropertiesForTesting(great_grand_child.get(),
1627 identity_matrix,
1628 gfx::Point3F(),
1629 gfx::PointF(),
1630 gfx::Size(10, 10),
1631 true,
1632 false);
1633 SetLayerPropertiesForTesting(leaf_node1.get(),
1634 identity_matrix,
1635 gfx::Point3F(),
1636 gfx::PointF(),
1637 gfx::Size(500, 500),
1638 true,
1639 false);
1640 SetLayerPropertiesForTesting(leaf_node2.get(),
1641 identity_matrix,
1642 gfx::Point3F(),
1643 gfx::PointF(),
1644 gfx::Size(20, 20),
1645 true,
1646 false);
1647
1648 child->SetMasksToBounds(true);
1649 child->SetOpacity(0.4f);
1650 child->SetForceRenderSurface(true);
1651 grand_child->SetOpacity(0.5f);
1652 great_grand_child->SetOpacity(0.4f);
1653
1654 RenderSurfaceLayerList render_surface_layer_list;
1655 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1656 parent.get(), parent->bounds(), &render_surface_layer_list);
1657 inputs.can_adjust_raster_scales = true;
1658 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1659
1660 ASSERT_EQ(2U, render_surface_layer_list.size());
1661 EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
1662 EXPECT_EQ(child->id(), render_surface_layer_list.at(1)->id());
1663 }
1664
1665 TEST_F(LayerTreeHostCommonTest, ClipRectCullsSurfaceWithoutVisibleContent) {
1666 // When a render surface has a clip rect, it is used to clip the content rect
1667 // of the surface. When the render surface is animating its transforms, then
1668 // the content rect's position in the clip rect is not defined on the main
1669 // thread, and its content rect should not be clipped.
1670
1671 // The test tree is set up as follows:
1672 // - parent is a container layer that masksToBounds=true to cause clipping.
1673 // - child is a render surface, which has a clip rect set to the bounds of
1674 // the parent.
1675 // - grand_child is a render surface, and the only visible content in child.
1676 // It is positioned outside of the clip rect from parent.
1677
1678 // In this configuration, grand_child should be outside the clipped
1679 // content rect of the child, making grand_child not appear in the
1680 // render_surface_layer_list. However, when we place an animation on the
1681 // child, this clipping should be avoided and we should keep the grand_child
1682 // in the render_surface_layer_list.
1683
1684 const gfx::Transform identity_matrix;
1685 scoped_refptr<Layer> parent = Layer::Create();
1686 scoped_refptr<Layer> child = Layer::Create();
1687 scoped_refptr<Layer> grand_child = Layer::Create();
1688 scoped_refptr<LayerWithForcedDrawsContent> leaf_node =
1689 make_scoped_refptr(new LayerWithForcedDrawsContent());
1690 parent->AddChild(child);
1691 child->AddChild(grand_child);
1692 grand_child->AddChild(leaf_node);
1693
1694 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
1695 host->SetRootLayer(parent);
1696
1697 SetLayerPropertiesForTesting(parent.get(),
1698 identity_matrix,
1699 gfx::Point3F(),
1700 gfx::PointF(),
1701 gfx::Size(100, 100),
1702 true,
1703 false);
1704 SetLayerPropertiesForTesting(child.get(),
1705 identity_matrix,
1706 gfx::Point3F(),
1707 gfx::PointF(),
1708 gfx::Size(20, 20),
1709 true,
1710 false);
1711 SetLayerPropertiesForTesting(grand_child.get(),
1712 identity_matrix,
1713 gfx::Point3F(),
1714 gfx::PointF(200.f, 200.f),
1715 gfx::Size(10, 10),
1716 true,
1717 false);
1718 SetLayerPropertiesForTesting(leaf_node.get(),
1719 identity_matrix,
1720 gfx::Point3F(),
1721 gfx::PointF(),
1722 gfx::Size(10, 10),
1723 true,
1724 false);
1725
1726 parent->SetMasksToBounds(true);
1727 child->SetOpacity(0.4f);
1728 child->SetForceRenderSurface(true);
1729 grand_child->SetOpacity(0.4f);
1730 grand_child->SetForceRenderSurface(true);
1731
1732 {
1733 RenderSurfaceLayerList render_surface_layer_list;
1734 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1735 parent.get(), parent->bounds(), &render_surface_layer_list);
1736 inputs.can_adjust_raster_scales = true;
1737 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1738
1739 // Without an animation, we should cull child and grand_child from the
1740 // render_surface_layer_list.
1741 ASSERT_EQ(1U, render_surface_layer_list.size());
1742 EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
1743 }
1744
1745 // Now put an animating transform on child.
1746 AddAnimatedTransformToController(
1747 child->layer_animation_controller(), 10.0, 30, 0);
1748
1749 {
1750 RenderSurfaceLayerList render_surface_layer_list;
1751 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1752 parent.get(), parent->bounds(), &render_surface_layer_list);
1753 inputs.can_adjust_raster_scales = true;
1754 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1755
1756 // With an animating transform, we should keep child and grand_child in the
1757 // render_surface_layer_list.
1758 ASSERT_EQ(3U, render_surface_layer_list.size());
1759 EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
1760 EXPECT_EQ(child->id(), render_surface_layer_list.at(1)->id());
1761 EXPECT_EQ(grand_child->id(), render_surface_layer_list.at(2)->id());
1762 }
1763 }
1764
1765 TEST_F(LayerTreeHostCommonTest, IsClippedIsSetCorrectly) {
1766 // Layer's IsClipped() property is set to true when:
1767 // - the layer clips its subtree, e.g. masks to bounds,
1768 // - the layer is clipped by an ancestor that contributes to the same
1769 // render target,
1770 // - a surface is clipped by an ancestor that contributes to the same
1771 // render target.
1772 //
1773 // In particular, for a layer that owns a render surface:
1774 // - the render surface inherits any clip from ancestors, and does NOT
1775 // pass that clipped status to the layer itself.
1776 // - but if the layer itself masks to bounds, it is considered clipped
1777 // and propagates the clip to the subtree.
1778
1779 const gfx::Transform identity_matrix;
1780 scoped_refptr<Layer> root = Layer::Create();
1781 scoped_refptr<Layer> parent = Layer::Create();
1782 scoped_refptr<Layer> child1 = Layer::Create();
1783 scoped_refptr<Layer> child2 = Layer::Create();
1784 scoped_refptr<Layer> grand_child = Layer::Create();
1785 scoped_refptr<LayerWithForcedDrawsContent> leaf_node1 =
1786 make_scoped_refptr(new LayerWithForcedDrawsContent());
1787 scoped_refptr<LayerWithForcedDrawsContent> leaf_node2 =
1788 make_scoped_refptr(new LayerWithForcedDrawsContent());
1789 root->AddChild(parent);
1790 parent->AddChild(child1);
1791 parent->AddChild(child2);
1792 child1->AddChild(grand_child);
1793 child2->AddChild(leaf_node2);
1794 grand_child->AddChild(leaf_node1);
1795
1796 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
1797 host->SetRootLayer(root);
1798
1799 child2->SetForceRenderSurface(true);
1800
1801 SetLayerPropertiesForTesting(root.get(),
1802 identity_matrix,
1803 gfx::Point3F(),
1804 gfx::PointF(),
1805 gfx::Size(100, 100),
1806 true,
1807 false);
1808 SetLayerPropertiesForTesting(parent.get(),
1809 identity_matrix,
1810 gfx::Point3F(),
1811 gfx::PointF(),
1812 gfx::Size(100, 100),
1813 true,
1814 false);
1815 SetLayerPropertiesForTesting(child1.get(),
1816 identity_matrix,
1817 gfx::Point3F(),
1818 gfx::PointF(),
1819 gfx::Size(100, 100),
1820 true,
1821 false);
1822 SetLayerPropertiesForTesting(child2.get(),
1823 identity_matrix,
1824 gfx::Point3F(),
1825 gfx::PointF(),
1826 gfx::Size(100, 100),
1827 true,
1828 false);
1829 SetLayerPropertiesForTesting(grand_child.get(),
1830 identity_matrix,
1831 gfx::Point3F(),
1832 gfx::PointF(),
1833 gfx::Size(100, 100),
1834 true,
1835 false);
1836 SetLayerPropertiesForTesting(leaf_node1.get(),
1837 identity_matrix,
1838 gfx::Point3F(),
1839 gfx::PointF(),
1840 gfx::Size(100, 100),
1841 true,
1842 false);
1843 SetLayerPropertiesForTesting(leaf_node2.get(),
1844 identity_matrix,
1845 gfx::Point3F(),
1846 gfx::PointF(),
1847 gfx::Size(100, 100),
1848 true,
1849 false);
1850
1851 // Case 1: nothing is clipped except the root render surface.
1852 {
1853 RenderSurfaceLayerList render_surface_layer_list;
1854 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1855 root.get(), parent->bounds(), &render_surface_layer_list);
1856 inputs.can_adjust_raster_scales = true;
1857 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1858
1859 ASSERT_TRUE(root->render_surface());
1860 ASSERT_TRUE(child2->render_surface());
1861
1862 EXPECT_FALSE(root->is_clipped());
1863 EXPECT_TRUE(root->render_surface()->is_clipped());
1864 EXPECT_FALSE(parent->is_clipped());
1865 EXPECT_FALSE(child1->is_clipped());
1866 EXPECT_FALSE(child2->is_clipped());
1867 EXPECT_FALSE(child2->render_surface()->is_clipped());
1868 EXPECT_FALSE(grand_child->is_clipped());
1869 EXPECT_FALSE(leaf_node1->is_clipped());
1870 EXPECT_FALSE(leaf_node2->is_clipped());
1871 }
1872
1873 // Case 2: parent masksToBounds, so the parent, child1, and child2's
1874 // surface are clipped. But layers that contribute to child2's surface are
1875 // not clipped explicitly because child2's surface already accounts for
1876 // that clip.
1877 {
1878 RenderSurfaceLayerList render_surface_layer_list;
1879 parent->SetMasksToBounds(true);
1880 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1881 root.get(), parent->bounds(), &render_surface_layer_list);
1882 inputs.can_adjust_raster_scales = true;
1883 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1884
1885 ASSERT_TRUE(root->render_surface());
1886 ASSERT_TRUE(child2->render_surface());
1887
1888 EXPECT_FALSE(root->is_clipped());
1889 EXPECT_TRUE(root->render_surface()->is_clipped());
1890 EXPECT_TRUE(parent->is_clipped());
1891 EXPECT_TRUE(child1->is_clipped());
1892 EXPECT_FALSE(child2->is_clipped());
1893 EXPECT_TRUE(child2->render_surface()->is_clipped());
1894 EXPECT_TRUE(grand_child->is_clipped());
1895 EXPECT_TRUE(leaf_node1->is_clipped());
1896 EXPECT_FALSE(leaf_node2->is_clipped());
1897 }
1898
1899 // Case 3: child2 masksToBounds. The layer and subtree are clipped, and
1900 // child2's render surface is not clipped.
1901 {
1902 RenderSurfaceLayerList render_surface_layer_list;
1903 parent->SetMasksToBounds(false);
1904 child2->SetMasksToBounds(true);
1905 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
1906 root.get(), parent->bounds(), &render_surface_layer_list);
1907 inputs.can_adjust_raster_scales = true;
1908 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
1909
1910 ASSERT_TRUE(root->render_surface());
1911 ASSERT_TRUE(child2->render_surface());
1912
1913 EXPECT_FALSE(root->is_clipped());
1914 EXPECT_TRUE(root->render_surface()->is_clipped());
1915 EXPECT_FALSE(parent->is_clipped());
1916 EXPECT_FALSE(child1->is_clipped());
1917 EXPECT_TRUE(child2->is_clipped());
1918 EXPECT_FALSE(child2->render_surface()->is_clipped());
1919 EXPECT_FALSE(grand_child->is_clipped());
1920 EXPECT_FALSE(leaf_node1->is_clipped());
1921 EXPECT_TRUE(leaf_node2->is_clipped());
1922 }
1923 }
1924
1925 TEST_F(LayerTreeHostCommonTest, DrawableContentRectForLayers) {
1926 // Verify that layers get the appropriate DrawableContentRect when their
1927 // parent masksToBounds is true.
1928 //
1929 // grand_child1 - completely inside the region; DrawableContentRect should
1930 // be the layer rect expressed in target space.
1931 // grand_child2 - partially clipped but NOT masksToBounds; the clip rect
1932 // will be the intersection of layer bounds and the mask region.
1933 // grand_child3 - partially clipped and masksToBounds; the
1934 // DrawableContentRect will still be the intersection of layer bounds and
1935 // the mask region.
1936 // grand_child4 - outside parent's clip rect; the DrawableContentRect should
1937 // be empty.
1938 //
1939
1940 const gfx::Transform identity_matrix;
1941 scoped_refptr<Layer> parent = Layer::Create();
1942 scoped_refptr<Layer> child = Layer::Create();
1943 scoped_refptr<Layer> grand_child1 = Layer::Create();
1944 scoped_refptr<Layer> grand_child2 = Layer::Create();
1945 scoped_refptr<Layer> grand_child3 = Layer::Create();
1946 scoped_refptr<Layer> grand_child4 = Layer::Create();
1947
1948 parent->AddChild(child);
1949 child->AddChild(grand_child1);
1950 child->AddChild(grand_child2);
1951 child->AddChild(grand_child3);
1952 child->AddChild(grand_child4);
1953
1954 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
1955 host->SetRootLayer(parent);
1956
1957 SetLayerPropertiesForTesting(parent.get(),
1958 identity_matrix,
1959 gfx::Point3F(),
1960 gfx::PointF(),
1961 gfx::Size(500, 500),
1962 true,
1963 false);
1964 SetLayerPropertiesForTesting(child.get(),
1965 identity_matrix,
1966 gfx::Point3F(),
1967 gfx::PointF(),
1968 gfx::Size(20, 20),
1969 true,
1970 false);
1971 SetLayerPropertiesForTesting(grand_child1.get(),
1972 identity_matrix,
1973 gfx::Point3F(),
1974 gfx::PointF(5.f, 5.f),
1975 gfx::Size(10, 10),
1976 true,
1977 false);
1978 SetLayerPropertiesForTesting(grand_child2.get(),
1979 identity_matrix,
1980 gfx::Point3F(),
1981 gfx::PointF(15.f, 15.f),
1982 gfx::Size(10, 10),
1983 true,
1984 false);
1985 SetLayerPropertiesForTesting(grand_child3.get(),
1986 identity_matrix,
1987 gfx::Point3F(),
1988 gfx::PointF(15.f, 15.f),
1989 gfx::Size(10, 10),
1990 true,
1991 false);
1992 SetLayerPropertiesForTesting(grand_child4.get(),
1993 identity_matrix,
1994 gfx::Point3F(),
1995 gfx::PointF(45.f, 45.f),
1996 gfx::Size(10, 10),
1997 true,
1998 false);
1999
2000 child->SetMasksToBounds(true);
2001 grand_child3->SetMasksToBounds(true);
2002
2003 // Force everyone to be a render surface.
2004 child->SetOpacity(0.4f);
2005 grand_child1->SetOpacity(0.5f);
2006 grand_child2->SetOpacity(0.5f);
2007 grand_child3->SetOpacity(0.5f);
2008 grand_child4->SetOpacity(0.5f);
2009
2010 RenderSurfaceLayerList render_surface_layer_list;
2011 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
2012 parent.get(), parent->bounds(), &render_surface_layer_list);
2013 inputs.can_adjust_raster_scales = true;
2014 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
2015
2016 EXPECT_EQ(gfx::Rect(5, 5, 10, 10), grand_child1->drawable_content_rect());
2017 EXPECT_EQ(gfx::Rect(15, 15, 5, 5), grand_child3->drawable_content_rect());
2018 EXPECT_EQ(gfx::Rect(15, 15, 5, 5), grand_child3->drawable_content_rect());
2019 EXPECT_TRUE(grand_child4->drawable_content_rect().IsEmpty());
2020 }
2021
2022 TEST_F(LayerTreeHostCommonTest, ClipRectIsPropagatedCorrectlyToSurfaces) {
2023 // Verify that render surfaces (and their layers) get the appropriate
2024 // clip rects when their parent masksToBounds is true.
2025 //
2026 // Layers that own render surfaces (at least for now) do not inherit any
2027 // clipping; instead the surface will enforce the clip for the entire subtree.
2028 // They may still have a clip rect of their own layer bounds, however, if
2029 // masksToBounds was true.
2030 const gfx::Transform identity_matrix;
2031 scoped_refptr<Layer> parent = Layer::Create();
2032 scoped_refptr<Layer> child = Layer::Create();
2033 scoped_refptr<Layer> grand_child1 = Layer::Create();
2034 scoped_refptr<Layer> grand_child2 = Layer::Create();
2035 scoped_refptr<Layer> grand_child3 = Layer::Create();
2036 scoped_refptr<Layer> grand_child4 = Layer::Create();
2037 scoped_refptr<LayerWithForcedDrawsContent> leaf_node1 =
2038 make_scoped_refptr(new LayerWithForcedDrawsContent());
2039 scoped_refptr<LayerWithForcedDrawsContent> leaf_node2 =
2040 make_scoped_refptr(new LayerWithForcedDrawsContent());
2041 scoped_refptr<LayerWithForcedDrawsContent> leaf_node3 =
2042 make_scoped_refptr(new LayerWithForcedDrawsContent());
2043 scoped_refptr<LayerWithForcedDrawsContent> leaf_node4 =
2044 make_scoped_refptr(new LayerWithForcedDrawsContent());
2045
2046 parent->AddChild(child);
2047 child->AddChild(grand_child1);
2048 child->AddChild(grand_child2);
2049 child->AddChild(grand_child3);
2050 child->AddChild(grand_child4);
2051
2052 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
2053 host->SetRootLayer(parent);
2054
2055 // the leaf nodes ensure that these grand_children become render surfaces for
2056 // this test.
2057 grand_child1->AddChild(leaf_node1);
2058 grand_child2->AddChild(leaf_node2);
2059 grand_child3->AddChild(leaf_node3);
2060 grand_child4->AddChild(leaf_node4);
2061
2062 SetLayerPropertiesForTesting(parent.get(),
2063 identity_matrix,
2064 gfx::Point3F(),
2065 gfx::PointF(),
2066 gfx::Size(500, 500),
2067 true,
2068 false);
2069 SetLayerPropertiesForTesting(child.get(),
2070 identity_matrix,
2071 gfx::Point3F(),
2072 gfx::PointF(),
2073 gfx::Size(20, 20),
2074 true,
2075 false);
2076 SetLayerPropertiesForTesting(grand_child1.get(),
2077 identity_matrix,
2078 gfx::Point3F(),
2079 gfx::PointF(5.f, 5.f),
2080 gfx::Size(10, 10),
2081 true,
2082 false);
2083 SetLayerPropertiesForTesting(grand_child2.get(),
2084 identity_matrix,
2085 gfx::Point3F(),
2086 gfx::PointF(15.f, 15.f),
2087 gfx::Size(10, 10),
2088 true,
2089 false);
2090 SetLayerPropertiesForTesting(grand_child3.get(),
2091 identity_matrix,
2092 gfx::Point3F(),
2093 gfx::PointF(15.f, 15.f),
2094 gfx::Size(10, 10),
2095 true,
2096 false);
2097 SetLayerPropertiesForTesting(grand_child4.get(),
2098 identity_matrix,
2099 gfx::Point3F(),
2100 gfx::PointF(45.f, 45.f),
2101 gfx::Size(10, 10),
2102 true,
2103 false);
2104 SetLayerPropertiesForTesting(leaf_node1.get(),
2105 identity_matrix,
2106 gfx::Point3F(),
2107 gfx::PointF(),
2108 gfx::Size(10, 10),
2109 true,
2110 false);
2111 SetLayerPropertiesForTesting(leaf_node2.get(),
2112 identity_matrix,
2113 gfx::Point3F(),
2114 gfx::PointF(),
2115 gfx::Size(10, 10),
2116 true,
2117 false);
2118 SetLayerPropertiesForTesting(leaf_node3.get(),
2119 identity_matrix,
2120 gfx::Point3F(),
2121 gfx::PointF(),
2122 gfx::Size(10, 10),
2123 true,
2124 false);
2125 SetLayerPropertiesForTesting(leaf_node4.get(),
2126 identity_matrix,
2127 gfx::Point3F(),
2128 gfx::PointF(),
2129 gfx::Size(10, 10),
2130 true,
2131 false);
2132
2133 child->SetMasksToBounds(true);
2134 grand_child3->SetMasksToBounds(true);
2135 grand_child4->SetMasksToBounds(true);
2136
2137 // Force everyone to be a render surface.
2138 child->SetOpacity(0.4f);
2139 child->SetForceRenderSurface(true);
2140 grand_child1->SetOpacity(0.5f);
2141 grand_child1->SetForceRenderSurface(true);
2142 grand_child2->SetOpacity(0.5f);
2143 grand_child2->SetForceRenderSurface(true);
2144 grand_child3->SetOpacity(0.5f);
2145 grand_child3->SetForceRenderSurface(true);
2146 grand_child4->SetOpacity(0.5f);
2147 grand_child4->SetForceRenderSurface(true);
2148
2149 RenderSurfaceLayerList render_surface_layer_list;
2150 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
2151 parent.get(), parent->bounds(), &render_surface_layer_list);
2152 inputs.can_adjust_raster_scales = true;
2153 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
2154 ASSERT_TRUE(grand_child1->render_surface());
2155 ASSERT_TRUE(grand_child2->render_surface());
2156 ASSERT_TRUE(grand_child3->render_surface());
2157
2158 // Surfaces are clipped by their parent, but un-affected by the owning layer's
2159 // masksToBounds.
2160 EXPECT_EQ(gfx::Rect(0, 0, 20, 20),
2161 grand_child1->render_surface()->clip_rect());
2162 EXPECT_EQ(gfx::Rect(0, 0, 20, 20),
2163 grand_child2->render_surface()->clip_rect());
2164 EXPECT_EQ(gfx::Rect(0, 0, 20, 20),
2165 grand_child3->render_surface()->clip_rect());
2166 }
2167
2168 TEST_F(LayerTreeHostCommonTest, AnimationsForRenderSurfaceHierarchy) {
2169 scoped_refptr<Layer> parent = Layer::Create();
2170 scoped_refptr<Layer> render_surface1 = Layer::Create();
2171 scoped_refptr<Layer> render_surface2 = Layer::Create();
2172 scoped_refptr<Layer> child_of_root = Layer::Create();
2173 scoped_refptr<Layer> child_of_rs1 = Layer::Create();
2174 scoped_refptr<Layer> child_of_rs2 = Layer::Create();
2175 scoped_refptr<Layer> grand_child_of_root = Layer::Create();
2176 scoped_refptr<LayerWithForcedDrawsContent> grand_child_of_rs1 =
2177 make_scoped_refptr(new LayerWithForcedDrawsContent());
2178 scoped_refptr<LayerWithForcedDrawsContent> grand_child_of_rs2 =
2179 make_scoped_refptr(new LayerWithForcedDrawsContent());
2180 parent->AddChild(render_surface1);
2181 parent->AddChild(child_of_root);
2182 render_surface1->AddChild(child_of_rs1);
2183 render_surface1->AddChild(render_surface2);
2184 render_surface2->AddChild(child_of_rs2);
2185 child_of_root->AddChild(grand_child_of_root);
2186 child_of_rs1->AddChild(grand_child_of_rs1);
2187 child_of_rs2->AddChild(grand_child_of_rs2);
2188
2189 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
2190 host->SetRootLayer(parent);
2191
2192 // Make our render surfaces.
2193 render_surface1->SetForceRenderSurface(true);
2194 render_surface2->SetForceRenderSurface(true);
2195
2196 gfx::Transform layer_transform;
2197 layer_transform.Translate(1.0, 1.0);
2198
2199 SetLayerPropertiesForTesting(parent.get(),
2200 layer_transform,
2201 gfx::Point3F(0.25f, 0.f, 0.f),
2202 gfx::PointF(2.5f, 0.f),
2203 gfx::Size(10, 10),
2204 true,
2205 false);
2206 SetLayerPropertiesForTesting(render_surface1.get(),
2207 layer_transform,
2208 gfx::Point3F(0.25f, 0.f, 0.f),
2209 gfx::PointF(2.5f, 0.f),
2210 gfx::Size(10, 10),
2211 true,
2212 false);
2213 SetLayerPropertiesForTesting(render_surface2.get(),
2214 layer_transform,
2215 gfx::Point3F(0.25f, 0.f, 0.f),
2216 gfx::PointF(2.5f, 0.f),
2217 gfx::Size(10, 10),
2218 true,
2219 false);
2220 SetLayerPropertiesForTesting(child_of_root.get(),
2221 layer_transform,
2222 gfx::Point3F(0.25f, 0.f, 0.f),
2223 gfx::PointF(2.5f, 0.f),
2224 gfx::Size(10, 10),
2225 true,
2226 false);
2227 SetLayerPropertiesForTesting(child_of_rs1.get(),
2228 layer_transform,
2229 gfx::Point3F(0.25f, 0.f, 0.f),
2230 gfx::PointF(2.5f, 0.f),
2231 gfx::Size(10, 10),
2232 true,
2233 false);
2234 SetLayerPropertiesForTesting(child_of_rs2.get(),
2235 layer_transform,
2236 gfx::Point3F(0.25f, 0.f, 0.f),
2237 gfx::PointF(2.5f, 0.f),
2238 gfx::Size(10, 10),
2239 true,
2240 false);
2241 SetLayerPropertiesForTesting(grand_child_of_root.get(),
2242 layer_transform,
2243 gfx::Point3F(0.25f, 0.f, 0.f),
2244 gfx::PointF(2.5f, 0.f),
2245 gfx::Size(10, 10),
2246 true,
2247 false);
2248 SetLayerPropertiesForTesting(grand_child_of_rs1.get(),
2249 layer_transform,
2250 gfx::Point3F(0.25f, 0.f, 0.f),
2251 gfx::PointF(2.5f, 0.f),
2252 gfx::Size(10, 10),
2253 true,
2254 false);
2255 SetLayerPropertiesForTesting(grand_child_of_rs2.get(),
2256 layer_transform,
2257 gfx::Point3F(0.25f, 0.f, 0.f),
2258 gfx::PointF(2.5f, 0.f),
2259 gfx::Size(10, 10),
2260 true,
2261 false);
2262
2263 // Put an animated opacity on the render surface.
2264 AddOpacityTransitionToController(
2265 render_surface1->layer_animation_controller(), 10.0, 1.f, 0.f, false);
2266
2267 // Also put an animated opacity on a layer without descendants.
2268 AddOpacityTransitionToController(
2269 grand_child_of_root->layer_animation_controller(), 10.0, 1.f, 0.f, false);
2270
2271 // Put a transform animation on the render surface.
2272 AddAnimatedTransformToController(
2273 render_surface2->layer_animation_controller(), 10.0, 30, 0);
2274
2275 // Also put transform animations on grand_child_of_root, and
2276 // grand_child_of_rs2
2277 AddAnimatedTransformToController(
2278 grand_child_of_root->layer_animation_controller(), 10.0, 30, 0);
2279 AddAnimatedTransformToController(
2280 grand_child_of_rs2->layer_animation_controller(), 10.0, 30, 0);
2281
2282 ExecuteCalculateDrawProperties(parent.get());
2283
2284 // Only layers that are associated with render surfaces should have an actual
2285 // RenderSurface() value.
2286 ASSERT_TRUE(parent->render_surface());
2287 ASSERT_FALSE(child_of_root->render_surface());
2288 ASSERT_FALSE(grand_child_of_root->render_surface());
2289
2290 ASSERT_TRUE(render_surface1->render_surface());
2291 ASSERT_FALSE(child_of_rs1->render_surface());
2292 ASSERT_FALSE(grand_child_of_rs1->render_surface());
2293
2294 ASSERT_TRUE(render_surface2->render_surface());
2295 ASSERT_FALSE(child_of_rs2->render_surface());
2296 ASSERT_FALSE(grand_child_of_rs2->render_surface());
2297
2298 // Verify all render target accessors
2299 EXPECT_EQ(parent.get(), parent->render_target());
2300 EXPECT_EQ(parent.get(), child_of_root->render_target());
2301 EXPECT_EQ(parent.get(), grand_child_of_root->render_target());
2302
2303 EXPECT_EQ(render_surface1.get(), render_surface1->render_target());
2304 EXPECT_EQ(render_surface1.get(), child_of_rs1->render_target());
2305 EXPECT_EQ(render_surface1.get(), grand_child_of_rs1->render_target());
2306
2307 EXPECT_EQ(render_surface2.get(), render_surface2->render_target());
2308 EXPECT_EQ(render_surface2.get(), child_of_rs2->render_target());
2309 EXPECT_EQ(render_surface2.get(), grand_child_of_rs2->render_target());
2310
2311 // Verify draw_opacity_is_animating values
2312 EXPECT_FALSE(parent->draw_opacity_is_animating());
2313 EXPECT_FALSE(child_of_root->draw_opacity_is_animating());
2314 EXPECT_TRUE(grand_child_of_root->draw_opacity_is_animating());
2315 EXPECT_FALSE(render_surface1->draw_opacity_is_animating());
2316 EXPECT_TRUE(render_surface1->render_surface()->draw_opacity_is_animating());
2317 EXPECT_FALSE(child_of_rs1->draw_opacity_is_animating());
2318 EXPECT_FALSE(grand_child_of_rs1->draw_opacity_is_animating());
2319 EXPECT_FALSE(render_surface2->draw_opacity_is_animating());
2320 EXPECT_FALSE(render_surface2->render_surface()->draw_opacity_is_animating());
2321 EXPECT_FALSE(child_of_rs2->draw_opacity_is_animating());
2322 EXPECT_FALSE(grand_child_of_rs2->draw_opacity_is_animating());
2323
2324 // Verify draw_transform_is_animating values
2325 EXPECT_FALSE(parent->draw_transform_is_animating());
2326 EXPECT_FALSE(child_of_root->draw_transform_is_animating());
2327 EXPECT_TRUE(grand_child_of_root->draw_transform_is_animating());
2328 EXPECT_FALSE(render_surface1->draw_transform_is_animating());
2329 EXPECT_FALSE(render_surface1->render_surface()
2330 ->target_surface_transforms_are_animating());
2331 EXPECT_FALSE(child_of_rs1->draw_transform_is_animating());
2332 EXPECT_FALSE(grand_child_of_rs1->draw_transform_is_animating());
2333 EXPECT_FALSE(render_surface2->draw_transform_is_animating());
2334 EXPECT_TRUE(render_surface2->render_surface()
2335 ->target_surface_transforms_are_animating());
2336 EXPECT_FALSE(child_of_rs2->draw_transform_is_animating());
2337 EXPECT_TRUE(grand_child_of_rs2->draw_transform_is_animating());
2338
2339 // Verify screen_space_transform_is_animating values
2340 EXPECT_FALSE(parent->screen_space_transform_is_animating());
2341 EXPECT_FALSE(child_of_root->screen_space_transform_is_animating());
2342 EXPECT_TRUE(grand_child_of_root->screen_space_transform_is_animating());
2343 EXPECT_FALSE(render_surface1->screen_space_transform_is_animating());
2344 EXPECT_FALSE(render_surface1->render_surface()
2345 ->screen_space_transforms_are_animating());
2346 EXPECT_FALSE(child_of_rs1->screen_space_transform_is_animating());
2347 EXPECT_FALSE(grand_child_of_rs1->screen_space_transform_is_animating());
2348 EXPECT_TRUE(render_surface2->screen_space_transform_is_animating());
2349 EXPECT_TRUE(render_surface2->render_surface()
2350 ->screen_space_transforms_are_animating());
2351 EXPECT_TRUE(child_of_rs2->screen_space_transform_is_animating());
2352 EXPECT_TRUE(grand_child_of_rs2->screen_space_transform_is_animating());
2353
2354 // Sanity check. If these fail there is probably a bug in the test itself.
2355 // It is expected that we correctly set up transforms so that the y-component
2356 // of the screen-space transform encodes the "depth" of the layer in the tree.
2357 EXPECT_FLOAT_EQ(1.0, parent->screen_space_transform().matrix().get(1, 3));
2358 EXPECT_FLOAT_EQ(2.0,
2359 child_of_root->screen_space_transform().matrix().get(1, 3));
2360 EXPECT_FLOAT_EQ(
2361 3.0, grand_child_of_root->screen_space_transform().matrix().get(1, 3));
2362
2363 EXPECT_FLOAT_EQ(2.0,
2364 render_surface1->screen_space_transform().matrix().get(1, 3));
2365 EXPECT_FLOAT_EQ(3.0,
2366 child_of_rs1->screen_space_transform().matrix().get(1, 3));
2367 EXPECT_FLOAT_EQ(
2368 4.0, grand_child_of_rs1->screen_space_transform().matrix().get(1, 3));
2369
2370 EXPECT_FLOAT_EQ(3.0,
2371 render_surface2->screen_space_transform().matrix().get(1, 3));
2372 EXPECT_FLOAT_EQ(4.0,
2373 child_of_rs2->screen_space_transform().matrix().get(1, 3));
2374 EXPECT_FLOAT_EQ(
2375 5.0, grand_child_of_rs2->screen_space_transform().matrix().get(1, 3));
2376 }
2377
2378 TEST_F(LayerTreeHostCommonTest, VisibleRectForIdentityTransform) {
2379 // Test the calculateVisibleRect() function works correctly for identity
2380 // transforms.
2381
2382 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100);
2383 gfx::Transform layer_to_surface_transform;
2384
2385 // Case 1: Layer is contained within the surface.
2386 gfx::Rect layer_content_rect = gfx::Rect(10, 10, 30, 30);
2387 gfx::Rect expected = gfx::Rect(10, 10, 30, 30);
2388 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
2389 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2390 EXPECT_EQ(expected, actual);
2391
2392 // Case 2: Layer is outside the surface rect.
2393 layer_content_rect = gfx::Rect(120, 120, 30, 30);
2394 actual = LayerTreeHostCommon::CalculateVisibleRect(
2395 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2396 EXPECT_TRUE(actual.IsEmpty());
2397
2398 // Case 3: Layer is partially overlapping the surface rect.
2399 layer_content_rect = gfx::Rect(80, 80, 30, 30);
2400 expected = gfx::Rect(80, 80, 20, 20);
2401 actual = LayerTreeHostCommon::CalculateVisibleRect(
2402 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2403 EXPECT_EQ(expected, actual);
2404 }
2405
2406 TEST_F(LayerTreeHostCommonTest, VisibleRectForTranslations) {
2407 // Test the calculateVisibleRect() function works correctly for scaling
2408 // transforms.
2409
2410 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100);
2411 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 30, 30);
2412 gfx::Transform layer_to_surface_transform;
2413
2414 // Case 1: Layer is contained within the surface.
2415 layer_to_surface_transform.MakeIdentity();
2416 layer_to_surface_transform.Translate(10.0, 10.0);
2417 gfx::Rect expected = gfx::Rect(0, 0, 30, 30);
2418 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
2419 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2420 EXPECT_EQ(expected, actual);
2421
2422 // Case 2: Layer is outside the surface rect.
2423 layer_to_surface_transform.MakeIdentity();
2424 layer_to_surface_transform.Translate(120.0, 120.0);
2425 actual = LayerTreeHostCommon::CalculateVisibleRect(
2426 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2427 EXPECT_TRUE(actual.IsEmpty());
2428
2429 // Case 3: Layer is partially overlapping the surface rect.
2430 layer_to_surface_transform.MakeIdentity();
2431 layer_to_surface_transform.Translate(80.0, 80.0);
2432 expected = gfx::Rect(0, 0, 20, 20);
2433 actual = LayerTreeHostCommon::CalculateVisibleRect(
2434 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2435 EXPECT_EQ(expected, actual);
2436 }
2437
2438 TEST_F(LayerTreeHostCommonTest, VisibleRectFor2DRotations) {
2439 // Test the calculateVisibleRect() function works correctly for rotations
2440 // about z-axis (i.e. 2D rotations). Remember that calculateVisibleRect()
2441 // should return the g in the layer's space.
2442
2443 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100);
2444 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 30, 30);
2445 gfx::Transform layer_to_surface_transform;
2446
2447 // Case 1: Layer is contained within the surface.
2448 layer_to_surface_transform.MakeIdentity();
2449 layer_to_surface_transform.Translate(50.0, 50.0);
2450 layer_to_surface_transform.Rotate(45.0);
2451 gfx::Rect expected = gfx::Rect(0, 0, 30, 30);
2452 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
2453 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2454 EXPECT_EQ(expected, actual);
2455
2456 // Case 2: Layer is outside the surface rect.
2457 layer_to_surface_transform.MakeIdentity();
2458 layer_to_surface_transform.Translate(-50.0, 0.0);
2459 layer_to_surface_transform.Rotate(45.0);
2460 actual = LayerTreeHostCommon::CalculateVisibleRect(
2461 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2462 EXPECT_TRUE(actual.IsEmpty());
2463
2464 // Case 3: The layer is rotated about its top-left corner. In surface space,
2465 // the layer is oriented diagonally, with the left half outside of the render
2466 // surface. In this case, the g should still be the entire layer
2467 // (remember the g is computed in layer space); both the top-left
2468 // and bottom-right corners of the layer are still visible.
2469 layer_to_surface_transform.MakeIdentity();
2470 layer_to_surface_transform.Rotate(45.0);
2471 expected = gfx::Rect(0, 0, 30, 30);
2472 actual = LayerTreeHostCommon::CalculateVisibleRect(
2473 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2474 EXPECT_EQ(expected, actual);
2475
2476 // Case 4: The layer is rotated about its top-left corner, and translated
2477 // upwards. In surface space, the layer is oriented diagonally, with only the
2478 // top corner of the surface overlapping the layer. In layer space, the render
2479 // surface overlaps the right side of the layer. The g should be
2480 // the layer's right half.
2481 layer_to_surface_transform.MakeIdentity();
2482 layer_to_surface_transform.Translate(0.0, -sqrt(2.0) * 15.0);
2483 layer_to_surface_transform.Rotate(45.0);
2484 expected = gfx::Rect(15, 0, 15, 30); // Right half of layer bounds.
2485 actual = LayerTreeHostCommon::CalculateVisibleRect(
2486 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2487 EXPECT_EQ(expected, actual);
2488 }
2489
2490 TEST_F(LayerTreeHostCommonTest, VisibleRectFor3dOrthographicTransform) {
2491 // Test that the calculateVisibleRect() function works correctly for 3d
2492 // transforms.
2493
2494 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100);
2495 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 100, 100);
2496 gfx::Transform layer_to_surface_transform;
2497
2498 // Case 1: Orthographic projection of a layer rotated about y-axis by 45
2499 // degrees, should be fully contained in the render surface.
2500 layer_to_surface_transform.MakeIdentity();
2501 layer_to_surface_transform.RotateAboutYAxis(45.0);
2502 gfx::Rect expected = gfx::Rect(0, 0, 100, 100);
2503 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
2504 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2505 EXPECT_EQ(expected, actual);
2506
2507 // Case 2: Orthographic projection of a layer rotated about y-axis by 45
2508 // degrees, but shifted to the side so only the right-half the layer would be
2509 // visible on the surface.
2510 // 100 is the un-rotated layer width; divided by sqrt(2) is the rotated width.
2511 SkMScalar half_width_of_rotated_layer =
2512 SkDoubleToMScalar((100.0 / sqrt(2.0)) * 0.5);
2513 layer_to_surface_transform.MakeIdentity();
2514 layer_to_surface_transform.Translate(-half_width_of_rotated_layer, 0.0);
2515 layer_to_surface_transform.RotateAboutYAxis(45.0); // Rotates about the left
2516 // edge of the layer.
2517 expected = gfx::Rect(50, 0, 50, 100); // Tight half of the layer.
2518 actual = LayerTreeHostCommon::CalculateVisibleRect(
2519 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2520 EXPECT_EQ(expected, actual);
2521 }
2522
2523 TEST_F(LayerTreeHostCommonTest, VisibleRectFor3dPerspectiveTransform) {
2524 // Test the calculateVisibleRect() function works correctly when the layer has
2525 // a perspective projection onto the target surface.
2526
2527 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100);
2528 gfx::Rect layer_content_rect = gfx::Rect(-50, -50, 200, 200);
2529 gfx::Transform layer_to_surface_transform;
2530
2531 // Case 1: Even though the layer is twice as large as the surface, due to
2532 // perspective foreshortening, the layer will fit fully in the surface when
2533 // its translated more than the perspective amount.
2534 layer_to_surface_transform.MakeIdentity();
2535
2536 // The following sequence of transforms applies the perspective about the
2537 // center of the surface.
2538 layer_to_surface_transform.Translate(50.0, 50.0);
2539 layer_to_surface_transform.ApplyPerspectiveDepth(9.0);
2540 layer_to_surface_transform.Translate(-50.0, -50.0);
2541
2542 // This translate places the layer in front of the surface's projection plane.
2543 layer_to_surface_transform.Translate3d(0.0, 0.0, -27.0);
2544
2545 gfx::Rect expected = gfx::Rect(-50, -50, 200, 200);
2546 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
2547 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2548 EXPECT_EQ(expected, actual);
2549
2550 // Case 2: same projection as before, except that the layer is also translated
2551 // to the side, so that only the right half of the layer should be visible.
2552 //
2553 // Explanation of expected result: The perspective ratio is (z distance
2554 // between layer and camera origin) / (z distance between projection plane and
2555 // camera origin) == ((-27 - 9) / 9) Then, by similar triangles, if we want to
2556 // move a layer by translating -50 units in projected surface units (so that
2557 // only half of it is visible), then we would need to translate by (-36 / 9) *
2558 // -50 == -200 in the layer's units.
2559 layer_to_surface_transform.Translate3d(-200.0, 0.0, 0.0);
2560 expected = gfx::Rect(gfx::Point(50, -50),
2561 gfx::Size(100, 200)); // The right half of the layer's
2562 // bounding rect.
2563 actual = LayerTreeHostCommon::CalculateVisibleRect(
2564 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2565 EXPECT_EQ(expected, actual);
2566 }
2567
2568 TEST_F(LayerTreeHostCommonTest,
2569 VisibleRectFor3dOrthographicIsNotClippedBehindSurface) {
2570 // There is currently no explicit concept of an orthographic projection plane
2571 // in our code (nor in the CSS spec to my knowledge). Therefore, layers that
2572 // are technically behind the surface in an orthographic world should not be
2573 // clipped when they are flattened to the surface.
2574
2575 gfx::Rect target_surface_rect = gfx::Rect(0, 0, 100, 100);
2576 gfx::Rect layer_content_rect = gfx::Rect(0, 0, 100, 100);
2577 gfx::Transform layer_to_surface_transform;
2578
2579 // This sequence of transforms effectively rotates the layer about the y-axis
2580 // at the center of the layer.
2581 layer_to_surface_transform.MakeIdentity();
2582 layer_to_surface_transform.Translate(50.0, 0.0);
2583 layer_to_surface_transform.RotateAboutYAxis(45.0);
2584 layer_to_surface_transform.Translate(-50.0, 0.0);
2585
2586 gfx::Rect expected = gfx::Rect(0, 0, 100, 100);
2587 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
2588 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2589 EXPECT_EQ(expected, actual);
2590 }
2591
2592 TEST_F(LayerTreeHostCommonTest, VisibleRectFor3dPerspectiveWhenClippedByW) {
2593 // Test the calculateVisibleRect() function works correctly when projecting a
2594 // surface onto a layer, but the layer is partially behind the camera (not
2595 // just behind the projection plane). In this case, the cartesian coordinates
2596 // may seem to be valid, but actually they are not. The visible rect needs to
2597 // be properly clipped by the w = 0 plane in homogeneous coordinates before
2598 // converting to cartesian coordinates.
2599
2600 gfx::Rect target_surface_rect = gfx::Rect(-50, -50, 100, 100);
2601 gfx::Rect layer_content_rect = gfx::Rect(-10, -1, 20, 2);
2602 gfx::Transform layer_to_surface_transform;
2603
2604 // The layer is positioned so that the right half of the layer should be in
2605 // front of the camera, while the other half is behind the surface's
2606 // projection plane. The following sequence of transforms applies the
2607 // perspective and rotation about the center of the layer.
2608 layer_to_surface_transform.MakeIdentity();
2609 layer_to_surface_transform.ApplyPerspectiveDepth(1.0);
2610 layer_to_surface_transform.Translate3d(-2.0, 0.0, 1.0);
2611 layer_to_surface_transform.RotateAboutYAxis(45.0);
2612
2613 // Sanity check that this transform does indeed cause w < 0 when applying the
2614 // transform, otherwise this code is not testing the intended scenario.
2615 bool clipped;
2616 MathUtil::MapQuad(layer_to_surface_transform,
2617 gfx::QuadF(gfx::RectF(layer_content_rect)),
2618 &clipped);
2619 ASSERT_TRUE(clipped);
2620
2621 int expected_x_position = 0;
2622 int expected_width = 10;
2623 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
2624 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2625 EXPECT_EQ(expected_x_position, actual.x());
2626 EXPECT_EQ(expected_width, actual.width());
2627 }
2628
2629 TEST_F(LayerTreeHostCommonTest, VisibleRectForPerspectiveUnprojection) {
2630 // To determine visible rect in layer space, there needs to be an
2631 // un-projection from surface space to layer space. When the original
2632 // transform was a perspective projection that was clipped, it returns a rect
2633 // that encloses the clipped bounds. Un-projecting this new rect may require
2634 // clipping again.
2635
2636 // This sequence of transforms causes one corner of the layer to protrude
2637 // across the w = 0 plane, and should be clipped.
2638 gfx::Rect target_surface_rect = gfx::Rect(-50, -50, 100, 100);
2639 gfx::Rect layer_content_rect = gfx::Rect(-10, -10, 20, 20);
2640 gfx::Transform layer_to_surface_transform;
2641 layer_to_surface_transform.MakeIdentity();
2642 layer_to_surface_transform.ApplyPerspectiveDepth(1.0);
2643 layer_to_surface_transform.Translate3d(0.0, 0.0, -5.0);
2644 layer_to_surface_transform.RotateAboutYAxis(45.0);
2645 layer_to_surface_transform.RotateAboutXAxis(80.0);
2646
2647 // Sanity check that un-projection does indeed cause w < 0, otherwise this
2648 // code is not testing the intended scenario.
2649 bool clipped;
2650 gfx::RectF clipped_rect =
2651 MathUtil::MapClippedRect(layer_to_surface_transform, layer_content_rect);
2652 MathUtil::ProjectQuad(
2653 Inverse(layer_to_surface_transform), gfx::QuadF(clipped_rect), &clipped);
2654 ASSERT_TRUE(clipped);
2655
2656 // Only the corner of the layer is not visible on the surface because of being
2657 // clipped. But, the net result of rounding visible region to an axis-aligned
2658 // rect is that the entire layer should still be considered visible.
2659 gfx::Rect expected = gfx::Rect(-10, -10, 20, 20);
2660 gfx::Rect actual = LayerTreeHostCommon::CalculateVisibleRect(
2661 target_surface_rect, layer_content_rect, layer_to_surface_transform);
2662 EXPECT_EQ(expected, actual);
2663 }
2664
2665 TEST_F(LayerTreeHostCommonTest, DrawableAndVisibleContentRectsForSimpleLayers) {
2666 scoped_refptr<Layer> root = Layer::Create();
2667 scoped_refptr<LayerWithForcedDrawsContent> child1 =
2668 make_scoped_refptr(new LayerWithForcedDrawsContent());
2669 scoped_refptr<LayerWithForcedDrawsContent> child2 =
2670 make_scoped_refptr(new LayerWithForcedDrawsContent());
2671 scoped_refptr<LayerWithForcedDrawsContent> child3 =
2672 make_scoped_refptr(new LayerWithForcedDrawsContent());
2673 root->AddChild(child1);
2674 root->AddChild(child2);
2675 root->AddChild(child3);
2676
2677 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
2678 host->SetRootLayer(root);
2679
2680 gfx::Transform identity_matrix;
2681 SetLayerPropertiesForTesting(root.get(),
2682 identity_matrix,
2683 gfx::Point3F(),
2684 gfx::PointF(),
2685 gfx::Size(100, 100),
2686 true,
2687 false);
2688 SetLayerPropertiesForTesting(child1.get(),
2689 identity_matrix,
2690 gfx::Point3F(),
2691 gfx::PointF(),
2692 gfx::Size(50, 50),
2693 true,
2694 false);
2695 SetLayerPropertiesForTesting(child2.get(),
2696 identity_matrix,
2697 gfx::Point3F(),
2698 gfx::PointF(75.f, 75.f),
2699 gfx::Size(50, 50),
2700 true,
2701 false);
2702 SetLayerPropertiesForTesting(child3.get(),
2703 identity_matrix,
2704 gfx::Point3F(),
2705 gfx::PointF(125.f, 125.f),
2706 gfx::Size(50, 50),
2707 true,
2708 false);
2709
2710 ExecuteCalculateDrawProperties(root.get());
2711
2712 EXPECT_EQ(gfx::Rect(0, 0, 100, 100),
2713 root->render_surface()->DrawableContentRect());
2714 EXPECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawable_content_rect());
2715
2716 // Layers that do not draw content should have empty visible_content_rects.
2717 EXPECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
2718
2719 // layer visible_content_rects are clipped by their target surface.
2720 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visible_content_rect());
2721 EXPECT_EQ(gfx::Rect(0, 0, 25, 25), child2->visible_content_rect());
2722 EXPECT_TRUE(child3->visible_content_rect().IsEmpty());
2723
2724 // layer drawable_content_rects are not clipped.
2725 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), child1->drawable_content_rect());
2726 EXPECT_EQ(gfx::Rect(75, 75, 50, 50), child2->drawable_content_rect());
2727 EXPECT_EQ(gfx::Rect(125, 125, 50, 50), child3->drawable_content_rect());
2728 }
2729
2730 TEST_F(LayerTreeHostCommonTest,
2731 DrawableAndVisibleContentRectsForLayersClippedByLayer) {
2732 scoped_refptr<Layer> root = Layer::Create();
2733 scoped_refptr<Layer> child = Layer::Create();
2734 scoped_refptr<LayerWithForcedDrawsContent> grand_child1 =
2735 make_scoped_refptr(new LayerWithForcedDrawsContent());
2736 scoped_refptr<LayerWithForcedDrawsContent> grand_child2 =
2737 make_scoped_refptr(new LayerWithForcedDrawsContent());
2738 scoped_refptr<LayerWithForcedDrawsContent> grand_child3 =
2739 make_scoped_refptr(new LayerWithForcedDrawsContent());
2740 root->AddChild(child);
2741 child->AddChild(grand_child1);
2742 child->AddChild(grand_child2);
2743 child->AddChild(grand_child3);
2744
2745 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
2746 host->SetRootLayer(root);
2747
2748 gfx::Transform identity_matrix;
2749 SetLayerPropertiesForTesting(root.get(),
2750 identity_matrix,
2751 gfx::Point3F(),
2752 gfx::PointF(),
2753 gfx::Size(100, 100),
2754 true,
2755 false);
2756 SetLayerPropertiesForTesting(child.get(),
2757 identity_matrix,
2758 gfx::Point3F(),
2759 gfx::PointF(),
2760 gfx::Size(100, 100),
2761 true,
2762 false);
2763 SetLayerPropertiesForTesting(grand_child1.get(),
2764 identity_matrix,
2765 gfx::Point3F(),
2766 gfx::PointF(5.f, 5.f),
2767 gfx::Size(50, 50),
2768 true,
2769 false);
2770 SetLayerPropertiesForTesting(grand_child2.get(),
2771 identity_matrix,
2772 gfx::Point3F(),
2773 gfx::PointF(75.f, 75.f),
2774 gfx::Size(50, 50),
2775 true,
2776 false);
2777 SetLayerPropertiesForTesting(grand_child3.get(),
2778 identity_matrix,
2779 gfx::Point3F(),
2780 gfx::PointF(125.f, 125.f),
2781 gfx::Size(50, 50),
2782 true,
2783 false);
2784
2785 child->SetMasksToBounds(true);
2786 ExecuteCalculateDrawProperties(root.get());
2787
2788 ASSERT_FALSE(child->render_surface());
2789
2790 EXPECT_EQ(gfx::Rect(0, 0, 100, 100),
2791 root->render_surface()->DrawableContentRect());
2792 EXPECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawable_content_rect());
2793
2794 // Layers that do not draw content should have empty visible content rects.
2795 EXPECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
2796 EXPECT_EQ(gfx::Rect(0, 0, 0, 0), child->visible_content_rect());
2797
2798 // All grandchild visible content rects should be clipped by child.
2799 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), grand_child1->visible_content_rect());
2800 EXPECT_EQ(gfx::Rect(0, 0, 25, 25), grand_child2->visible_content_rect());
2801 EXPECT_TRUE(grand_child3->visible_content_rect().IsEmpty());
2802
2803 // All grandchild DrawableContentRects should also be clipped by child.
2804 EXPECT_EQ(gfx::Rect(5, 5, 50, 50), grand_child1->drawable_content_rect());
2805 EXPECT_EQ(gfx::Rect(75, 75, 25, 25), grand_child2->drawable_content_rect());
2806 EXPECT_TRUE(grand_child3->drawable_content_rect().IsEmpty());
2807 }
2808
2809 TEST_F(LayerTreeHostCommonTest,
2810 DrawableAndVisibleContentRectsForLayersInUnclippedRenderSurface) {
2811 scoped_refptr<Layer> root = Layer::Create();
2812 scoped_refptr<Layer> render_surface1 = Layer::Create();
2813 scoped_refptr<LayerWithForcedDrawsContent> child1 =
2814 make_scoped_refptr(new LayerWithForcedDrawsContent());
2815 scoped_refptr<LayerWithForcedDrawsContent> child2 =
2816 make_scoped_refptr(new LayerWithForcedDrawsContent());
2817 scoped_refptr<LayerWithForcedDrawsContent> child3 =
2818 make_scoped_refptr(new LayerWithForcedDrawsContent());
2819 root->AddChild(render_surface1);
2820 render_surface1->AddChild(child1);
2821 render_surface1->AddChild(child2);
2822 render_surface1->AddChild(child3);
2823
2824 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
2825 host->SetRootLayer(root);
2826
2827 gfx::Transform identity_matrix;
2828 SetLayerPropertiesForTesting(root.get(),
2829 identity_matrix,
2830 gfx::Point3F(),
2831 gfx::PointF(),
2832 gfx::Size(100, 100),
2833 true,
2834 false);
2835 SetLayerPropertiesForTesting(render_surface1.get(),
2836 identity_matrix,
2837 gfx::Point3F(),
2838 gfx::PointF(),
2839 gfx::Size(3, 4),
2840 true,
2841 false);
2842 SetLayerPropertiesForTesting(child1.get(),
2843 identity_matrix,
2844 gfx::Point3F(),
2845 gfx::PointF(5.f, 5.f),
2846 gfx::Size(50, 50),
2847 true,
2848 false);
2849 SetLayerPropertiesForTesting(child2.get(),
2850 identity_matrix,
2851 gfx::Point3F(),
2852 gfx::PointF(75.f, 75.f),
2853 gfx::Size(50, 50),
2854 true,
2855 false);
2856 SetLayerPropertiesForTesting(child3.get(),
2857 identity_matrix,
2858 gfx::Point3F(),
2859 gfx::PointF(125.f, 125.f),
2860 gfx::Size(50, 50),
2861 true,
2862 false);
2863
2864 render_surface1->SetForceRenderSurface(true);
2865 ExecuteCalculateDrawProperties(root.get());
2866
2867 ASSERT_TRUE(render_surface1->render_surface());
2868
2869 EXPECT_EQ(gfx::Rect(0, 0, 100, 100),
2870 root->render_surface()->DrawableContentRect());
2871 EXPECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawable_content_rect());
2872
2873 // Layers that do not draw content should have empty visible content rects.
2874 EXPECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
2875 EXPECT_EQ(gfx::Rect(0, 0, 0, 0), render_surface1->visible_content_rect());
2876
2877 // An unclipped surface grows its DrawableContentRect to include all drawable
2878 // regions of the subtree.
2879 EXPECT_EQ(gfx::Rect(5, 5, 170, 170),
2880 render_surface1->render_surface()->DrawableContentRect());
2881
2882 // All layers that draw content into the unclipped surface are also unclipped.
2883 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visible_content_rect());
2884 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), child2->visible_content_rect());
2885 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), child3->visible_content_rect());
2886
2887 EXPECT_EQ(gfx::Rect(5, 5, 50, 50), child1->drawable_content_rect());
2888 EXPECT_EQ(gfx::Rect(75, 75, 50, 50), child2->drawable_content_rect());
2889 EXPECT_EQ(gfx::Rect(125, 125, 50, 50), child3->drawable_content_rect());
2890 }
2891
2892 TEST_F(LayerTreeHostCommonTest,
2893 VisibleContentRectsForClippedSurfaceWithEmptyClip) {
2894 scoped_refptr<Layer> root = Layer::Create();
2895 scoped_refptr<LayerWithForcedDrawsContent> child1 =
2896 make_scoped_refptr(new LayerWithForcedDrawsContent());
2897 scoped_refptr<LayerWithForcedDrawsContent> child2 =
2898 make_scoped_refptr(new LayerWithForcedDrawsContent());
2899 scoped_refptr<LayerWithForcedDrawsContent> child3 =
2900 make_scoped_refptr(new LayerWithForcedDrawsContent());
2901 root->AddChild(child1);
2902 root->AddChild(child2);
2903 root->AddChild(child3);
2904
2905 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
2906 host->SetRootLayer(root);
2907
2908 gfx::Transform identity_matrix;
2909 SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
2910 gfx::PointF(), gfx::Size(100, 100), true, false);
2911 SetLayerPropertiesForTesting(child1.get(), identity_matrix, gfx::Point3F(),
2912 gfx::PointF(5.f, 5.f), gfx::Size(50, 50), true,
2913 false);
2914 SetLayerPropertiesForTesting(child2.get(), identity_matrix, gfx::Point3F(),
2915 gfx::PointF(75.f, 75.f), gfx::Size(50, 50), true,
2916 false);
2917 SetLayerPropertiesForTesting(child3.get(), identity_matrix, gfx::Point3F(),
2918 gfx::PointF(125.f, 125.f), gfx::Size(50, 50),
2919 true, false);
2920
2921 RenderSurfaceLayerList render_surface_layer_list;
2922 // Now set the root render surface an empty clip.
2923 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
2924 root.get(), gfx::Size(), &render_surface_layer_list);
2925
2926 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
2927 ASSERT_TRUE(root->render_surface());
2928 EXPECT_FALSE(root->is_clipped());
2929
2930 gfx::Rect empty;
2931 EXPECT_EQ(empty, root->render_surface()->clip_rect());
2932 EXPECT_TRUE(root->render_surface()->is_clipped());
2933
2934 // Visible content rect calculation will check if the target surface is
2935 // clipped or not. An empty clip rect does not indicate the render surface
2936 // is unclipped.
2937 EXPECT_EQ(empty, child1->visible_content_rect());
2938 EXPECT_EQ(empty, child2->visible_content_rect());
2939 EXPECT_EQ(empty, child3->visible_content_rect());
2940 }
2941
2942 TEST_F(LayerTreeHostCommonTest,
2943 DrawableAndVisibleContentRectsForLayersWithUninvertibleTransform) {
2944 scoped_refptr<Layer> root = Layer::Create();
2945 scoped_refptr<LayerWithForcedDrawsContent> child =
2946 make_scoped_refptr(new LayerWithForcedDrawsContent());
2947 root->AddChild(child);
2948
2949 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
2950 host->SetRootLayer(root);
2951
2952 // Case 1: a truly degenerate matrix
2953 gfx::Transform identity_matrix;
2954 gfx::Transform uninvertible_matrix(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
2955 ASSERT_FALSE(uninvertible_matrix.IsInvertible());
2956
2957 SetLayerPropertiesForTesting(root.get(),
2958 identity_matrix,
2959 gfx::Point3F(),
2960 gfx::PointF(),
2961 gfx::Size(100, 100),
2962 true,
2963 false);
2964 SetLayerPropertiesForTesting(child.get(),
2965 uninvertible_matrix,
2966 gfx::Point3F(),
2967 gfx::PointF(5.f, 5.f),
2968 gfx::Size(50, 50),
2969 true,
2970 false);
2971
2972 ExecuteCalculateDrawProperties(root.get());
2973
2974 EXPECT_TRUE(child->visible_content_rect().IsEmpty());
2975 EXPECT_TRUE(child->drawable_content_rect().IsEmpty());
2976
2977 // Case 2: a matrix with flattened z, uninvertible and not visible according
2978 // to the CSS spec.
2979 uninvertible_matrix.MakeIdentity();
2980 uninvertible_matrix.matrix().set(2, 2, 0.0);
2981 ASSERT_FALSE(uninvertible_matrix.IsInvertible());
2982
2983 SetLayerPropertiesForTesting(child.get(),
2984 uninvertible_matrix,
2985 gfx::Point3F(),
2986 gfx::PointF(5.f, 5.f),
2987 gfx::Size(50, 50),
2988 true,
2989 false);
2990
2991 ExecuteCalculateDrawProperties(root.get());
2992
2993 EXPECT_TRUE(child->visible_content_rect().IsEmpty());
2994 EXPECT_TRUE(child->drawable_content_rect().IsEmpty());
2995
2996 // Case 3: a matrix with flattened z, also uninvertible and not visible.
2997 uninvertible_matrix.MakeIdentity();
2998 uninvertible_matrix.Translate(500.0, 0.0);
2999 uninvertible_matrix.matrix().set(2, 2, 0.0);
3000 ASSERT_FALSE(uninvertible_matrix.IsInvertible());
3001
3002 SetLayerPropertiesForTesting(child.get(),
3003 uninvertible_matrix,
3004 gfx::Point3F(),
3005 gfx::PointF(5.f, 5.f),
3006 gfx::Size(50, 50),
3007 true,
3008 false);
3009
3010 ExecuteCalculateDrawProperties(root.get());
3011
3012 EXPECT_TRUE(child->visible_content_rect().IsEmpty());
3013 EXPECT_TRUE(child->drawable_content_rect().IsEmpty());
3014 }
3015
3016 TEST_F(LayerTreeHostCommonTest,
3017 SingularTransformDoesNotPreventClearingDrawProperties) {
3018 scoped_refptr<Layer> root = Layer::Create();
3019 scoped_refptr<LayerWithForcedDrawsContent> child =
3020 make_scoped_refptr(new LayerWithForcedDrawsContent());
3021 root->AddChild(child);
3022
3023 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
3024 host->SetRootLayer(root);
3025
3026 gfx::Transform identity_matrix;
3027 gfx::Transform uninvertible_matrix(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
3028 ASSERT_FALSE(uninvertible_matrix.IsInvertible());
3029
3030 SetLayerPropertiesForTesting(root.get(),
3031 uninvertible_matrix,
3032 gfx::Point3F(),
3033 gfx::PointF(),
3034 gfx::Size(100, 100),
3035 true,
3036 false);
3037 SetLayerPropertiesForTesting(child.get(),
3038 identity_matrix,
3039 gfx::Point3F(),
3040 gfx::PointF(5.f, 5.f),
3041 gfx::Size(50, 50),
3042 true,
3043 false);
3044
3045 child->draw_properties().sorted_for_recursion = true;
3046
3047 TransformOperations start_transform_operations;
3048 start_transform_operations.AppendScale(1.f, 0.f, 0.f);
3049
3050 TransformOperations end_transform_operations;
3051 end_transform_operations.AppendScale(1.f, 1.f, 0.f);
3052
3053 AddAnimatedTransformToLayer(
3054 root.get(), 10.0, start_transform_operations, end_transform_operations);
3055
3056 EXPECT_TRUE(root->TransformIsAnimating());
3057
3058 ExecuteCalculateDrawProperties(root.get());
3059
3060 EXPECT_FALSE(child->draw_properties().sorted_for_recursion);
3061 }
3062
3063 TEST_F(LayerTreeHostCommonTest,
3064 SingularNonAnimatingTransformDoesNotPreventClearingDrawProperties) {
3065 scoped_refptr<Layer> root = Layer::Create();
3066
3067 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
3068 host->SetRootLayer(root);
3069
3070 gfx::Transform identity_matrix;
3071 gfx::Transform uninvertible_matrix(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
3072 ASSERT_FALSE(uninvertible_matrix.IsInvertible());
3073
3074 SetLayerPropertiesForTesting(root.get(),
3075 uninvertible_matrix,
3076 gfx::Point3F(),
3077 gfx::PointF(),
3078 gfx::Size(100, 100),
3079 true,
3080 false);
3081
3082 root->draw_properties().sorted_for_recursion = true;
3083
3084 EXPECT_FALSE(root->TransformIsAnimating());
3085
3086 ExecuteCalculateDrawProperties(root.get());
3087
3088 EXPECT_FALSE(root->draw_properties().sorted_for_recursion);
3089 }
3090
3091 TEST_F(LayerTreeHostCommonTest,
3092 DrawableAndVisibleContentRectsForLayersInClippedRenderSurface) {
3093 scoped_refptr<Layer> root = Layer::Create();
3094 scoped_refptr<Layer> render_surface1 = Layer::Create();
3095 scoped_refptr<LayerWithForcedDrawsContent> child1 =
3096 make_scoped_refptr(new LayerWithForcedDrawsContent());
3097 scoped_refptr<LayerWithForcedDrawsContent> child2 =
3098 make_scoped_refptr(new LayerWithForcedDrawsContent());
3099 scoped_refptr<LayerWithForcedDrawsContent> child3 =
3100 make_scoped_refptr(new LayerWithForcedDrawsContent());
3101 root->AddChild(render_surface1);
3102 render_surface1->AddChild(child1);
3103 render_surface1->AddChild(child2);
3104 render_surface1->AddChild(child3);
3105
3106 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
3107 host->SetRootLayer(root);
3108
3109 gfx::Transform identity_matrix;
3110 SetLayerPropertiesForTesting(root.get(),
3111 identity_matrix,
3112 gfx::Point3F(),
3113 gfx::PointF(),
3114 gfx::Size(100, 100),
3115 true,
3116 false);
3117 SetLayerPropertiesForTesting(render_surface1.get(),
3118 identity_matrix,
3119 gfx::Point3F(),
3120 gfx::PointF(),
3121 gfx::Size(3, 4),
3122 true,
3123 false);
3124 SetLayerPropertiesForTesting(child1.get(),
3125 identity_matrix,
3126 gfx::Point3F(),
3127 gfx::PointF(5.f, 5.f),
3128 gfx::Size(50, 50),
3129 true,
3130 false);
3131 SetLayerPropertiesForTesting(child2.get(),
3132 identity_matrix,
3133 gfx::Point3F(),
3134 gfx::PointF(75.f, 75.f),
3135 gfx::Size(50, 50),
3136 true,
3137 false);
3138 SetLayerPropertiesForTesting(child3.get(),
3139 identity_matrix,
3140 gfx::Point3F(),
3141 gfx::PointF(125.f, 125.f),
3142 gfx::Size(50, 50),
3143 true,
3144 false);
3145
3146 root->SetMasksToBounds(true);
3147 render_surface1->SetForceRenderSurface(true);
3148 ExecuteCalculateDrawProperties(root.get());
3149
3150 ASSERT_TRUE(render_surface1->render_surface());
3151
3152 EXPECT_EQ(gfx::Rect(0, 0, 100, 100),
3153 root->render_surface()->DrawableContentRect());
3154 EXPECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawable_content_rect());
3155
3156 // Layers that do not draw content should have empty visible content rects.
3157 EXPECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
3158 EXPECT_EQ(gfx::Rect(0, 0, 0, 0), render_surface1->visible_content_rect());
3159
3160 // A clipped surface grows its DrawableContentRect to include all drawable
3161 // regions of the subtree, but also gets clamped by the ancestor's clip.
3162 EXPECT_EQ(gfx::Rect(5, 5, 95, 95),
3163 render_surface1->render_surface()->DrawableContentRect());
3164
3165 // All layers that draw content into the surface have their visible content
3166 // rect clipped by the surface clip rect.
3167 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visible_content_rect());
3168 EXPECT_EQ(gfx::Rect(0, 0, 25, 25), child2->visible_content_rect());
3169 EXPECT_TRUE(child3->visible_content_rect().IsEmpty());
3170
3171 // But the DrawableContentRects are unclipped.
3172 EXPECT_EQ(gfx::Rect(5, 5, 50, 50), child1->drawable_content_rect());
3173 EXPECT_EQ(gfx::Rect(75, 75, 50, 50), child2->drawable_content_rect());
3174 EXPECT_EQ(gfx::Rect(125, 125, 50, 50), child3->drawable_content_rect());
3175 }
3176
3177 TEST_F(LayerTreeHostCommonTest,
3178 DrawableAndVisibleContentRectsForSurfaceHierarchy) {
3179 // Check that clipping does not propagate down surfaces.
3180 scoped_refptr<Layer> root = Layer::Create();
3181 scoped_refptr<Layer> render_surface1 = Layer::Create();
3182 scoped_refptr<Layer> render_surface2 = Layer::Create();
3183 scoped_refptr<LayerWithForcedDrawsContent> child1 =
3184 make_scoped_refptr(new LayerWithForcedDrawsContent());
3185 scoped_refptr<LayerWithForcedDrawsContent> child2 =
3186 make_scoped_refptr(new LayerWithForcedDrawsContent());
3187 scoped_refptr<LayerWithForcedDrawsContent> child3 =
3188 make_scoped_refptr(new LayerWithForcedDrawsContent());
3189 root->AddChild(render_surface1);
3190 render_surface1->AddChild(render_surface2);
3191 render_surface2->AddChild(child1);
3192 render_surface2->AddChild(child2);
3193 render_surface2->AddChild(child3);
3194
3195 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
3196 host->SetRootLayer(root);
3197
3198 gfx::Transform identity_matrix;
3199 SetLayerPropertiesForTesting(root.get(),
3200 identity_matrix,
3201 gfx::Point3F(),
3202 gfx::PointF(),
3203 gfx::Size(100, 100),
3204 true,
3205 false);
3206 SetLayerPropertiesForTesting(render_surface1.get(),
3207 identity_matrix,
3208 gfx::Point3F(),
3209 gfx::PointF(),
3210 gfx::Size(3, 4),
3211 true,
3212 false);
3213 SetLayerPropertiesForTesting(render_surface2.get(),
3214 identity_matrix,
3215 gfx::Point3F(),
3216 gfx::PointF(),
3217 gfx::Size(7, 13),
3218 true,
3219 false);
3220 SetLayerPropertiesForTesting(child1.get(),
3221 identity_matrix,
3222 gfx::Point3F(),
3223 gfx::PointF(5.f, 5.f),
3224 gfx::Size(50, 50),
3225 true,
3226 false);
3227 SetLayerPropertiesForTesting(child2.get(),
3228 identity_matrix,
3229 gfx::Point3F(),
3230 gfx::PointF(75.f, 75.f),
3231 gfx::Size(50, 50),
3232 true,
3233 false);
3234 SetLayerPropertiesForTesting(child3.get(),
3235 identity_matrix,
3236 gfx::Point3F(),
3237 gfx::PointF(125.f, 125.f),
3238 gfx::Size(50, 50),
3239 true,
3240 false);
3241
3242 root->SetMasksToBounds(true);
3243 render_surface1->SetForceRenderSurface(true);
3244 render_surface2->SetForceRenderSurface(true);
3245 ExecuteCalculateDrawProperties(root.get());
3246
3247 ASSERT_TRUE(render_surface1->render_surface());
3248 ASSERT_TRUE(render_surface2->render_surface());
3249
3250 EXPECT_EQ(gfx::Rect(0, 0, 100, 100),
3251 root->render_surface()->DrawableContentRect());
3252 EXPECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawable_content_rect());
3253
3254 // Layers that do not draw content should have empty visible content rects.
3255 EXPECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
3256 EXPECT_EQ(gfx::Rect(0, 0, 0, 0), render_surface1->visible_content_rect());
3257 EXPECT_EQ(gfx::Rect(0, 0, 0, 0), render_surface2->visible_content_rect());
3258
3259 // A clipped surface grows its DrawableContentRect to include all drawable
3260 // regions of the subtree, but also gets clamped by the ancestor's clip.
3261 EXPECT_EQ(gfx::Rect(5, 5, 95, 95),
3262 render_surface1->render_surface()->DrawableContentRect());
3263
3264 // render_surface1 lives in the "unclipped universe" of render_surface1, and
3265 // is only implicitly clipped by render_surface1's content rect. So,
3266 // render_surface2 grows to enclose all drawable content of its subtree.
3267 EXPECT_EQ(gfx::Rect(5, 5, 170, 170),
3268 render_surface2->render_surface()->DrawableContentRect());
3269
3270 // All layers that draw content into render_surface2 think they are unclipped.
3271 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visible_content_rect());
3272 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), child2->visible_content_rect());
3273 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), child3->visible_content_rect());
3274
3275 // DrawableContentRects are also unclipped.
3276 EXPECT_EQ(gfx::Rect(5, 5, 50, 50), child1->drawable_content_rect());
3277 EXPECT_EQ(gfx::Rect(75, 75, 50, 50), child2->drawable_content_rect());
3278 EXPECT_EQ(gfx::Rect(125, 125, 50, 50), child3->drawable_content_rect());
3279 }
3280
3281 TEST_F(LayerTreeHostCommonTest,
3282 DrawableAndVisibleContentRectsWithTransformOnUnclippedSurface) {
3283 // Layers that have non-axis aligned bounds (due to transforms) have an
3284 // expanded, axis-aligned DrawableContentRect and visible content rect.
3285
3286 scoped_refptr<Layer> root = Layer::Create();
3287 scoped_refptr<Layer> render_surface1 = Layer::Create();
3288 scoped_refptr<LayerWithForcedDrawsContent> child1 =
3289 make_scoped_refptr(new LayerWithForcedDrawsContent());
3290 root->AddChild(render_surface1);
3291 render_surface1->AddChild(child1);
3292
3293 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
3294 host->SetRootLayer(root);
3295
3296 gfx::Transform identity_matrix;
3297 gfx::Transform child_rotation;
3298 child_rotation.Rotate(45.0);
3299 SetLayerPropertiesForTesting(root.get(),
3300 identity_matrix,
3301 gfx::Point3F(),
3302 gfx::PointF(),
3303 gfx::Size(100, 100),
3304 true,
3305 false);
3306 SetLayerPropertiesForTesting(render_surface1.get(),
3307 identity_matrix,
3308 gfx::Point3F(),
3309 gfx::PointF(),
3310 gfx::Size(3, 4),
3311 true,
3312 false);
3313 SetLayerPropertiesForTesting(child1.get(),
3314 child_rotation,
3315 gfx::Point3F(25, 25, 0.f),
3316 gfx::PointF(25.f, 25.f),
3317 gfx::Size(50, 50),
3318 true,
3319 false);
3320
3321 render_surface1->SetForceRenderSurface(true);
3322 ExecuteCalculateDrawProperties(root.get());
3323
3324 ASSERT_TRUE(render_surface1->render_surface());
3325
3326 EXPECT_EQ(gfx::Rect(0, 0, 100, 100),
3327 root->render_surface()->DrawableContentRect());
3328 EXPECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawable_content_rect());
3329
3330 // Layers that do not draw content should have empty visible content rects.
3331 EXPECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
3332 EXPECT_EQ(gfx::Rect(0, 0, 0, 0), render_surface1->visible_content_rect());
3333
3334 // The unclipped surface grows its DrawableContentRect to include all drawable
3335 // regions of the subtree.
3336 int diagonal_radius = ceil(sqrt(2.0) * 25.0);
3337 gfx::Rect expected_surface_drawable_content =
3338 gfx::Rect(50 - diagonal_radius,
3339 50 - diagonal_radius,
3340 diagonal_radius * 2,
3341 diagonal_radius * 2);
3342 EXPECT_EQ(expected_surface_drawable_content,
3343 render_surface1->render_surface()->DrawableContentRect());
3344
3345 // All layers that draw content into the unclipped surface are also unclipped.
3346 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visible_content_rect());
3347 EXPECT_EQ(expected_surface_drawable_content, child1->drawable_content_rect());
3348 }
3349
3350 TEST_F(LayerTreeHostCommonTest,
3351 DrawableAndVisibleContentRectsWithTransformOnClippedSurface) {
3352 // Layers that have non-axis aligned bounds (due to transforms) have an
3353 // expanded, axis-aligned DrawableContentRect and visible content rect.
3354
3355 scoped_refptr<Layer> root = Layer::Create();
3356 scoped_refptr<Layer> render_surface1 = Layer::Create();
3357 scoped_refptr<LayerWithForcedDrawsContent> child1 =
3358 make_scoped_refptr(new LayerWithForcedDrawsContent());
3359 root->AddChild(render_surface1);
3360 render_surface1->AddChild(child1);
3361
3362 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
3363 host->SetRootLayer(root);
3364
3365 gfx::Transform identity_matrix;
3366 gfx::Transform child_rotation;
3367 child_rotation.Rotate(45.0);
3368 SetLayerPropertiesForTesting(root.get(),
3369 identity_matrix,
3370 gfx::Point3F(),
3371 gfx::PointF(),
3372 gfx::Size(50, 50),
3373 true,
3374 false);
3375 SetLayerPropertiesForTesting(render_surface1.get(),
3376 identity_matrix,
3377 gfx::Point3F(),
3378 gfx::PointF(),
3379 gfx::Size(3, 4),
3380 true,
3381 false);
3382
3383 SetLayerPropertiesForTesting(child1.get(),
3384 child_rotation,
3385 gfx::Point3F(25, 25, 0.f),
3386 gfx::PointF(25.f, 25.f),
3387 gfx::Size(50, 50),
3388 true,
3389 false);
3390
3391 root->SetMasksToBounds(true);
3392 render_surface1->SetForceRenderSurface(true);
3393 ExecuteCalculateDrawProperties(root.get());
3394
3395 ASSERT_TRUE(render_surface1->render_surface());
3396
3397 // The clipped surface clamps the DrawableContentRect that encloses the
3398 // rotated layer.
3399 int diagonal_radius = ceil(sqrt(2.0) * 25.0);
3400 gfx::Rect unclipped_surface_content = gfx::Rect(50 - diagonal_radius,
3401 50 - diagonal_radius,
3402 diagonal_radius * 2,
3403 diagonal_radius * 2);
3404 gfx::Rect expected_surface_drawable_content =
3405 gfx::IntersectRects(unclipped_surface_content, gfx::Rect(0, 0, 50, 50));
3406 EXPECT_EQ(expected_surface_drawable_content,
3407 render_surface1->render_surface()->DrawableContentRect());
3408
3409 // On the clipped surface, only a quarter of the child1 is visible, but when
3410 // rotating it back to child1's content space, the actual enclosing rect ends
3411 // up covering the full left half of child1.
3412 //
3413 // Given the floating point math, this number is a little bit fuzzy.
3414 EXPECT_EQ(gfx::Rect(0, 0, 26, 50), child1->visible_content_rect());
3415
3416 // The child's DrawableContentRect is unclipped.
3417 EXPECT_EQ(unclipped_surface_content, child1->drawable_content_rect());
3418 }
3419
3420 TEST_F(LayerTreeHostCommonTest, DrawableAndVisibleContentRectsInHighDPI) {
3421 MockContentLayerClient client;
3422
3423 scoped_refptr<Layer> root = Layer::Create();
3424 scoped_refptr<FakePictureLayer> render_surface1 =
3425 CreateDrawablePictureLayer(&client);
3426 scoped_refptr<FakePictureLayer> render_surface2 =
3427 CreateDrawablePictureLayer(&client);
3428 scoped_refptr<FakePictureLayer> child1 = CreateDrawablePictureLayer(&client);
3429 scoped_refptr<FakePictureLayer> child2 = CreateDrawablePictureLayer(&client);
3430 scoped_refptr<FakePictureLayer> child3 = CreateDrawablePictureLayer(&client);
3431 root->AddChild(render_surface1);
3432 render_surface1->AddChild(render_surface2);
3433 render_surface2->AddChild(child1);
3434 render_surface2->AddChild(child2);
3435 render_surface2->AddChild(child3);
3436
3437 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
3438 host->SetRootLayer(root);
3439
3440 gfx::Transform identity_matrix;
3441 SetLayerPropertiesForTesting(root.get(),
3442 identity_matrix,
3443 gfx::Point3F(),
3444 gfx::PointF(),
3445 gfx::Size(100, 100),
3446 true,
3447 false);
3448 SetLayerPropertiesForTesting(render_surface1.get(),
3449 identity_matrix,
3450 gfx::Point3F(),
3451 gfx::PointF(5.f, 5.f),
3452 gfx::Size(3, 4),
3453 true,
3454 false);
3455 SetLayerPropertiesForTesting(render_surface2.get(),
3456 identity_matrix,
3457 gfx::Point3F(),
3458 gfx::PointF(5.f, 5.f),
3459 gfx::Size(7, 13),
3460 true,
3461 false);
3462 SetLayerPropertiesForTesting(child1.get(),
3463 identity_matrix,
3464 gfx::Point3F(),
3465 gfx::PointF(5.f, 5.f),
3466 gfx::Size(50, 50),
3467 true,
3468 false);
3469 SetLayerPropertiesForTesting(child2.get(),
3470 identity_matrix,
3471 gfx::Point3F(),
3472 gfx::PointF(75.f, 75.f),
3473 gfx::Size(50, 50),
3474 true,
3475 false);
3476 SetLayerPropertiesForTesting(child3.get(),
3477 identity_matrix,
3478 gfx::Point3F(),
3479 gfx::PointF(125.f, 125.f),
3480 gfx::Size(50, 50),
3481 true,
3482 false);
3483
3484 float device_scale_factor = 2.f;
3485
3486 root->SetMasksToBounds(true);
3487 render_surface1->SetForceRenderSurface(true);
3488 render_surface2->SetForceRenderSurface(true);
3489 ExecuteCalculateDrawProperties(root.get(), device_scale_factor);
3490
3491 ASSERT_TRUE(render_surface1->render_surface());
3492 ASSERT_TRUE(render_surface2->render_surface());
3493
3494 // drawable_content_rects for all layers and surfaces are scaled by
3495 // device_scale_factor.
3496 EXPECT_EQ(gfx::Rect(0, 0, 200, 200),
3497 root->render_surface()->DrawableContentRect());
3498 EXPECT_EQ(gfx::Rect(0, 0, 200, 200), root->drawable_content_rect());
3499 EXPECT_EQ(gfx::Rect(10, 10, 190, 190),
3500 render_surface1->render_surface()->DrawableContentRect());
3501
3502 // render_surface2 lives in the "unclipped universe" of render_surface1, and
3503 // is only implicitly clipped by render_surface1.
3504 EXPECT_EQ(gfx::Rect(10, 10, 350, 350),
3505 render_surface2->render_surface()->DrawableContentRect());
3506
3507 EXPECT_EQ(gfx::Rect(10, 10, 100, 100), child1->drawable_content_rect());
3508 EXPECT_EQ(gfx::Rect(150, 150, 100, 100), child2->drawable_content_rect());
3509 EXPECT_EQ(gfx::Rect(250, 250, 100, 100), child3->drawable_content_rect());
3510
3511 // The root layer does not actually draw content of its own.
3512 EXPECT_EQ(gfx::Rect(0, 0, 0, 0), root->visible_content_rect());
3513
3514 // All layer visible content rects are not expressed in content space of each
3515 // layer, so they are not scaled by the device_scale_factor.
3516 EXPECT_EQ(gfx::Rect(0, 0, 3, 4), render_surface1->visible_content_rect());
3517 EXPECT_EQ(gfx::Rect(0, 0, 7, 13), render_surface2->visible_content_rect());
3518 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visible_content_rect());
3519 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), child2->visible_content_rect());
3520 EXPECT_EQ(gfx::Rect(0, 0, 50, 50), child3->visible_content_rect());
3521 }
3522
3523 TEST_F(LayerTreeHostCommonTest, BackFaceCullingWithoutPreserves3d) {
3524 // Verify the behavior of back-face culling when there are no preserve-3d
3525 // layers. Note that 3d transforms still apply in this case, but they are
3526 // "flattened" to each parent layer according to current W3C spec.
3527
3528 const gfx::Transform identity_matrix;
3529 scoped_refptr<Layer> parent = Layer::Create();
3530 scoped_refptr<LayerWithForcedDrawsContent> front_facing_child =
3531 make_scoped_refptr(new LayerWithForcedDrawsContent());
3532 scoped_refptr<LayerWithForcedDrawsContent> back_facing_child =
3533 make_scoped_refptr(new LayerWithForcedDrawsContent());
3534 scoped_refptr<LayerWithForcedDrawsContent> front_facing_surface =
3535 make_scoped_refptr(new LayerWithForcedDrawsContent());
3536 scoped_refptr<LayerWithForcedDrawsContent> back_facing_surface =
3537 make_scoped_refptr(new LayerWithForcedDrawsContent());
3538 scoped_refptr<LayerWithForcedDrawsContent>
3539 front_facing_child_of_front_facing_surface =
3540 make_scoped_refptr(new LayerWithForcedDrawsContent());
3541 scoped_refptr<LayerWithForcedDrawsContent>
3542 back_facing_child_of_front_facing_surface =
3543 make_scoped_refptr(new LayerWithForcedDrawsContent());
3544 scoped_refptr<LayerWithForcedDrawsContent>
3545 front_facing_child_of_back_facing_surface =
3546 make_scoped_refptr(new LayerWithForcedDrawsContent());
3547 scoped_refptr<LayerWithForcedDrawsContent>
3548 back_facing_child_of_back_facing_surface =
3549 make_scoped_refptr(new LayerWithForcedDrawsContent());
3550
3551 parent->AddChild(front_facing_child);
3552 parent->AddChild(back_facing_child);
3553 parent->AddChild(front_facing_surface);
3554 parent->AddChild(back_facing_surface);
3555 front_facing_surface->AddChild(front_facing_child_of_front_facing_surface);
3556 front_facing_surface->AddChild(back_facing_child_of_front_facing_surface);
3557 back_facing_surface->AddChild(front_facing_child_of_back_facing_surface);
3558 back_facing_surface->AddChild(back_facing_child_of_back_facing_surface);
3559
3560 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
3561 host->SetRootLayer(parent);
3562
3563 // Nothing is double-sided
3564 front_facing_child->SetDoubleSided(false);
3565 back_facing_child->SetDoubleSided(false);
3566 front_facing_surface->SetDoubleSided(false);
3567 back_facing_surface->SetDoubleSided(false);
3568 front_facing_child_of_front_facing_surface->SetDoubleSided(false);
3569 back_facing_child_of_front_facing_surface->SetDoubleSided(false);
3570 front_facing_child_of_back_facing_surface->SetDoubleSided(false);
3571 back_facing_child_of_back_facing_surface->SetDoubleSided(false);
3572
3573 gfx::Transform backface_matrix;
3574 backface_matrix.Translate(50.0, 50.0);
3575 backface_matrix.RotateAboutYAxis(180.0);
3576 backface_matrix.Translate(-50.0, -50.0);
3577
3578 // Having a descendant and opacity will force these to have render surfaces.
3579 front_facing_surface->SetOpacity(0.5f);
3580 back_facing_surface->SetOpacity(0.5f);
3581
3582 // Nothing preserves 3d. According to current W3C CSS gfx::Transforms spec,
3583 // these layers should blindly use their own local transforms to determine
3584 // back-face culling.
3585 SetLayerPropertiesForTesting(parent.get(),
3586 identity_matrix,
3587 gfx::Point3F(),
3588 gfx::PointF(),
3589 gfx::Size(100, 100),
3590 true,
3591 false);
3592 SetLayerPropertiesForTesting(front_facing_child.get(),
3593 identity_matrix,
3594 gfx::Point3F(),
3595 gfx::PointF(),
3596 gfx::Size(100, 100),
3597 true,
3598 false);
3599 SetLayerPropertiesForTesting(back_facing_child.get(),
3600 backface_matrix,
3601 gfx::Point3F(),
3602 gfx::PointF(),
3603 gfx::Size(100, 100),
3604 true,
3605 false);
3606 SetLayerPropertiesForTesting(front_facing_surface.get(),
3607 identity_matrix,
3608 gfx::Point3F(),
3609 gfx::PointF(),
3610 gfx::Size(100, 100),
3611 true,
3612 false);
3613 SetLayerPropertiesForTesting(back_facing_surface.get(),
3614 backface_matrix,
3615 gfx::Point3F(),
3616 gfx::PointF(),
3617 gfx::Size(100, 100),
3618 true,
3619 false);
3620 SetLayerPropertiesForTesting(front_facing_child_of_front_facing_surface.get(),
3621 identity_matrix,
3622 gfx::Point3F(),
3623 gfx::PointF(),
3624 gfx::Size(100, 100),
3625 true,
3626 false);
3627 SetLayerPropertiesForTesting(back_facing_child_of_front_facing_surface.get(),
3628 backface_matrix,
3629 gfx::Point3F(),
3630 gfx::PointF(),
3631 gfx::Size(100, 100),
3632 true,
3633 false);
3634 SetLayerPropertiesForTesting(front_facing_child_of_back_facing_surface.get(),
3635 identity_matrix,
3636 gfx::Point3F(),
3637 gfx::PointF(),
3638 gfx::Size(100, 100),
3639 true,
3640 false);
3641 SetLayerPropertiesForTesting(back_facing_child_of_back_facing_surface.get(),
3642 backface_matrix,
3643 gfx::Point3F(),
3644 gfx::PointF(),
3645 gfx::Size(100, 100),
3646 true,
3647 false);
3648
3649 RenderSurfaceLayerList render_surface_layer_list;
3650 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
3651 parent.get(), parent->bounds(), &render_surface_layer_list);
3652 inputs.can_adjust_raster_scales = true;
3653 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
3654
3655 // Verify which render surfaces were created.
3656 EXPECT_FALSE(front_facing_child->render_surface());
3657 EXPECT_FALSE(back_facing_child->render_surface());
3658 EXPECT_TRUE(front_facing_surface->render_surface());
3659 EXPECT_TRUE(back_facing_surface->render_surface());
3660 EXPECT_FALSE(front_facing_child_of_front_facing_surface->render_surface());
3661 EXPECT_FALSE(back_facing_child_of_front_facing_surface->render_surface());
3662 EXPECT_FALSE(front_facing_child_of_back_facing_surface->render_surface());
3663 EXPECT_FALSE(back_facing_child_of_back_facing_surface->render_surface());
3664
3665 // Verify the render_surface_layer_list.
3666 ASSERT_EQ(3u, render_surface_layer_list.size());
3667 EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
3668 EXPECT_EQ(front_facing_surface->id(), render_surface_layer_list.at(1)->id());
3669 // Even though the back facing surface LAYER gets culled, the other
3670 // descendants should still be added, so the SURFACE should not be culled.
3671 EXPECT_EQ(back_facing_surface->id(), render_surface_layer_list.at(2)->id());
3672
3673 // Verify root surface's layer list.
3674 ASSERT_EQ(
3675 3u,
3676 render_surface_layer_list.at(0)->render_surface()->layer_list().size());
3677 EXPECT_EQ(front_facing_child->id(),
3678 render_surface_layer_list.at(0)
3679 ->render_surface()
3680 ->layer_list()
3681 .at(0)
3682 ->id());
3683 EXPECT_EQ(front_facing_surface->id(),
3684 render_surface_layer_list.at(0)
3685 ->render_surface()
3686 ->layer_list()
3687 .at(1)
3688 ->id());
3689 EXPECT_EQ(back_facing_surface->id(),
3690 render_surface_layer_list.at(0)
3691 ->render_surface()
3692 ->layer_list()
3693 .at(2)
3694 ->id());
3695
3696 // Verify front_facing_surface's layer list.
3697 ASSERT_EQ(
3698 2u,
3699 render_surface_layer_list.at(1)->render_surface()->layer_list().size());
3700 EXPECT_EQ(front_facing_surface->id(),
3701 render_surface_layer_list.at(1)
3702 ->render_surface()
3703 ->layer_list()
3704 .at(0)
3705 ->id());
3706 EXPECT_EQ(front_facing_child_of_front_facing_surface->id(),
3707 render_surface_layer_list.at(1)
3708 ->render_surface()
3709 ->layer_list()
3710 .at(1)
3711 ->id());
3712
3713 // Verify back_facing_surface's layer list; its own layer should be culled
3714 // from the surface list.
3715 ASSERT_EQ(
3716 1u,
3717 render_surface_layer_list.at(2)->render_surface()->layer_list().size());
3718 EXPECT_EQ(front_facing_child_of_back_facing_surface->id(),
3719 render_surface_layer_list.at(2)
3720 ->render_surface()
3721 ->layer_list()
3722 .at(0)
3723 ->id());
3724 }
3725
3726 TEST_F(LayerTreeHostCommonTest, BackFaceCullingWithPreserves3d) {
3727 // Verify the behavior of back-face culling when preserves-3d transform style
3728 // is used.
3729
3730 const gfx::Transform identity_matrix;
3731 scoped_refptr<Layer> parent = Layer::Create();
3732 scoped_refptr<LayerWithForcedDrawsContent> front_facing_child =
3733 make_scoped_refptr(new LayerWithForcedDrawsContent());
3734 scoped_refptr<LayerWithForcedDrawsContent> back_facing_child =
3735 make_scoped_refptr(new LayerWithForcedDrawsContent());
3736 scoped_refptr<LayerWithForcedDrawsContent> front_facing_surface =
3737 make_scoped_refptr(new LayerWithForcedDrawsContent());
3738 scoped_refptr<LayerWithForcedDrawsContent> back_facing_surface =
3739 make_scoped_refptr(new LayerWithForcedDrawsContent());
3740 scoped_refptr<LayerWithForcedDrawsContent>
3741 front_facing_child_of_front_facing_surface =
3742 make_scoped_refptr(new LayerWithForcedDrawsContent());
3743 scoped_refptr<LayerWithForcedDrawsContent>
3744 back_facing_child_of_front_facing_surface =
3745 make_scoped_refptr(new LayerWithForcedDrawsContent());
3746 scoped_refptr<LayerWithForcedDrawsContent>
3747 front_facing_child_of_back_facing_surface =
3748 make_scoped_refptr(new LayerWithForcedDrawsContent());
3749 scoped_refptr<LayerWithForcedDrawsContent>
3750 back_facing_child_of_back_facing_surface =
3751 make_scoped_refptr(new LayerWithForcedDrawsContent());
3752 scoped_refptr<LayerWithForcedDrawsContent> dummy_replica_layer1 =
3753 make_scoped_refptr(new LayerWithForcedDrawsContent());
3754 scoped_refptr<LayerWithForcedDrawsContent> dummy_replica_layer2 =
3755 make_scoped_refptr(new LayerWithForcedDrawsContent());
3756
3757 parent->AddChild(front_facing_child);
3758 parent->AddChild(back_facing_child);
3759 parent->AddChild(front_facing_surface);
3760 parent->AddChild(back_facing_surface);
3761 front_facing_surface->AddChild(front_facing_child_of_front_facing_surface);
3762 front_facing_surface->AddChild(back_facing_child_of_front_facing_surface);
3763 back_facing_surface->AddChild(front_facing_child_of_back_facing_surface);
3764 back_facing_surface->AddChild(back_facing_child_of_back_facing_surface);
3765
3766 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
3767 host->SetRootLayer(parent);
3768
3769 // Nothing is double-sided
3770 front_facing_child->SetDoubleSided(false);
3771 back_facing_child->SetDoubleSided(false);
3772 front_facing_surface->SetDoubleSided(false);
3773 back_facing_surface->SetDoubleSided(false);
3774 front_facing_child_of_front_facing_surface->SetDoubleSided(false);
3775 back_facing_child_of_front_facing_surface->SetDoubleSided(false);
3776 front_facing_child_of_back_facing_surface->SetDoubleSided(false);
3777 back_facing_child_of_back_facing_surface->SetDoubleSided(false);
3778
3779 gfx::Transform backface_matrix;
3780 backface_matrix.Translate(50.0, 50.0);
3781 backface_matrix.RotateAboutYAxis(180.0);
3782 backface_matrix.Translate(-50.0, -50.0);
3783
3784 // Opacity will not force creation of render surfaces in this case because of
3785 // the preserve-3d transform style. Instead, an example of when a surface
3786 // would be created with preserve-3d is when there is a replica layer.
3787 front_facing_surface->SetReplicaLayer(dummy_replica_layer1.get());
3788 back_facing_surface->SetReplicaLayer(dummy_replica_layer2.get());
3789
3790 // Each surface creates its own new 3d rendering context (as defined by W3C
3791 // spec). According to current W3C CSS gfx::Transforms spec, layers in a 3d
3792 // rendering context should use the transform with respect to that context.
3793 // This 3d rendering context occurs when (a) parent's transform style is flat
3794 // and (b) the layer's transform style is preserve-3d.
3795 SetLayerPropertiesForTesting(parent.get(),
3796 identity_matrix,
3797 gfx::Point3F(),
3798 gfx::PointF(),
3799 gfx::Size(100, 100),
3800 true,
3801 false); // parent transform style is flat.
3802 SetLayerPropertiesForTesting(front_facing_child.get(),
3803 identity_matrix,
3804 gfx::Point3F(),
3805 gfx::PointF(),
3806 gfx::Size(100, 100),
3807 true,
3808 false);
3809 SetLayerPropertiesForTesting(back_facing_child.get(),
3810 backface_matrix,
3811 gfx::Point3F(),
3812 gfx::PointF(),
3813 gfx::Size(100, 100),
3814 true,
3815 false);
3816 // surface transform style is preserve-3d.
3817 SetLayerPropertiesForTesting(front_facing_surface.get(),
3818 identity_matrix,
3819 gfx::Point3F(),
3820 gfx::PointF(),
3821 gfx::Size(100, 100),
3822 false,
3823 true);
3824 // surface transform style is preserve-3d.
3825 SetLayerPropertiesForTesting(back_facing_surface.get(),
3826 backface_matrix,
3827 gfx::Point3F(),
3828 gfx::PointF(),
3829 gfx::Size(100, 100),
3830 false,
3831 true);
3832 SetLayerPropertiesForTesting(front_facing_child_of_front_facing_surface.get(),
3833 identity_matrix,
3834 gfx::Point3F(),
3835 gfx::PointF(),
3836 gfx::Size(100, 100),
3837 true,
3838 true);
3839 SetLayerPropertiesForTesting(back_facing_child_of_front_facing_surface.get(),
3840 backface_matrix,
3841 gfx::Point3F(),
3842 gfx::PointF(),
3843 gfx::Size(100, 100),
3844 true,
3845 true);
3846 SetLayerPropertiesForTesting(front_facing_child_of_back_facing_surface.get(),
3847 identity_matrix,
3848 gfx::Point3F(),
3849 gfx::PointF(),
3850 gfx::Size(100, 100),
3851 true,
3852 true);
3853 SetLayerPropertiesForTesting(back_facing_child_of_back_facing_surface.get(),
3854 backface_matrix,
3855 gfx::Point3F(),
3856 gfx::PointF(),
3857 gfx::Size(100, 100),
3858 true,
3859 true);
3860
3861 RenderSurfaceLayerList render_surface_layer_list;
3862 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
3863 parent.get(), parent->bounds(), &render_surface_layer_list);
3864 inputs.can_adjust_raster_scales = true;
3865 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
3866
3867 // Verify which render surfaces were created and used.
3868 EXPECT_FALSE(front_facing_child->render_surface());
3869 EXPECT_FALSE(back_facing_child->render_surface());
3870 EXPECT_TRUE(front_facing_surface->render_surface());
3871 EXPECT_NE(back_facing_surface->render_target(), back_facing_surface);
3872 // We expect that a render_surface was created but not used.
3873 EXPECT_TRUE(back_facing_surface->render_surface());
3874 EXPECT_FALSE(front_facing_child_of_front_facing_surface->render_surface());
3875 EXPECT_FALSE(back_facing_child_of_front_facing_surface->render_surface());
3876 EXPECT_FALSE(front_facing_child_of_back_facing_surface->render_surface());
3877 EXPECT_FALSE(back_facing_child_of_back_facing_surface->render_surface());
3878
3879 // Verify the render_surface_layer_list. The back-facing surface should be
3880 // culled.
3881 ASSERT_EQ(2u, render_surface_layer_list.size());
3882 EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
3883 EXPECT_EQ(front_facing_surface->id(), render_surface_layer_list.at(1)->id());
3884
3885 // Verify root surface's layer list.
3886 ASSERT_EQ(
3887 2u,
3888 render_surface_layer_list.at(0)->render_surface()->layer_list().size());
3889 EXPECT_EQ(front_facing_child->id(),
3890 render_surface_layer_list.at(0)
3891 ->render_surface()->layer_list().at(0)->id());
3892 EXPECT_EQ(front_facing_surface->id(),
3893 render_surface_layer_list.at(0)
3894 ->render_surface()->layer_list().at(1)->id());
3895
3896 // Verify front_facing_surface's layer list.
3897 ASSERT_EQ(
3898 2u,
3899 render_surface_layer_list.at(1)->render_surface()->layer_list().size());
3900 EXPECT_EQ(front_facing_surface->id(),
3901 render_surface_layer_list.at(1)
3902 ->render_surface()->layer_list().at(0)->id());
3903 EXPECT_EQ(front_facing_child_of_front_facing_surface->id(),
3904 render_surface_layer_list.at(1)
3905 ->render_surface()->layer_list().at(1)->id());
3906 }
3907
3908 TEST_F(LayerTreeHostCommonTest, BackFaceCullingWithAnimatingTransforms) {
3909 // Verify that layers are appropriately culled when their back face is showing
3910 // and they are not double sided, while animations are going on.
3911 //
3912 // Layers that are animating do not get culled on the main thread, as their
3913 // transforms should be treated as "unknown" so we can not be sure that their
3914 // back face is really showing.
3915 const gfx::Transform identity_matrix;
3916 scoped_refptr<Layer> parent = Layer::Create();
3917 scoped_refptr<LayerWithForcedDrawsContent> child =
3918 make_scoped_refptr(new LayerWithForcedDrawsContent());
3919 scoped_refptr<LayerWithForcedDrawsContent> animating_surface =
3920 make_scoped_refptr(new LayerWithForcedDrawsContent());
3921 scoped_refptr<LayerWithForcedDrawsContent> child_of_animating_surface =
3922 make_scoped_refptr(new LayerWithForcedDrawsContent());
3923 scoped_refptr<LayerWithForcedDrawsContent> animating_child =
3924 make_scoped_refptr(new LayerWithForcedDrawsContent());
3925 scoped_refptr<LayerWithForcedDrawsContent> child2 =
3926 make_scoped_refptr(new LayerWithForcedDrawsContent());
3927
3928 parent->AddChild(child);
3929 parent->AddChild(animating_surface);
3930 animating_surface->AddChild(child_of_animating_surface);
3931 parent->AddChild(animating_child);
3932 parent->AddChild(child2);
3933
3934 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
3935 host->SetRootLayer(parent);
3936
3937 // Nothing is double-sided
3938 child->SetDoubleSided(false);
3939 child2->SetDoubleSided(false);
3940 animating_surface->SetDoubleSided(false);
3941 child_of_animating_surface->SetDoubleSided(false);
3942 animating_child->SetDoubleSided(false);
3943
3944 gfx::Transform backface_matrix;
3945 backface_matrix.Translate(50.0, 50.0);
3946 backface_matrix.RotateAboutYAxis(180.0);
3947 backface_matrix.Translate(-50.0, -50.0);
3948
3949 // Make our render surface.
3950 animating_surface->SetForceRenderSurface(true);
3951
3952 // Animate the transform on the render surface.
3953 AddAnimatedTransformToController(
3954 animating_surface->layer_animation_controller(), 10.0, 30, 0);
3955 // This is just an animating layer, not a surface.
3956 AddAnimatedTransformToController(
3957 animating_child->layer_animation_controller(), 10.0, 30, 0);
3958
3959 SetLayerPropertiesForTesting(parent.get(),
3960 identity_matrix,
3961 gfx::Point3F(),
3962 gfx::PointF(),
3963 gfx::Size(100, 100),
3964 true,
3965 false);
3966 SetLayerPropertiesForTesting(child.get(),
3967 backface_matrix,
3968 gfx::Point3F(),
3969 gfx::PointF(),
3970 gfx::Size(100, 100),
3971 true,
3972 false);
3973 SetLayerPropertiesForTesting(animating_surface.get(),
3974 backface_matrix,
3975 gfx::Point3F(),
3976 gfx::PointF(),
3977 gfx::Size(100, 100),
3978 true,
3979 false);
3980 SetLayerPropertiesForTesting(child_of_animating_surface.get(),
3981 backface_matrix,
3982 gfx::Point3F(),
3983 gfx::PointF(),
3984 gfx::Size(100, 100),
3985 true,
3986 false);
3987 SetLayerPropertiesForTesting(animating_child.get(),
3988 backface_matrix,
3989 gfx::Point3F(),
3990 gfx::PointF(),
3991 gfx::Size(100, 100),
3992 true,
3993 false);
3994 SetLayerPropertiesForTesting(child2.get(),
3995 identity_matrix,
3996 gfx::Point3F(),
3997 gfx::PointF(),
3998 gfx::Size(100, 100),
3999 true,
4000 false);
4001
4002 RenderSurfaceLayerList render_surface_layer_list;
4003 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
4004 parent.get(), parent->bounds(), &render_surface_layer_list);
4005 inputs.can_adjust_raster_scales = true;
4006 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
4007
4008 EXPECT_FALSE(child->render_surface());
4009 EXPECT_TRUE(animating_surface->render_surface());
4010 EXPECT_FALSE(child_of_animating_surface->render_surface());
4011 EXPECT_FALSE(animating_child->render_surface());
4012 EXPECT_FALSE(child2->render_surface());
4013
4014 // Verify that the animating_child and child_of_animating_surface were not
4015 // culled, but that child was.
4016 ASSERT_EQ(2u, render_surface_layer_list.size());
4017 EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
4018 EXPECT_EQ(animating_surface->id(), render_surface_layer_list.at(1)->id());
4019
4020 // The non-animating child be culled from the layer list for the parent render
4021 // surface.
4022 ASSERT_EQ(
4023 3u,
4024 render_surface_layer_list.at(0)->render_surface()->layer_list().size());
4025 EXPECT_EQ(animating_surface->id(),
4026 render_surface_layer_list.at(0)
4027 ->render_surface()->layer_list().at(0)->id());
4028 EXPECT_EQ(animating_child->id(),
4029 render_surface_layer_list.at(0)
4030 ->render_surface()->layer_list().at(1)->id());
4031 EXPECT_EQ(child2->id(),
4032 render_surface_layer_list.at(0)
4033 ->render_surface()->layer_list().at(2)->id());
4034
4035 ASSERT_EQ(
4036 2u,
4037 render_surface_layer_list.at(1)->render_surface()->layer_list().size());
4038 EXPECT_EQ(animating_surface->id(),
4039 render_surface_layer_list.at(1)
4040 ->render_surface()->layer_list().at(0)->id());
4041 EXPECT_EQ(child_of_animating_surface->id(),
4042 render_surface_layer_list.at(1)
4043 ->render_surface()->layer_list().at(1)->id());
4044
4045 EXPECT_FALSE(child2->visible_content_rect().IsEmpty());
4046
4047 // The animating layers should have a visible content rect that represents the
4048 // area of the front face that is within the viewport.
4049 EXPECT_EQ(animating_child->visible_content_rect(),
4050 gfx::Rect(animating_child->content_bounds()));
4051 EXPECT_EQ(animating_surface->visible_content_rect(),
4052 gfx::Rect(animating_surface->content_bounds()));
4053 // And layers in the subtree of the animating layer should have valid visible
4054 // content rects also.
4055 EXPECT_EQ(child_of_animating_surface->visible_content_rect(),
4056 gfx::Rect(child_of_animating_surface->content_bounds()));
4057 }
4058
4059 TEST_F(LayerTreeHostCommonTest,
4060 BackFaceCullingWithPreserves3dForFlatteningSurface) {
4061 // Verify the behavior of back-face culling for a render surface that is
4062 // created when it flattens its subtree, and its parent has preserves-3d.
4063
4064 const gfx::Transform identity_matrix;
4065 scoped_refptr<Layer> parent = Layer::Create();
4066 scoped_refptr<LayerWithForcedDrawsContent> front_facing_surface =
4067 make_scoped_refptr(new LayerWithForcedDrawsContent());
4068 scoped_refptr<LayerWithForcedDrawsContent> back_facing_surface =
4069 make_scoped_refptr(new LayerWithForcedDrawsContent());
4070 scoped_refptr<LayerWithForcedDrawsContent> child1 =
4071 make_scoped_refptr(new LayerWithForcedDrawsContent());
4072 scoped_refptr<LayerWithForcedDrawsContent> child2 =
4073 make_scoped_refptr(new LayerWithForcedDrawsContent());
4074
4075 parent->AddChild(front_facing_surface);
4076 parent->AddChild(back_facing_surface);
4077 front_facing_surface->AddChild(child1);
4078 back_facing_surface->AddChild(child2);
4079
4080 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
4081 host->SetRootLayer(parent);
4082
4083 // RenderSurfaces are not double-sided
4084 front_facing_surface->SetDoubleSided(false);
4085 back_facing_surface->SetDoubleSided(false);
4086
4087 gfx::Transform backface_matrix;
4088 backface_matrix.Translate(50.0, 50.0);
4089 backface_matrix.RotateAboutYAxis(180.0);
4090 backface_matrix.Translate(-50.0, -50.0);
4091
4092 SetLayerPropertiesForTesting(parent.get(),
4093 identity_matrix,
4094 gfx::Point3F(),
4095 gfx::PointF(),
4096 gfx::Size(100, 100),
4097 false,
4098 true); // parent transform style is preserve3d.
4099 SetLayerPropertiesForTesting(front_facing_surface.get(),
4100 identity_matrix,
4101 gfx::Point3F(),
4102 gfx::PointF(),
4103 gfx::Size(100, 100),
4104 true,
4105 true); // surface transform style is flat.
4106 SetLayerPropertiesForTesting(back_facing_surface.get(),
4107 backface_matrix,
4108 gfx::Point3F(),
4109 gfx::PointF(),
4110 gfx::Size(100, 100),
4111 true,
4112 true); // surface transform style is flat.
4113 SetLayerPropertiesForTesting(child1.get(),
4114 identity_matrix,
4115 gfx::Point3F(),
4116 gfx::PointF(),
4117 gfx::Size(100, 100),
4118 true,
4119 false);
4120 SetLayerPropertiesForTesting(child2.get(),
4121 identity_matrix,
4122 gfx::Point3F(),
4123 gfx::PointF(),
4124 gfx::Size(100, 100),
4125 true,
4126 false);
4127
4128 front_facing_surface->Set3dSortingContextId(1);
4129 back_facing_surface->Set3dSortingContextId(1);
4130
4131 RenderSurfaceLayerList render_surface_layer_list;
4132 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
4133 parent.get(), parent->bounds(), &render_surface_layer_list);
4134 inputs.can_adjust_raster_scales = true;
4135 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
4136
4137 // Verify which render surfaces were created and used.
4138 EXPECT_TRUE(front_facing_surface->render_surface());
4139
4140 // We expect the render surface to have been created, but remain unused.
4141 EXPECT_TRUE(back_facing_surface->render_surface());
4142 EXPECT_NE(back_facing_surface->render_target(),
4143 back_facing_surface); // because it should be culled
4144 EXPECT_FALSE(child1->render_surface());
4145 EXPECT_FALSE(child2->render_surface());
4146
4147 // Verify the render_surface_layer_list. The back-facing surface should be
4148 // culled.
4149 ASSERT_EQ(2u, render_surface_layer_list.size());
4150 EXPECT_EQ(parent->id(), render_surface_layer_list.at(0)->id());
4151 EXPECT_EQ(front_facing_surface->id(), render_surface_layer_list.at(1)->id());
4152
4153 // Verify root surface's layer list.
4154 ASSERT_EQ(
4155 1u,
4156 render_surface_layer_list.at(0)->render_surface()->layer_list().size());
4157 EXPECT_EQ(front_facing_surface->id(),
4158 render_surface_layer_list.at(0)
4159 ->render_surface()->layer_list().at(0)->id());
4160
4161 // Verify front_facing_surface's layer list.
4162 ASSERT_EQ(
4163 2u,
4164 render_surface_layer_list.at(1)->render_surface()->layer_list().size());
4165 EXPECT_EQ(front_facing_surface->id(),
4166 render_surface_layer_list.at(1)
4167 ->render_surface()->layer_list().at(0)->id());
4168 EXPECT_EQ(child1->id(),
4169 render_surface_layer_list.at(1)
4170 ->render_surface()->layer_list().at(1)->id());
4171 }
4172
4173 class NoScaleContentLayer : public ContentLayer {
4174 public:
4175 static scoped_refptr<NoScaleContentLayer> Create(ContentLayerClient* client) {
4176 return make_scoped_refptr(new NoScaleContentLayer(client));
4177 }
4178
4179 void CalculateContentsScale(float ideal_contents_scale,
4180 float* contents_scale_x,
4181 float* contents_scale_y,
4182 gfx::Size* content_bounds) override {
4183 // Skip over the ContentLayer to the base Layer class.
4184 Layer::CalculateContentsScale(ideal_contents_scale,
4185 contents_scale_x,
4186 contents_scale_y,
4187 content_bounds);
4188 }
4189
4190 protected:
4191 explicit NoScaleContentLayer(ContentLayerClient* client)
4192 : ContentLayer(client) {}
4193 ~NoScaleContentLayer() override {}
4194 };
4195
4196 scoped_refptr<NoScaleContentLayer> CreateNoScaleDrawableContentLayer(
4197 ContentLayerClient* delegate) {
4198 scoped_refptr<NoScaleContentLayer> to_return =
4199 NoScaleContentLayer::Create(delegate);
4200 to_return->SetIsDrawable(true);
4201 return to_return;
4202 }
4203
4204 TEST_F(LayerTreeHostCommonTest, LayerTransformsInHighDPI) {
4205 // Verify draw and screen space transforms of layers not in a surface.
4206 MockContentLayerClient delegate;
4207 gfx::Transform identity_matrix;
4208
4209 scoped_refptr<FakePictureLayer> parent =
4210 CreateDrawablePictureLayer(&delegate);
4211 SetLayerPropertiesForTesting(parent.get(),
4212 identity_matrix,
4213 gfx::Point3F(),
4214 gfx::PointF(),
4215 gfx::Size(100, 100),
4216 false,
4217 true);
4218
4219 scoped_refptr<FakePictureLayer> child = CreateDrawablePictureLayer(&delegate);
4220 SetLayerPropertiesForTesting(child.get(),
4221 identity_matrix,
4222 gfx::Point3F(),
4223 gfx::PointF(2.f, 2.f),
4224 gfx::Size(10, 10),
4225 false,
4226 true);
4227
4228 scoped_refptr<FakePictureLayer> child_empty =
4229 CreateDrawablePictureLayer(&delegate);
4230 SetLayerPropertiesForTesting(child_empty.get(),
4231 identity_matrix,
4232 gfx::Point3F(),
4233 gfx::PointF(2.f, 2.f),
4234 gfx::Size(),
4235 false,
4236 true);
4237
4238 parent->AddChild(child);
4239 parent->AddChild(child_empty);
4240
4241 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
4242 host->SetRootLayer(parent);
4243
4244 float device_scale_factor = 2.5f;
4245 float page_scale_factor = 1.f;
4246
4247 RenderSurfaceLayerList render_surface_layer_list;
4248 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
4249 parent.get(), parent->bounds(), &render_surface_layer_list);
4250 inputs.device_scale_factor = device_scale_factor;
4251 inputs.page_scale_factor = page_scale_factor;
4252 inputs.can_adjust_raster_scales = true;
4253 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
4254
4255 EXPECT_IDEAL_SCALE_EQ(device_scale_factor * page_scale_factor, parent);
4256 EXPECT_IDEAL_SCALE_EQ(device_scale_factor * page_scale_factor, child);
4257 EXPECT_IDEAL_SCALE_EQ(device_scale_factor * page_scale_factor, child_empty);
4258
4259 EXPECT_EQ(1u, render_surface_layer_list.size());
4260
4261 // Verify parent transforms
4262 gfx::Transform expected_parent_transform;
4263 expected_parent_transform.Scale(device_scale_factor * page_scale_factor,
4264 device_scale_factor * page_scale_factor);
4265 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
4266 parent->screen_space_transform());
4267 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
4268 parent->draw_transform());
4269
4270 // Verify results of transformed parent rects
4271 gfx::RectF parent_content_bounds(parent->content_bounds());
4272
4273 gfx::RectF parent_draw_rect =
4274 MathUtil::MapClippedRect(parent->draw_transform(), parent_content_bounds);
4275 gfx::RectF parent_screen_space_rect = MathUtil::MapClippedRect(
4276 parent->screen_space_transform(), parent_content_bounds);
4277
4278 gfx::RectF expected_parent_draw_rect(parent->bounds());
4279 expected_parent_draw_rect.Scale(device_scale_factor);
4280 EXPECT_FLOAT_RECT_EQ(expected_parent_draw_rect, parent_draw_rect);
4281 EXPECT_FLOAT_RECT_EQ(expected_parent_draw_rect, parent_screen_space_rect);
4282
4283 // Verify child and child_empty transforms. They should match.
4284 gfx::Transform expected_child_transform;
4285 expected_child_transform.Scale(device_scale_factor, device_scale_factor);
4286 expected_child_transform.Translate(child->position().x(),
4287 child->position().y());
4288 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
4289 child->draw_transform());
4290 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
4291 child->screen_space_transform());
4292 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
4293 child_empty->draw_transform());
4294 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
4295 child_empty->screen_space_transform());
4296
4297 // Verify results of transformed child and child_empty rects. They should
4298 // match.
4299 gfx::RectF child_content_bounds(child->content_bounds());
4300
4301 gfx::RectF child_draw_rect =
4302 MathUtil::MapClippedRect(child->draw_transform(), child_content_bounds);
4303 gfx::RectF child_screen_space_rect = MathUtil::MapClippedRect(
4304 child->screen_space_transform(), child_content_bounds);
4305
4306 gfx::RectF child_empty_draw_rect = MathUtil::MapClippedRect(
4307 child_empty->draw_transform(), child_content_bounds);
4308 gfx::RectF child_empty_screen_space_rect = MathUtil::MapClippedRect(
4309 child_empty->screen_space_transform(), child_content_bounds);
4310
4311 gfx::RectF expected_child_draw_rect(child->position(), child->bounds());
4312 expected_child_draw_rect.Scale(device_scale_factor);
4313 EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_draw_rect);
4314 EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_screen_space_rect);
4315 EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_empty_draw_rect);
4316 EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_empty_screen_space_rect);
4317 }
4318
4319 TEST_F(LayerTreeHostCommonTest, SurfaceLayerTransformsInHighDPI) {
4320 // Verify draw and screen space transforms of layers in a surface.
4321 MockContentLayerClient delegate;
4322 gfx::Transform identity_matrix;
4323
4324 gfx::Transform perspective_matrix;
4325 perspective_matrix.ApplyPerspectiveDepth(2.0);
4326
4327 gfx::Transform scale_small_matrix;
4328 scale_small_matrix.Scale(SK_MScalar1 / 10.f, SK_MScalar1 / 12.f);
4329
4330 scoped_refptr<Layer> root = Layer::Create();
4331
4332 scoped_refptr<FakePictureLayer> parent =
4333 CreateDrawablePictureLayer(&delegate);
4334 SetLayerPropertiesForTesting(parent.get(),
4335 identity_matrix,
4336 gfx::Point3F(),
4337 gfx::PointF(),
4338 gfx::Size(100, 100),
4339 false,
4340 true);
4341
4342 scoped_refptr<FakePictureLayer> perspective_surface =
4343 CreateDrawablePictureLayer(&delegate);
4344 SetLayerPropertiesForTesting(perspective_surface.get(),
4345 perspective_matrix * scale_small_matrix,
4346 gfx::Point3F(),
4347 gfx::PointF(2.f, 2.f),
4348 gfx::Size(10, 10),
4349 false,
4350 true);
4351
4352 scoped_refptr<FakePictureLayer> scale_surface =
4353 CreateDrawablePictureLayer(&delegate);
4354 SetLayerPropertiesForTesting(scale_surface.get(),
4355 scale_small_matrix,
4356 gfx::Point3F(),
4357 gfx::PointF(2.f, 2.f),
4358 gfx::Size(10, 10),
4359 false,
4360 true);
4361
4362 perspective_surface->SetForceRenderSurface(true);
4363 scale_surface->SetForceRenderSurface(true);
4364
4365 parent->AddChild(perspective_surface);
4366 parent->AddChild(scale_surface);
4367 root->AddChild(parent);
4368
4369 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
4370 host->SetRootLayer(root);
4371
4372 float device_scale_factor = 2.5f;
4373 float page_scale_factor = 3.f;
4374
4375 RenderSurfaceLayerList render_surface_layer_list;
4376 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
4377 root.get(), parent->bounds(), &render_surface_layer_list);
4378 inputs.device_scale_factor = device_scale_factor;
4379 inputs.page_scale_factor = page_scale_factor;
4380 inputs.page_scale_application_layer = root.get();
4381 inputs.can_adjust_raster_scales = true;
4382 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
4383
4384 EXPECT_IDEAL_SCALE_EQ(device_scale_factor * page_scale_factor, parent);
4385 EXPECT_IDEAL_SCALE_EQ(device_scale_factor * page_scale_factor,
4386 perspective_surface);
4387 // Ideal scale is the max 2d scale component of the combined transform up to
4388 // the nearest render target. Here this includes the layer transform as well
4389 // as the device and page scale factors.
4390 gfx::Transform transform = scale_small_matrix;
4391 transform.Scale(device_scale_factor * page_scale_factor,
4392 device_scale_factor * page_scale_factor);
4393 gfx::Vector2dF scales =
4394 MathUtil::ComputeTransform2dScaleComponents(transform, 0.f);
4395 float max_2d_scale = std::max(scales.x(), scales.y());
4396 EXPECT_IDEAL_SCALE_EQ(max_2d_scale, scale_surface);
4397
4398 // The ideal scale will draw 1:1 with its render target space along
4399 // the larger-scale axis.
4400 gfx::Vector2dF target_space_transform_scales =
4401 MathUtil::ComputeTransform2dScaleComponents(
4402 scale_surface->draw_properties().target_space_transform, 0.f);
4403 EXPECT_FLOAT_EQ(max_2d_scale,
4404 std::max(target_space_transform_scales.x(),
4405 target_space_transform_scales.y()));
4406
4407 EXPECT_EQ(3u, render_surface_layer_list.size());
4408
4409 gfx::Transform expected_parent_draw_transform;
4410 expected_parent_draw_transform.Scale(device_scale_factor * page_scale_factor,
4411 device_scale_factor * page_scale_factor);
4412 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_draw_transform,
4413 parent->draw_transform());
4414
4415 // The scale for the perspective surface is not known, so it is rendered 1:1
4416 // with the screen, and then scaled during drawing.
4417 gfx::Transform expected_perspective_surface_draw_transform;
4418 expected_perspective_surface_draw_transform.Translate(
4419 device_scale_factor * page_scale_factor *
4420 perspective_surface->position().x(),
4421 device_scale_factor * page_scale_factor *
4422 perspective_surface->position().y());
4423 expected_perspective_surface_draw_transform.PreconcatTransform(
4424 perspective_matrix);
4425 expected_perspective_surface_draw_transform.PreconcatTransform(
4426 scale_small_matrix);
4427 gfx::Transform expected_perspective_surface_layer_draw_transform;
4428 expected_perspective_surface_layer_draw_transform.Scale(
4429 device_scale_factor * page_scale_factor,
4430 device_scale_factor * page_scale_factor);
4431 EXPECT_TRANSFORMATION_MATRIX_EQ(
4432 expected_perspective_surface_draw_transform,
4433 perspective_surface->render_surface()->draw_transform());
4434 EXPECT_TRANSFORMATION_MATRIX_EQ(
4435 expected_perspective_surface_layer_draw_transform,
4436 perspective_surface->draw_transform());
4437 }
4438
4439 // TODO(sohanjg): Remove this test when ContentLayer is removed.
4440 TEST_F(LayerTreeHostCommonTest,
4441 LayerTransformsInHighDPIAccurateScaleZeroChildPosition) {
4442 // Verify draw and screen space transforms of layers not in a surface.
4443 MockContentLayerClient delegate;
4444 gfx::Transform identity_matrix;
4445
4446 scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
4447 SetLayerPropertiesForTesting(parent.get(),
4448 identity_matrix,
4449 gfx::Point3F(),
4450 gfx::PointF(),
4451 gfx::Size(133, 133),
4452 false,
4453 true);
4454
4455 scoped_refptr<ContentLayer> child = CreateDrawableContentLayer(&delegate);
4456 SetLayerPropertiesForTesting(child.get(),
4457 identity_matrix,
4458 gfx::Point3F(),
4459 gfx::PointF(),
4460 gfx::Size(13, 13),
4461 false,
4462 true);
4463
4464 scoped_refptr<NoScaleContentLayer> child_no_scale =
4465 CreateNoScaleDrawableContentLayer(&delegate);
4466 SetLayerPropertiesForTesting(child_no_scale.get(),
4467 identity_matrix,
4468 gfx::Point3F(),
4469 gfx::PointF(),
4470 gfx::Size(13, 13),
4471 false,
4472 true);
4473
4474 parent->AddChild(child);
4475 parent->AddChild(child_no_scale);
4476
4477 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
4478 host->SetRootLayer(parent);
4479
4480 float device_scale_factor = 1.7f;
4481 float page_scale_factor = 1.f;
4482
4483 RenderSurfaceLayerList render_surface_layer_list;
4484 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
4485 parent.get(), parent->bounds(), &render_surface_layer_list);
4486 inputs.device_scale_factor = device_scale_factor;
4487 inputs.page_scale_factor = page_scale_factor;
4488 inputs.page_scale_application_layer = parent.get();
4489 inputs.can_adjust_raster_scales = true;
4490 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
4491
4492 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor, parent);
4493 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor, child);
4494 EXPECT_CONTENTS_SCALE_EQ(1, child_no_scale);
4495
4496 EXPECT_EQ(1u, render_surface_layer_list.size());
4497
4498 // Verify parent transforms
4499 gfx::Transform expected_parent_transform;
4500 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
4501 parent->screen_space_transform());
4502 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
4503 parent->draw_transform());
4504
4505 // Verify results of transformed parent rects
4506 gfx::RectF parent_content_bounds(parent->content_bounds());
4507
4508 gfx::RectF parent_draw_rect =
4509 MathUtil::MapClippedRect(parent->draw_transform(), parent_content_bounds);
4510 gfx::RectF parent_screen_space_rect = MathUtil::MapClippedRect(
4511 parent->screen_space_transform(), parent_content_bounds);
4512
4513 gfx::RectF expected_parent_draw_rect(parent->bounds());
4514 expected_parent_draw_rect.Scale(device_scale_factor);
4515 expected_parent_draw_rect.set_width(ceil(expected_parent_draw_rect.width()));
4516 expected_parent_draw_rect.set_height(
4517 ceil(expected_parent_draw_rect.height()));
4518 EXPECT_FLOAT_RECT_EQ(expected_parent_draw_rect, parent_draw_rect);
4519 EXPECT_FLOAT_RECT_EQ(expected_parent_draw_rect, parent_screen_space_rect);
4520
4521 // Verify child transforms
4522 gfx::Transform expected_child_transform;
4523 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
4524 child->draw_transform());
4525 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
4526 child->screen_space_transform());
4527
4528 // Verify results of transformed child rects
4529 gfx::RectF child_content_bounds(child->content_bounds());
4530
4531 gfx::RectF child_draw_rect =
4532 MathUtil::MapClippedRect(child->draw_transform(), child_content_bounds);
4533 gfx::RectF child_screen_space_rect = MathUtil::MapClippedRect(
4534 child->screen_space_transform(), child_content_bounds);
4535
4536 gfx::RectF expected_child_draw_rect(child->bounds());
4537 expected_child_draw_rect.Scale(device_scale_factor);
4538 expected_child_draw_rect.set_width(ceil(expected_child_draw_rect.width()));
4539 expected_child_draw_rect.set_height(ceil(expected_child_draw_rect.height()));
4540 EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_draw_rect);
4541 EXPECT_FLOAT_RECT_EQ(expected_child_draw_rect, child_screen_space_rect);
4542
4543 // Verify child_no_scale transforms
4544 gfx::Transform expected_child_no_scale_transform = child->draw_transform();
4545 // All transforms operate on content rects. The child's content rect
4546 // incorporates device scale, but the child_no_scale does not; add it here.
4547 expected_child_no_scale_transform.Scale(device_scale_factor,
4548 device_scale_factor);
4549 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_no_scale_transform,
4550 child_no_scale->draw_transform());
4551 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_no_scale_transform,
4552 child_no_scale->screen_space_transform());
4553 }
4554
4555 // TODO(sohanjg): Remove this test when ContentLayer is removed.
4556 TEST_F(LayerTreeHostCommonTest, ContentsScale) {
4557 MockContentLayerClient delegate;
4558 gfx::Transform identity_matrix;
4559
4560 gfx::Transform parent_scale_matrix;
4561 SkMScalar initial_parent_scale = 1.75;
4562 parent_scale_matrix.Scale(initial_parent_scale, initial_parent_scale);
4563
4564 gfx::Transform child_scale_matrix;
4565 SkMScalar initial_child_scale = 1.25;
4566 child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
4567
4568 scoped_refptr<Layer> root = Layer::Create();
4569 root->SetBounds(gfx::Size(100, 100));
4570
4571 scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
4572 SetLayerPropertiesForTesting(parent.get(),
4573 parent_scale_matrix,
4574 gfx::Point3F(),
4575 gfx::PointF(),
4576 gfx::Size(100, 100),
4577 false,
4578 true);
4579
4580 scoped_refptr<ContentLayer> child_scale =
4581 CreateDrawableContentLayer(&delegate);
4582 SetLayerPropertiesForTesting(child_scale.get(),
4583 child_scale_matrix,
4584 gfx::Point3F(),
4585 gfx::PointF(2.f, 2.f),
4586 gfx::Size(10, 10),
4587 false,
4588 true);
4589
4590 scoped_refptr<ContentLayer> child_empty =
4591 CreateDrawableContentLayer(&delegate);
4592 SetLayerPropertiesForTesting(child_empty.get(),
4593 child_scale_matrix,
4594 gfx::Point3F(),
4595 gfx::PointF(2.f, 2.f),
4596 gfx::Size(),
4597 false,
4598 true);
4599
4600 scoped_refptr<NoScaleContentLayer> child_no_scale =
4601 CreateNoScaleDrawableContentLayer(&delegate);
4602 SetLayerPropertiesForTesting(child_no_scale.get(),
4603 child_scale_matrix,
4604 gfx::Point3F(),
4605 gfx::PointF(12.f, 12.f),
4606 gfx::Size(10, 10),
4607 false,
4608 true);
4609
4610 root->AddChild(parent);
4611
4612 parent->AddChild(child_scale);
4613 parent->AddChild(child_empty);
4614 parent->AddChild(child_no_scale);
4615
4616 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
4617 host->SetRootLayer(root);
4618
4619 float device_scale_factor = 2.5f;
4620 float page_scale_factor = 1.f;
4621
4622 {
4623 RenderSurfaceLayerList render_surface_layer_list;
4624 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
4625 root.get(), root->bounds(), &render_surface_layer_list);
4626 inputs.device_scale_factor = device_scale_factor;
4627 inputs.page_scale_factor = page_scale_factor;
4628 inputs.page_scale_application_layer = root.get();
4629 inputs.can_adjust_raster_scales = true;
4630 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
4631
4632 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
4633 initial_parent_scale, parent);
4634 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
4635 initial_parent_scale * initial_child_scale,
4636 child_scale);
4637 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
4638 initial_parent_scale * initial_child_scale,
4639 child_empty);
4640 EXPECT_CONTENTS_SCALE_EQ(1, child_no_scale);
4641
4642 // The parent is scaled up and shouldn't need to scale during draw. The
4643 // child that can scale its contents should also not need to scale during
4644 // draw. This shouldn't change if the child has empty bounds. The other
4645 // children should.
4646 EXPECT_FLOAT_EQ(1.0, parent->draw_transform().matrix().get(0, 0));
4647 EXPECT_FLOAT_EQ(1.0, parent->draw_transform().matrix().get(1, 1));
4648 EXPECT_FLOAT_EQ(1.0, child_scale->draw_transform().matrix().get(0, 0));
4649 EXPECT_FLOAT_EQ(1.0, child_scale->draw_transform().matrix().get(1, 1));
4650 EXPECT_FLOAT_EQ(1.0, child_empty->draw_transform().matrix().get(0, 0));
4651 EXPECT_FLOAT_EQ(1.0, child_empty->draw_transform().matrix().get(1, 1));
4652 EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor *
4653 initial_parent_scale * initial_child_scale,
4654 child_no_scale->draw_transform().matrix().get(0, 0));
4655 EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor *
4656 initial_parent_scale * initial_child_scale,
4657 child_no_scale->draw_transform().matrix().get(1, 1));
4658 }
4659
4660 // If the device_scale_factor or page_scale_factor changes, then it should be
4661 // updated using the initial transform as the raster scale.
4662 device_scale_factor = 2.25f;
4663 page_scale_factor = 1.25f;
4664
4665 {
4666 RenderSurfaceLayerList render_surface_layer_list;
4667 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
4668 root.get(), root->bounds(), &render_surface_layer_list);
4669 inputs.device_scale_factor = device_scale_factor;
4670 inputs.page_scale_factor = page_scale_factor;
4671 inputs.page_scale_application_layer = root.get();
4672 inputs.can_adjust_raster_scales = true;
4673 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
4674
4675 EXPECT_CONTENTS_SCALE_EQ(
4676 device_scale_factor * page_scale_factor * initial_parent_scale, parent);
4677 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
4678 initial_parent_scale * initial_child_scale,
4679 child_scale);
4680 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
4681 initial_parent_scale * initial_child_scale,
4682 child_empty);
4683 EXPECT_CONTENTS_SCALE_EQ(1, child_no_scale);
4684 }
4685
4686 // If the transform changes, we expect the raster scale to be reset to 1.0.
4687 SkMScalar second_child_scale = 1.75;
4688 child_scale_matrix.Scale(second_child_scale / initial_child_scale,
4689 second_child_scale / initial_child_scale);
4690 child_scale->SetTransform(child_scale_matrix);
4691 child_empty->SetTransform(child_scale_matrix);
4692
4693 {
4694 RenderSurfaceLayerList render_surface_layer_list;
4695 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
4696 root.get(), root->bounds(), &render_surface_layer_list);
4697 inputs.device_scale_factor = device_scale_factor;
4698 inputs.page_scale_factor = page_scale_factor;
4699 inputs.page_scale_application_layer = root.get();
4700 inputs.can_adjust_raster_scales = true;
4701 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
4702
4703 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
4704 initial_parent_scale,
4705 parent);
4706 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
4707 child_scale);
4708 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
4709 child_empty);
4710 EXPECT_CONTENTS_SCALE_EQ(1, child_no_scale);
4711 }
4712
4713 // If the device_scale_factor or page_scale_factor changes, then it should be
4714 // updated, but still using 1.0 as the raster scale.
4715 device_scale_factor = 2.75f;
4716 page_scale_factor = 1.75f;
4717
4718 {
4719 RenderSurfaceLayerList render_surface_layer_list;
4720 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
4721 root.get(), root->bounds(), &render_surface_layer_list);
4722 inputs.device_scale_factor = device_scale_factor;
4723 inputs.page_scale_factor = page_scale_factor;
4724 inputs.page_scale_application_layer = root.get();
4725 inputs.can_adjust_raster_scales = true;
4726 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
4727
4728 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
4729 initial_parent_scale,
4730 parent);
4731 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
4732 child_scale);
4733 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
4734 child_empty);
4735 EXPECT_CONTENTS_SCALE_EQ(1, child_no_scale);
4736 }
4737 }
4738
4739 // TODO(sohanjg): Remove this test when ContentLayer is removed.
4740 TEST_F(LayerTreeHostCommonTest,
4741 ContentsScale_LayerTransformsDontAffectContentsScale) {
4742 MockContentLayerClient delegate;
4743 gfx::Transform identity_matrix;
4744
4745 gfx::Transform parent_scale_matrix;
4746 SkMScalar initial_parent_scale = 1.75;
4747 parent_scale_matrix.Scale(initial_parent_scale, initial_parent_scale);
4748
4749 gfx::Transform child_scale_matrix;
4750 SkMScalar initial_child_scale = 1.25;
4751 child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
4752
4753 scoped_refptr<Layer> root = Layer::Create();
4754 root->SetBounds(gfx::Size(100, 100));
4755
4756 scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
4757 SetLayerPropertiesForTesting(parent.get(),
4758 parent_scale_matrix,
4759 gfx::Point3F(),
4760 gfx::PointF(),
4761 gfx::Size(100, 100),
4762 false,
4763 true);
4764
4765 scoped_refptr<ContentLayer> child_scale =
4766 CreateDrawableContentLayer(&delegate);
4767 SetLayerPropertiesForTesting(child_scale.get(),
4768 child_scale_matrix,
4769 gfx::Point3F(),
4770 gfx::PointF(2.f, 2.f),
4771 gfx::Size(10, 10),
4772 false,
4773 true);
4774
4775 scoped_refptr<ContentLayer> child_empty =
4776 CreateDrawableContentLayer(&delegate);
4777 SetLayerPropertiesForTesting(child_empty.get(),
4778 child_scale_matrix,
4779 gfx::Point3F(),
4780 gfx::PointF(2.f, 2.f),
4781 gfx::Size(),
4782 false,
4783 true);
4784
4785 scoped_refptr<NoScaleContentLayer> child_no_scale =
4786 CreateNoScaleDrawableContentLayer(&delegate);
4787 SetLayerPropertiesForTesting(child_no_scale.get(),
4788 child_scale_matrix,
4789 gfx::Point3F(),
4790 gfx::PointF(12.f, 12.f),
4791 gfx::Size(10, 10),
4792 false,
4793 true);
4794
4795 root->AddChild(parent);
4796
4797 parent->AddChild(child_scale);
4798 parent->AddChild(child_empty);
4799 parent->AddChild(child_no_scale);
4800
4801 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
4802 host->SetRootLayer(root);
4803
4804 RenderSurfaceLayerList render_surface_layer_list;
4805
4806 float device_scale_factor = 2.5f;
4807 float page_scale_factor = 1.f;
4808
4809 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
4810 root.get(), root->bounds(), &render_surface_layer_list);
4811 inputs.device_scale_factor = device_scale_factor;
4812 inputs.page_scale_factor = page_scale_factor;
4813 inputs.page_scale_application_layer = root.get(),
4814 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
4815
4816 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor, parent);
4817 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
4818 child_scale);
4819 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
4820 child_empty);
4821 EXPECT_CONTENTS_SCALE_EQ(1, child_no_scale);
4822
4823 // Since the transform scale does not affect contents scale, it should affect
4824 // the draw transform instead.
4825 EXPECT_FLOAT_EQ(initial_parent_scale,
4826 parent->draw_transform().matrix().get(0, 0));
4827 EXPECT_FLOAT_EQ(initial_parent_scale,
4828 parent->draw_transform().matrix().get(1, 1));
4829 EXPECT_FLOAT_EQ(initial_parent_scale * initial_child_scale,
4830 child_scale->draw_transform().matrix().get(0, 0));
4831 EXPECT_FLOAT_EQ(initial_parent_scale * initial_child_scale,
4832 child_scale->draw_transform().matrix().get(1, 1));
4833 EXPECT_FLOAT_EQ(initial_parent_scale * initial_child_scale,
4834 child_empty->draw_transform().matrix().get(0, 0));
4835 EXPECT_FLOAT_EQ(initial_parent_scale * initial_child_scale,
4836 child_empty->draw_transform().matrix().get(1, 1));
4837 EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor *
4838 initial_parent_scale * initial_child_scale,
4839 child_no_scale->draw_transform().matrix().get(0, 0));
4840 EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor *
4841 initial_parent_scale * initial_child_scale,
4842 child_no_scale->draw_transform().matrix().get(1, 1));
4843 }
4844
4845 TEST_F(LayerTreeHostCommonTest, SmallIdealScale) {
4846 MockContentLayerClient delegate;
4847 gfx::Transform identity_matrix;
4848
4849 gfx::Transform parent_scale_matrix;
4850 SkMScalar initial_parent_scale = 1.75;
4851 parent_scale_matrix.Scale(initial_parent_scale, initial_parent_scale);
4852
4853 gfx::Transform child_scale_matrix;
4854 SkMScalar initial_child_scale = 0.25;
4855 child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
4856
4857 scoped_refptr<Layer> root = Layer::Create();
4858 root->SetBounds(gfx::Size(100, 100));
4859
4860 scoped_refptr<FakePictureLayer> parent =
4861 CreateDrawablePictureLayer(&delegate);
4862 SetLayerPropertiesForTesting(parent.get(),
4863 parent_scale_matrix,
4864 gfx::Point3F(),
4865 gfx::PointF(),
4866 gfx::Size(100, 100),
4867 false,
4868 true);
4869
4870 scoped_refptr<FakePictureLayer> child_scale =
4871 CreateDrawablePictureLayer(&delegate);
4872 SetLayerPropertiesForTesting(child_scale.get(),
4873 child_scale_matrix,
4874 gfx::Point3F(),
4875 gfx::PointF(2.f, 2.f),
4876 gfx::Size(10, 10),
4877 false,
4878 true);
4879
4880 root->AddChild(parent);
4881
4882 parent->AddChild(child_scale);
4883
4884 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
4885 host->SetRootLayer(root);
4886
4887 float device_scale_factor = 2.5f;
4888 float page_scale_factor = 0.01f;
4889
4890 {
4891 RenderSurfaceLayerList render_surface_layer_list;
4892 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
4893 root.get(), root->bounds(), &render_surface_layer_list);
4894 inputs.device_scale_factor = device_scale_factor;
4895 inputs.page_scale_factor = page_scale_factor;
4896 inputs.page_scale_application_layer = root.get();
4897 inputs.can_adjust_raster_scales = true;
4898 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
4899
4900 // The ideal scale is able to go below 1.
4901 float expected_ideal_scale =
4902 device_scale_factor * page_scale_factor * initial_parent_scale;
4903 EXPECT_LT(expected_ideal_scale, 1.f);
4904 EXPECT_IDEAL_SCALE_EQ(expected_ideal_scale, parent);
4905
4906 expected_ideal_scale = device_scale_factor * page_scale_factor *
4907 initial_parent_scale * initial_child_scale;
4908 EXPECT_LT(expected_ideal_scale, 1.f);
4909 EXPECT_IDEAL_SCALE_EQ(expected_ideal_scale, child_scale);
4910 }
4911 }
4912
4913 TEST_F(LayerTreeHostCommonTest, ContentsScaleForSurfaces) {
4914 MockContentLayerClient delegate;
4915 gfx::Transform identity_matrix;
4916
4917 gfx::Transform parent_scale_matrix;
4918 SkMScalar initial_parent_scale = 2.0;
4919 parent_scale_matrix.Scale(initial_parent_scale, initial_parent_scale);
4920
4921 gfx::Transform child_scale_matrix;
4922 SkMScalar initial_child_scale = 3.0;
4923 child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
4924
4925 scoped_refptr<Layer> root = Layer::Create();
4926 root->SetBounds(gfx::Size(100, 100));
4927
4928 scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
4929 SetLayerPropertiesForTesting(parent.get(),
4930 parent_scale_matrix,
4931 gfx::Point3F(),
4932 gfx::PointF(),
4933 gfx::Size(100, 100),
4934 false,
4935 true);
4936
4937 scoped_refptr<ContentLayer> surface_scale =
4938 CreateDrawableContentLayer(&delegate);
4939 SetLayerPropertiesForTesting(surface_scale.get(),
4940 child_scale_matrix,
4941 gfx::Point3F(),
4942 gfx::PointF(2.f, 2.f),
4943 gfx::Size(10, 10),
4944 false,
4945 true);
4946
4947 scoped_refptr<ContentLayer> surface_scale_child_scale =
4948 CreateDrawableContentLayer(&delegate);
4949 SetLayerPropertiesForTesting(surface_scale_child_scale.get(),
4950 child_scale_matrix,
4951 gfx::Point3F(),
4952 gfx::PointF(),
4953 gfx::Size(10, 10),
4954 false,
4955 true);
4956
4957 scoped_refptr<NoScaleContentLayer> surface_scale_child_no_scale =
4958 CreateNoScaleDrawableContentLayer(&delegate);
4959 SetLayerPropertiesForTesting(surface_scale_child_no_scale.get(),
4960 child_scale_matrix,
4961 gfx::Point3F(),
4962 gfx::PointF(),
4963 gfx::Size(10, 10),
4964 false,
4965 true);
4966
4967 scoped_refptr<NoScaleContentLayer> surface_no_scale =
4968 CreateNoScaleDrawableContentLayer(&delegate);
4969 SetLayerPropertiesForTesting(surface_no_scale.get(),
4970 child_scale_matrix,
4971 gfx::Point3F(),
4972 gfx::PointF(12.f, 12.f),
4973 gfx::Size(10, 10),
4974 false,
4975 true);
4976
4977 scoped_refptr<ContentLayer> surface_no_scale_child_scale =
4978 CreateDrawableContentLayer(&delegate);
4979 SetLayerPropertiesForTesting(surface_no_scale_child_scale.get(),
4980 child_scale_matrix,
4981 gfx::Point3F(),
4982 gfx::PointF(),
4983 gfx::Size(10, 10),
4984 false,
4985 true);
4986
4987 scoped_refptr<NoScaleContentLayer> surface_no_scale_child_no_scale =
4988 CreateNoScaleDrawableContentLayer(&delegate);
4989 SetLayerPropertiesForTesting(surface_no_scale_child_no_scale.get(),
4990 child_scale_matrix,
4991 gfx::Point3F(),
4992 gfx::PointF(),
4993 gfx::Size(10, 10),
4994 false,
4995 true);
4996
4997 root->AddChild(parent);
4998
4999 parent->AddChild(surface_scale);
5000 parent->AddChild(surface_no_scale);
5001
5002 surface_scale->SetForceRenderSurface(true);
5003 surface_scale->AddChild(surface_scale_child_scale);
5004 surface_scale->AddChild(surface_scale_child_no_scale);
5005
5006 surface_no_scale->SetForceRenderSurface(true);
5007 surface_no_scale->AddChild(surface_no_scale_child_scale);
5008 surface_no_scale->AddChild(surface_no_scale_child_no_scale);
5009
5010 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
5011 host->SetRootLayer(root);
5012
5013 SkMScalar device_scale_factor = 5;
5014 SkMScalar page_scale_factor = 7;
5015
5016 RenderSurfaceLayerList render_surface_layer_list;
5017 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
5018 root.get(), root->bounds(), &render_surface_layer_list);
5019 inputs.device_scale_factor = device_scale_factor;
5020 inputs.page_scale_factor = page_scale_factor;
5021 inputs.page_scale_application_layer = root.get();
5022 inputs.can_adjust_raster_scales = true;
5023 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
5024
5025 EXPECT_CONTENTS_SCALE_EQ(
5026 device_scale_factor * page_scale_factor * initial_parent_scale, parent);
5027 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor *
5028 initial_parent_scale * initial_child_scale,
5029 surface_scale);
5030 EXPECT_CONTENTS_SCALE_EQ(1, surface_no_scale);
5031 EXPECT_CONTENTS_SCALE_EQ(
5032 device_scale_factor * page_scale_factor * initial_parent_scale *
5033 initial_child_scale * initial_child_scale,
5034 surface_scale_child_scale);
5035 EXPECT_CONTENTS_SCALE_EQ(1, surface_scale_child_no_scale);
5036 EXPECT_CONTENTS_SCALE_EQ(
5037 device_scale_factor * page_scale_factor * initial_parent_scale *
5038 initial_child_scale * initial_child_scale,
5039 surface_no_scale_child_scale);
5040 EXPECT_CONTENTS_SCALE_EQ(1, surface_no_scale_child_no_scale);
5041
5042 // The parent is scaled up and shouldn't need to scale during draw.
5043 EXPECT_FLOAT_EQ(1.0, parent->draw_transform().matrix().get(0, 0));
5044 EXPECT_FLOAT_EQ(1.0, parent->draw_transform().matrix().get(1, 1));
5045
5046 // RenderSurfaces should always be 1:1 with their target.
5047 EXPECT_FLOAT_EQ(
5048 1.0,
5049 surface_scale->render_surface()->draw_transform().matrix().get(0, 0));
5050 EXPECT_FLOAT_EQ(
5051 1.0,
5052 surface_scale->render_surface()->draw_transform().matrix().get(1, 1));
5053
5054 // The surface_scale can apply contents scale so the layer shouldn't need to
5055 // scale during draw.
5056 EXPECT_FLOAT_EQ(1.0, surface_scale->draw_transform().matrix().get(0, 0));
5057 EXPECT_FLOAT_EQ(1.0, surface_scale->draw_transform().matrix().get(1, 1));
5058
5059 // The surface_scale_child_scale can apply contents scale so it shouldn't need
5060 // to scale during draw.
5061 EXPECT_FLOAT_EQ(
5062 1.0, surface_scale_child_scale->draw_transform().matrix().get(0, 0));
5063 EXPECT_FLOAT_EQ(
5064 1.0, surface_scale_child_scale->draw_transform().matrix().get(1, 1));
5065
5066 // The surface_scale_child_no_scale can not apply contents scale, so it needs
5067 // to be scaled during draw.
5068 EXPECT_FLOAT_EQ(
5069 device_scale_factor * page_scale_factor * initial_parent_scale *
5070 initial_child_scale * initial_child_scale,
5071 surface_scale_child_no_scale->draw_transform().matrix().get(0, 0));
5072 EXPECT_FLOAT_EQ(
5073 device_scale_factor * page_scale_factor * initial_parent_scale *
5074 initial_child_scale * initial_child_scale,
5075 surface_scale_child_no_scale->draw_transform().matrix().get(1, 1));
5076
5077 // RenderSurfaces should always be 1:1 with their target.
5078 EXPECT_FLOAT_EQ(
5079 1.0,
5080 surface_no_scale->render_surface()->draw_transform().matrix().get(0, 0));
5081 EXPECT_FLOAT_EQ(
5082 1.0,
5083 surface_no_scale->render_surface()->draw_transform().matrix().get(1, 1));
5084
5085 // The surface_no_scale layer can not apply contents scale, so it needs to be
5086 // scaled during draw.
5087 EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor *
5088 initial_parent_scale * initial_child_scale,
5089 surface_no_scale->draw_transform().matrix().get(0, 0));
5090 EXPECT_FLOAT_EQ(device_scale_factor * page_scale_factor *
5091 initial_parent_scale * initial_child_scale,
5092 surface_no_scale->draw_transform().matrix().get(1, 1));
5093
5094 // The surface_scale_child_scale can apply contents scale so it shouldn't need
5095 // to scale during draw.
5096 EXPECT_FLOAT_EQ(
5097 1.0, surface_no_scale_child_scale->draw_transform().matrix().get(0, 0));
5098 EXPECT_FLOAT_EQ(
5099 1.0, surface_no_scale_child_scale->draw_transform().matrix().get(1, 1));
5100
5101 // The surface_scale_child_no_scale can not apply contents scale, so it needs
5102 // to be scaled during draw.
5103 EXPECT_FLOAT_EQ(
5104 device_scale_factor * page_scale_factor * initial_parent_scale *
5105 initial_child_scale * initial_child_scale,
5106 surface_no_scale_child_no_scale->draw_transform().matrix().get(0, 0));
5107 EXPECT_FLOAT_EQ(
5108 device_scale_factor * page_scale_factor * initial_parent_scale *
5109 initial_child_scale * initial_child_scale,
5110 surface_no_scale_child_no_scale->draw_transform().matrix().get(1, 1));
5111 }
5112
5113 // TODO(sohanjg): Remove this test when ContentLayer is removed.
5114 TEST_F(LayerTreeHostCommonTest,
5115 ContentsScaleForSurfaces_LayerTransformsDontAffectContentsScale) {
5116 MockContentLayerClient delegate;
5117 gfx::Transform identity_matrix;
5118
5119 gfx::Transform parent_scale_matrix;
5120 SkMScalar initial_parent_scale = 2.0;
5121 parent_scale_matrix.Scale(initial_parent_scale, initial_parent_scale);
5122
5123 gfx::Transform child_scale_matrix;
5124 SkMScalar initial_child_scale = 3.0;
5125 child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
5126
5127 scoped_refptr<Layer> root = Layer::Create();
5128 root->SetBounds(gfx::Size(100, 100));
5129
5130 scoped_refptr<ContentLayer> parent = CreateDrawableContentLayer(&delegate);
5131 SetLayerPropertiesForTesting(parent.get(),
5132 parent_scale_matrix,
5133 gfx::Point3F(),
5134 gfx::PointF(),
5135 gfx::Size(100, 100),
5136 false,
5137 true);
5138
5139 scoped_refptr<ContentLayer> surface_scale =
5140 CreateDrawableContentLayer(&delegate);
5141 SetLayerPropertiesForTesting(surface_scale.get(),
5142 child_scale_matrix,
5143 gfx::Point3F(),
5144 gfx::PointF(2.f, 2.f),
5145 gfx::Size(10, 10),
5146 false,
5147 true);
5148
5149 scoped_refptr<ContentLayer> surface_scale_child_scale =
5150 CreateDrawableContentLayer(&delegate);
5151 SetLayerPropertiesForTesting(surface_scale_child_scale.get(),
5152 child_scale_matrix,
5153 gfx::Point3F(),
5154 gfx::PointF(),
5155 gfx::Size(10, 10),
5156 false,
5157 true);
5158
5159 scoped_refptr<NoScaleContentLayer> surface_scale_child_no_scale =
5160 CreateNoScaleDrawableContentLayer(&delegate);
5161 SetLayerPropertiesForTesting(surface_scale_child_no_scale.get(),
5162 child_scale_matrix,
5163 gfx::Point3F(),
5164 gfx::PointF(),
5165 gfx::Size(10, 10),
5166 false,
5167 true);
5168
5169 scoped_refptr<NoScaleContentLayer> surface_no_scale =
5170 CreateNoScaleDrawableContentLayer(&delegate);
5171 SetLayerPropertiesForTesting(surface_no_scale.get(),
5172 child_scale_matrix,
5173 gfx::Point3F(),
5174 gfx::PointF(12.f, 12.f),
5175 gfx::Size(10, 10),
5176 false,
5177 true);
5178
5179 scoped_refptr<ContentLayer> surface_no_scale_child_scale =
5180 CreateDrawableContentLayer(&delegate);
5181 SetLayerPropertiesForTesting(surface_no_scale_child_scale.get(),
5182 child_scale_matrix,
5183 gfx::Point3F(),
5184 gfx::PointF(),
5185 gfx::Size(10, 10),
5186 false,
5187 true);
5188
5189 scoped_refptr<NoScaleContentLayer> surface_no_scale_child_no_scale =
5190 CreateNoScaleDrawableContentLayer(&delegate);
5191 SetLayerPropertiesForTesting(surface_no_scale_child_no_scale.get(),
5192 child_scale_matrix,
5193 gfx::Point3F(),
5194 gfx::PointF(),
5195 gfx::Size(10, 10),
5196 false,
5197 true);
5198
5199 root->AddChild(parent);
5200
5201 parent->AddChild(surface_scale);
5202 parent->AddChild(surface_no_scale);
5203
5204 surface_scale->SetForceRenderSurface(true);
5205 surface_scale->AddChild(surface_scale_child_scale);
5206 surface_scale->AddChild(surface_scale_child_no_scale);
5207
5208 surface_no_scale->SetForceRenderSurface(true);
5209 surface_no_scale->AddChild(surface_no_scale_child_scale);
5210 surface_no_scale->AddChild(surface_no_scale_child_no_scale);
5211
5212 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
5213 host->SetRootLayer(root);
5214
5215 RenderSurfaceLayerList render_surface_layer_list;
5216
5217 SkMScalar device_scale_factor = 5.0;
5218 SkMScalar page_scale_factor = 7.0;
5219 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
5220 root.get(), root->bounds(), &render_surface_layer_list);
5221 inputs.device_scale_factor = device_scale_factor;
5222 inputs.page_scale_factor = page_scale_factor;
5223 inputs.page_scale_application_layer = root.get();
5224 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
5225
5226 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
5227 parent);
5228 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
5229 surface_scale);
5230 EXPECT_CONTENTS_SCALE_EQ(1.f, surface_no_scale);
5231 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
5232 surface_scale_child_scale);
5233 EXPECT_CONTENTS_SCALE_EQ(1.f, surface_scale_child_no_scale);
5234 EXPECT_CONTENTS_SCALE_EQ(device_scale_factor * page_scale_factor,
5235 surface_no_scale_child_scale);
5236 EXPECT_CONTENTS_SCALE_EQ(1.f, surface_no_scale_child_no_scale);
5237
5238 // The parent is scaled up during draw, since its contents are not scaled by
5239 // the transform hierarchy.
5240 EXPECT_FLOAT_EQ(initial_parent_scale,
5241 parent->draw_transform().matrix().get(0, 0));
5242 EXPECT_FLOAT_EQ(initial_parent_scale,
5243 parent->draw_transform().matrix().get(1, 1));
5244
5245 // The child surface is not scaled up during draw since its subtree is scaled
5246 // by the transform hierarchy.
5247 EXPECT_FLOAT_EQ(
5248 1.f,
5249 surface_scale->render_surface()->draw_transform().matrix().get(0, 0));
5250 EXPECT_FLOAT_EQ(
5251 1.f,
5252 surface_scale->render_surface()->draw_transform().matrix().get(1, 1));
5253
5254 // The surface_scale's RenderSurface is not scaled during draw, so the layer
5255 // needs to be scaled when drawing into its surface.
5256 EXPECT_FLOAT_EQ(initial_parent_scale * initial_child_scale,
5257 surface_scale->draw_transform().matrix().get(0, 0));
5258 EXPECT_FLOAT_EQ(initial_parent_scale * initial_child_scale,
5259 surface_scale->draw_transform().matrix().get(1, 1));
5260
5261 // The surface_scale_child_scale is not scaled when drawing into its surface,
5262 // since its content bounds are scaled by the transform hierarchy.
5263 EXPECT_FLOAT_EQ(
5264 initial_child_scale * initial_child_scale * initial_parent_scale,
5265 surface_scale_child_scale->draw_transform().matrix().get(0, 0));
5266 EXPECT_FLOAT_EQ(
5267 initial_child_scale * initial_child_scale * initial_parent_scale,
5268 surface_scale_child_scale->draw_transform().matrix().get(1, 1));
5269
5270 // The surface_scale_child_no_scale is scaled by the device scale, page scale
5271 // and transform hierarchy.
5272 EXPECT_FLOAT_EQ(
5273 device_scale_factor * page_scale_factor * initial_parent_scale *
5274 initial_child_scale * initial_child_scale,
5275 surface_scale_child_no_scale->draw_transform().matrix().get(0, 0));
5276 EXPECT_FLOAT_EQ(
5277 device_scale_factor * page_scale_factor * initial_parent_scale *
5278 initial_child_scale * initial_child_scale,
5279 surface_scale_child_no_scale->draw_transform().matrix().get(1, 1));
5280
5281 // The child surface is not scaled up during draw since its subtree is scaled
5282 // by the transform hierarchy.
5283 EXPECT_FLOAT_EQ(
5284 1.f,
5285 surface_no_scale->render_surface()->draw_transform().matrix().get(0, 0));
5286 EXPECT_FLOAT_EQ(
5287 1.f,
5288 surface_no_scale->render_surface()->draw_transform().matrix().get(1, 1));
5289
5290 // The surface_no_scale layer has a fixed contents scale of 1, so it needs to
5291 // be scaled by the device and page scale factors. Its surface is already
5292 // scaled by the transform hierarchy so those don't need to scale the layer's
5293 // drawing.
5294 EXPECT_FLOAT_EQ(initial_parent_scale * initial_child_scale *
5295 device_scale_factor * page_scale_factor,
5296 surface_no_scale->draw_transform().matrix().get(0, 0));
5297 EXPECT_FLOAT_EQ(initial_parent_scale * initial_child_scale *
5298 device_scale_factor * page_scale_factor,
5299 surface_no_scale->draw_transform().matrix().get(1, 1));
5300
5301 // The surface_no_scale_child_scale has its contents scaled by the page and
5302 // device scale factors, but needs to be scaled by the transform hierarchy
5303 // when drawing.
5304 EXPECT_FLOAT_EQ(
5305 initial_parent_scale * initial_child_scale * initial_child_scale,
5306 surface_no_scale_child_scale->draw_transform().matrix().get(0, 0));
5307 EXPECT_FLOAT_EQ(
5308 initial_parent_scale * initial_child_scale * initial_child_scale,
5309 surface_no_scale_child_scale->draw_transform().matrix().get(1, 1));
5310
5311 // The surface_no_scale_child_no_scale needs to be scaled by the device and
5312 // page scale factors and by any transform heirarchy below its target surface.
5313 EXPECT_FLOAT_EQ(
5314 device_scale_factor * page_scale_factor * initial_parent_scale *
5315 initial_child_scale * initial_child_scale,
5316 surface_no_scale_child_no_scale->draw_transform().matrix().get(0, 0));
5317 EXPECT_FLOAT_EQ(
5318 device_scale_factor * page_scale_factor * initial_parent_scale *
5319 initial_child_scale * initial_child_scale,
5320 surface_no_scale_child_no_scale->draw_transform().matrix().get(1, 1));
5321 }
5322
5323 TEST_F(LayerTreeHostCommonTest, IdealScaleForAnimatingLayer) {
5324 MockContentLayerClient delegate;
5325 gfx::Transform identity_matrix;
5326
5327 gfx::Transform parent_scale_matrix;
5328 SkMScalar initial_parent_scale = 1.75;
5329 parent_scale_matrix.Scale(initial_parent_scale, initial_parent_scale);
5330
5331 gfx::Transform child_scale_matrix;
5332 SkMScalar initial_child_scale = 1.25;
5333 child_scale_matrix.Scale(initial_child_scale, initial_child_scale);
5334
5335 scoped_refptr<Layer> root = Layer::Create();
5336 root->SetBounds(gfx::Size(100, 100));
5337
5338 scoped_refptr<FakePictureLayer> parent =
5339 CreateDrawablePictureLayer(&delegate);
5340 SetLayerPropertiesForTesting(parent.get(),
5341 parent_scale_matrix,
5342 gfx::Point3F(),
5343 gfx::PointF(),
5344 gfx::Size(100, 100),
5345 false,
5346 true);
5347
5348 scoped_refptr<FakePictureLayer> child_scale =
5349 CreateDrawablePictureLayer(&delegate);
5350 SetLayerPropertiesForTesting(child_scale.get(),
5351 child_scale_matrix,
5352 gfx::Point3F(),
5353 gfx::PointF(2.f, 2.f),
5354 gfx::Size(10, 10),
5355 false,
5356 true);
5357
5358 root->AddChild(parent);
5359
5360 parent->AddChild(child_scale);
5361
5362 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
5363 host->SetRootLayer(root);
5364
5365 {
5366 RenderSurfaceLayerList render_surface_layer_list;
5367 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
5368 root.get(), root->bounds(), &render_surface_layer_list);
5369 inputs.can_adjust_raster_scales = true;
5370 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
5371
5372 EXPECT_IDEAL_SCALE_EQ(initial_parent_scale, parent);
5373 // Animating layers compute ideal scale in the same way as when
5374 // they are static.
5375 EXPECT_IDEAL_SCALE_EQ(initial_child_scale * initial_parent_scale,
5376 child_scale);
5377 }
5378 }
5379
5380 // TODO(sohanjg): Remove this test when ContentLayer is removed.
5381 TEST_F(LayerTreeHostCommonTest,
5382 ChangeInContentBoundsOrScaleTriggersPushProperties) {
5383 MockContentLayerClient delegate;
5384 scoped_refptr<Layer> root = Layer::Create();
5385 scoped_refptr<Layer> child = CreateDrawableContentLayer(&delegate);
5386 root->AddChild(child);
5387
5388 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
5389 host->SetRootLayer(root);
5390
5391 gfx::Transform identity_matrix;
5392 SetLayerPropertiesForTesting(root.get(),
5393 identity_matrix,
5394 gfx::Point3F(),
5395 gfx::PointF(),
5396 gfx::Size(100, 100),
5397 true,
5398 false);
5399 SetLayerPropertiesForTesting(child.get(),
5400 identity_matrix,
5401 gfx::Point3F(),
5402 gfx::PointF(),
5403 gfx::Size(100, 100),
5404 true,
5405 false);
5406
5407 root->reset_needs_push_properties_for_testing();
5408 child->reset_needs_push_properties_for_testing();
5409
5410 // This will change both layers' content bounds.
5411 ExecuteCalculateDrawProperties(root.get());
5412 EXPECT_TRUE(root->needs_push_properties());
5413 EXPECT_TRUE(child->needs_push_properties());
5414
5415 root->reset_needs_push_properties_for_testing();
5416 child->reset_needs_push_properties_for_testing();
5417
5418 // This will change only the child layer's contents scale and content bounds,
5419 // since the root layer is not a ContentsScalingLayer.
5420 ExecuteCalculateDrawProperties(root.get(), 2.f);
5421 EXPECT_FALSE(root->needs_push_properties());
5422 EXPECT_TRUE(child->needs_push_properties());
5423
5424 root->reset_needs_push_properties_for_testing();
5425 child->reset_needs_push_properties_for_testing();
5426
5427 // This will not change either layer's contents scale or content bounds.
5428 ExecuteCalculateDrawProperties(root.get(), 2.f);
5429 EXPECT_FALSE(root->needs_push_properties());
5430 EXPECT_FALSE(child->needs_push_properties());
5431 }
5432
5433 TEST_F(LayerTreeHostCommonTest, RenderSurfaceTransformsInHighDPI) {
5434 MockContentLayerClient delegate;
5435 gfx::Transform identity_matrix;
5436
5437 scoped_refptr<FakePictureLayer> parent =
5438 CreateDrawablePictureLayer(&delegate);
5439 SetLayerPropertiesForTesting(parent.get(),
5440 identity_matrix,
5441 gfx::Point3F(),
5442 gfx::PointF(),
5443 gfx::Size(30, 30),
5444 false,
5445 true);
5446
5447 scoped_refptr<FakePictureLayer> child = CreateDrawablePictureLayer(&delegate);
5448 SetLayerPropertiesForTesting(child.get(),
5449 identity_matrix,
5450 gfx::Point3F(),
5451 gfx::PointF(2.f, 2.f),
5452 gfx::Size(10, 10),
5453 false,
5454 true);
5455
5456 gfx::Transform replica_transform;
5457 replica_transform.Scale(1.0, -1.0);
5458 scoped_refptr<FakePictureLayer> replica =
5459 CreateDrawablePictureLayer(&delegate);
5460 SetLayerPropertiesForTesting(replica.get(),
5461 replica_transform,
5462 gfx::Point3F(),
5463 gfx::PointF(2.f, 2.f),
5464 gfx::Size(10, 10),
5465 false,
5466 true);
5467
5468 // This layer should end up in the same surface as child, with the same draw
5469 // and screen space transforms.
5470 scoped_refptr<FakePictureLayer> duplicate_child_non_owner =
5471 CreateDrawablePictureLayer(&delegate);
5472 SetLayerPropertiesForTesting(duplicate_child_non_owner.get(),
5473 identity_matrix,
5474 gfx::Point3F(),
5475 gfx::PointF(),
5476 gfx::Size(10, 10),
5477 false,
5478 true);
5479
5480 parent->AddChild(child);
5481 child->AddChild(duplicate_child_non_owner);
5482 child->SetReplicaLayer(replica.get());
5483
5484 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
5485 host->SetRootLayer(parent);
5486
5487 RenderSurfaceLayerList render_surface_layer_list;
5488
5489 float device_scale_factor = 1.5f;
5490 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
5491 parent.get(), parent->bounds(), &render_surface_layer_list);
5492 inputs.device_scale_factor = device_scale_factor;
5493 inputs.can_adjust_raster_scales = true;
5494 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
5495
5496 // We should have two render surfaces. The root's render surface and child's
5497 // render surface (it needs one because it has a replica layer).
5498 EXPECT_EQ(2u, render_surface_layer_list.size());
5499
5500 gfx::Transform expected_parent_transform;
5501 expected_parent_transform.Scale(device_scale_factor, device_scale_factor);
5502 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
5503 parent->screen_space_transform());
5504 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_parent_transform,
5505 parent->draw_transform());
5506
5507 gfx::Transform expected_draw_transform;
5508 expected_draw_transform.Scale(device_scale_factor, device_scale_factor);
5509 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_draw_transform,
5510 child->draw_transform());
5511
5512 gfx::Transform expected_screen_space_transform;
5513 expected_screen_space_transform.Scale(device_scale_factor,
5514 device_scale_factor);
5515 expected_screen_space_transform.Translate(child->position().x(),
5516 child->position().y());
5517 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_screen_space_transform,
5518 child->screen_space_transform());
5519
5520 gfx::Transform expected_duplicate_child_draw_transform =
5521 child->draw_transform();
5522 EXPECT_TRANSFORMATION_MATRIX_EQ(child->draw_transform(),
5523 duplicate_child_non_owner->draw_transform());
5524 EXPECT_TRANSFORMATION_MATRIX_EQ(
5525 child->screen_space_transform(),
5526 duplicate_child_non_owner->screen_space_transform());
5527 EXPECT_EQ(child->drawable_content_rect(),
5528 duplicate_child_non_owner->drawable_content_rect());
5529 EXPECT_EQ(child->content_bounds(),
5530 duplicate_child_non_owner->content_bounds());
5531
5532 gfx::Transform expected_render_surface_draw_transform;
5533 expected_render_surface_draw_transform.Translate(
5534 device_scale_factor * child->position().x(),
5535 device_scale_factor * child->position().y());
5536 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_render_surface_draw_transform,
5537 child->render_surface()->draw_transform());
5538
5539 gfx::Transform expected_surface_draw_transform;
5540 expected_surface_draw_transform.Translate(device_scale_factor * 2.f,
5541 device_scale_factor * 2.f);
5542 EXPECT_TRANSFORMATION_MATRIX_EQ(expected_surface_draw_transform,
5543 child->render_surface()->draw_transform());
5544
5545 gfx::Transform expected_surface_screen_space_transform;
5546 expected_surface_screen_space_transform.Translate(device_scale_factor * 2.f,
5547 device_scale_factor * 2.f);
5548 EXPECT_TRANSFORMATION_MATRIX_EQ(
5549 expected_surface_screen_space_transform,
5550 child->render_surface()->screen_space_transform());
5551
5552 gfx::Transform expected_replica_draw_transform;
5553 expected_replica_draw_transform.matrix().set(1, 1, -1.0);
5554 expected_replica_draw_transform.matrix().set(0, 3, 6.0);
5555 expected_replica_draw_transform.matrix().set(1, 3, 6.0);
5556 EXPECT_TRANSFORMATION_MATRIX_EQ(
5557 expected_replica_draw_transform,
5558 child->render_surface()->replica_draw_transform());
5559
5560 gfx::Transform expected_replica_screen_space_transform;
5561 expected_replica_screen_space_transform.matrix().set(1, 1, -1.0);
5562 expected_replica_screen_space_transform.matrix().set(0, 3, 6.0);
5563 expected_replica_screen_space_transform.matrix().set(1, 3, 6.0);
5564 EXPECT_TRANSFORMATION_MATRIX_EQ(
5565 expected_replica_screen_space_transform,
5566 child->render_surface()->replica_screen_space_transform());
5567 EXPECT_TRANSFORMATION_MATRIX_EQ(
5568 expected_replica_screen_space_transform,
5569 child->render_surface()->replica_screen_space_transform());
5570 }
5571
5572 TEST_F(LayerTreeHostCommonTest,
5573 RenderSurfaceTransformsInHighDPIAccurateScaleZeroPosition) {
5574 MockContentLayerClient delegate;
5575 gfx::Transform identity_matrix;
5576
5577 scoped_refptr<FakePictureLayer> parent =
5578 CreateDrawablePictureLayer(&delegate);
5579 SetLayerPropertiesForTesting(parent.get(),
5580 identity_matrix,
5581 gfx::Point3F(),
5582 gfx::PointF(),
5583 gfx::Size(33, 31),
5584 false,
5585 true);
5586
5587 scoped_refptr<FakePictureLayer> child = CreateDrawablePictureLayer(&delegate);
5588 SetLayerPropertiesForTesting(child.get(),
5589 identity_matrix,
5590 gfx::Point3F(),
5591 gfx::PointF(),
5592 gfx::Size(13, 11),
5593 false,
5594 true);
5595
5596 gfx::Transform replica_transform;
5597 replica_transform.Scale(1.0, -1.0);
5598 scoped_refptr<FakePictureLayer> replica =
5599 CreateDrawablePictureLayer(&delegate);
5600 SetLayerPropertiesForTesting(replica.get(),
5601 replica_transform,
5602 gfx::Point3F(),
5603 gfx::PointF(),
5604 gfx::Size(13, 11),
5605 false,
5606 true);
5607
5608 parent->AddChild(child);
5609 child->SetReplicaLayer(replica.get());
5610
5611 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
5612 host->SetRootLayer(parent);
5613
5614 float device_scale_factor = 1.7f;
5615
5616 RenderSurfaceLayerList render_surface_layer_list;
5617 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
5618 parent.get(), parent->bounds(), &render_surface_layer_list);
5619 inputs.device_scale_factor = device_scale_factor;
5620 inputs.can_adjust_raster_scales = true;
5621 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
5622
5623 // We should have two render surfaces. The root's render surface and child's
5624 // render surface (it needs one because it has a replica layer).
5625 EXPECT_EQ(2u, render_surface_layer_list.size());
5626
5627 gfx::Transform identity_transform;
5628 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_transform,
5629 child->render_surface()->draw_transform());
5630 EXPECT_TRANSFORMATION_MATRIX_EQ(identity_transform,
5631 child->render_surface()->draw_transform());
5632 EXPECT_TRANSFORMATION_MATRIX_EQ(
5633 identity_transform, child->render_surface()->screen_space_transform());
5634
5635 gfx::Transform expected_replica_draw_transform;
5636 expected_replica_draw_transform.matrix().set(1, 1, -1.0);
5637 EXPECT_TRANSFORMATION_MATRIX_EQ(
5638 expected_replica_draw_transform,
5639 child->render_surface()->replica_draw_transform());
5640
5641 gfx::Transform expected_replica_screen_space_transform;
5642 expected_replica_screen_space_transform.matrix().set(1, 1, -1.0);
5643 EXPECT_TRANSFORMATION_MATRIX_EQ(
5644 expected_replica_screen_space_transform,
5645 child->render_surface()->replica_screen_space_transform());
5646 }
5647
5648 TEST_F(LayerTreeHostCommonTest, SubtreeSearch) {
5649 scoped_refptr<Layer> root = Layer::Create();
5650 scoped_refptr<Layer> child = Layer::Create();
5651 scoped_refptr<Layer> grand_child = Layer::Create();
5652 scoped_refptr<Layer> mask_layer = Layer::Create();
5653 scoped_refptr<Layer> replica_layer = Layer::Create();
5654
5655 grand_child->SetReplicaLayer(replica_layer.get());
5656 child->AddChild(grand_child.get());
5657 child->SetMaskLayer(mask_layer.get());
5658 root->AddChild(child.get());
5659
5660 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
5661 host->SetRootLayer(root);
5662
5663 int nonexistent_id = -1;
5664 EXPECT_EQ(root.get(),
5665 LayerTreeHostCommon::FindLayerInSubtree(root.get(), root->id()));
5666 EXPECT_EQ(child.get(),
5667 LayerTreeHostCommon::FindLayerInSubtree(root.get(), child->id()));
5668 EXPECT_EQ(
5669 grand_child.get(),
5670 LayerTreeHostCommon::FindLayerInSubtree(root.get(), grand_child->id()));
5671 EXPECT_EQ(
5672 mask_layer.get(),
5673 LayerTreeHostCommon::FindLayerInSubtree(root.get(), mask_layer->id()));
5674 EXPECT_EQ(
5675 replica_layer.get(),
5676 LayerTreeHostCommon::FindLayerInSubtree(root.get(), replica_layer->id()));
5677 EXPECT_EQ(
5678 0, LayerTreeHostCommon::FindLayerInSubtree(root.get(), nonexistent_id));
5679 }
5680
5681 TEST_F(LayerTreeHostCommonTest, TransparentChildRenderSurfaceCreation) {
5682 scoped_refptr<Layer> root = Layer::Create();
5683 scoped_refptr<Layer> child = Layer::Create();
5684 scoped_refptr<LayerWithForcedDrawsContent> grand_child =
5685 make_scoped_refptr(new LayerWithForcedDrawsContent());
5686
5687 const gfx::Transform identity_matrix;
5688 SetLayerPropertiesForTesting(root.get(),
5689 identity_matrix,
5690 gfx::Point3F(),
5691 gfx::PointF(),
5692 gfx::Size(100, 100),
5693 true,
5694 false);
5695 SetLayerPropertiesForTesting(child.get(),
5696 identity_matrix,
5697 gfx::Point3F(),
5698 gfx::PointF(),
5699 gfx::Size(10, 10),
5700 true,
5701 false);
5702 SetLayerPropertiesForTesting(grand_child.get(),
5703 identity_matrix,
5704 gfx::Point3F(),
5705 gfx::PointF(),
5706 gfx::Size(10, 10),
5707 true,
5708 false);
5709
5710 root->AddChild(child);
5711 child->AddChild(grand_child);
5712 child->SetOpacity(0.5f);
5713
5714 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
5715 host->SetRootLayer(root);
5716
5717 ExecuteCalculateDrawProperties(root.get());
5718
5719 EXPECT_FALSE(child->render_surface());
5720 }
5721
5722 TEST_F(LayerTreeHostCommonTest, OpacityAnimatingOnPendingTree) {
5723 FakeImplProxy proxy;
5724 TestSharedBitmapManager shared_bitmap_manager;
5725 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
5726 host_impl.CreatePendingTree();
5727 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.pending_tree(), 1);
5728
5729 const gfx::Transform identity_matrix;
5730 SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
5731 gfx::PointF(), gfx::Size(100, 100), true, false,
5732 false);
5733 root->SetDrawsContent(true);
5734
5735 scoped_ptr<LayerImpl> child = LayerImpl::Create(host_impl.pending_tree(), 2);
5736 SetLayerPropertiesForTesting(child.get(), identity_matrix, gfx::Point3F(),
5737 gfx::PointF(), gfx::Size(50, 50), true, false,
5738 false);
5739 child->SetDrawsContent(true);
5740 child->SetOpacity(0.0f);
5741
5742 // Add opacity animation.
5743 AddOpacityTransitionToController(
5744 child->layer_animation_controller(), 10.0, 0.0f, 1.0f, false);
5745
5746 root->AddChild(child.Pass());
5747 root->SetHasRenderSurface(true);
5748
5749 LayerImplList render_surface_layer_list;
5750 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
5751 root.get(), root->bounds(), &render_surface_layer_list);
5752 inputs.can_adjust_raster_scales = true;
5753 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
5754
5755 // We should have one render surface and two layers. The child
5756 // layer should be included even though it is transparent.
5757 ASSERT_EQ(1u, render_surface_layer_list.size());
5758 ASSERT_EQ(2u, root->render_surface()->layer_list().size());
5759 }
5760
5761 using LCDTextTestParam = std::tr1::tuple<bool, bool, bool>;
5762 class LCDTextTest
5763 : public LayerTreeHostCommonTestBase,
5764 public testing::TestWithParam<LCDTextTestParam> {
5765 public:
5766 LCDTextTest()
5767 : host_impl_(&proxy_, &shared_bitmap_manager_, &task_graph_runner_),
5768 root_(nullptr),
5769 child_(nullptr),
5770 grand_child_(nullptr) {}
5771
5772 protected:
5773 void SetUp() override {
5774 can_use_lcd_text_ = std::tr1::get<0>(GetParam());
5775 layers_always_allowed_lcd_text_ = std::tr1::get<1>(GetParam());
5776
5777 scoped_ptr<LayerImpl> root_ptr =
5778 LayerImpl::Create(host_impl_.active_tree(), 1);
5779 scoped_ptr<LayerImpl> child_ptr =
5780 LayerImpl::Create(host_impl_.active_tree(), 2);
5781 scoped_ptr<LayerImpl> grand_child_ptr =
5782 LayerImpl::Create(host_impl_.active_tree(), 3);
5783
5784 // Stash raw pointers to look at later.
5785 root_ = root_ptr.get();
5786 child_ = child_ptr.get();
5787 grand_child_ = grand_child_ptr.get();
5788
5789 child_->AddChild(grand_child_ptr.Pass());
5790 root_->AddChild(child_ptr.Pass());
5791 host_impl_.active_tree()->SetRootLayer(root_ptr.Pass());
5792
5793 root_->SetContentsOpaque(true);
5794 child_->SetContentsOpaque(true);
5795 grand_child_->SetContentsOpaque(true);
5796
5797 gfx::Transform identity_matrix;
5798 SetLayerPropertiesForTesting(root_, identity_matrix, gfx::Point3F(),
5799 gfx::PointF(), gfx::Size(1, 1), true, false,
5800 true);
5801 SetLayerPropertiesForTesting(child_, identity_matrix, gfx::Point3F(),
5802 gfx::PointF(), gfx::Size(1, 1), true, false,
5803 std::tr1::get<2>(GetParam()));
5804 SetLayerPropertiesForTesting(grand_child_, identity_matrix, gfx::Point3F(),
5805 gfx::PointF(), gfx::Size(1, 1), true, false,
5806 false);
5807 }
5808
5809 bool can_use_lcd_text_;
5810 bool layers_always_allowed_lcd_text_;
5811
5812 FakeImplProxy proxy_;
5813 TestSharedBitmapManager shared_bitmap_manager_;
5814 TestTaskGraphRunner task_graph_runner_;
5815 FakeLayerTreeHostImpl host_impl_;
5816
5817 LayerImpl* root_;
5818 LayerImpl* child_;
5819 LayerImpl* grand_child_;
5820 };
5821
5822 TEST_P(LCDTextTest, CanUseLCDText) {
5823 bool expect_lcd_text = can_use_lcd_text_ || layers_always_allowed_lcd_text_;
5824 bool expect_not_lcd_text = layers_always_allowed_lcd_text_;
5825
5826 // Case 1: Identity transform.
5827 gfx::Transform identity_matrix;
5828 ExecuteCalculateDrawProperties(root_, 1.f, 1.f, NULL, can_use_lcd_text_,
5829 layers_always_allowed_lcd_text_);
5830 EXPECT_EQ(expect_lcd_text, root_->can_use_lcd_text());
5831 EXPECT_EQ(expect_lcd_text, child_->can_use_lcd_text());
5832 EXPECT_EQ(expect_lcd_text, grand_child_->can_use_lcd_text());
5833
5834 // Case 2: Integral translation.
5835 gfx::Transform integral_translation;
5836 integral_translation.Translate(1.0, 2.0);
5837 child_->SetTransform(integral_translation);
5838 ExecuteCalculateDrawProperties(root_, 1.f, 1.f, NULL, can_use_lcd_text_,
5839 layers_always_allowed_lcd_text_);
5840 EXPECT_EQ(expect_lcd_text, root_->can_use_lcd_text());
5841 EXPECT_EQ(expect_lcd_text, child_->can_use_lcd_text());
5842 EXPECT_EQ(expect_lcd_text, grand_child_->can_use_lcd_text());
5843
5844 // Case 3: Non-integral translation.
5845 gfx::Transform non_integral_translation;
5846 non_integral_translation.Translate(1.5, 2.5);
5847 child_->SetTransform(non_integral_translation);
5848 ExecuteCalculateDrawProperties(root_, 1.f, 1.f, NULL, can_use_lcd_text_,
5849 layers_always_allowed_lcd_text_);
5850 EXPECT_EQ(expect_lcd_text, root_->can_use_lcd_text());
5851 EXPECT_EQ(expect_not_lcd_text, child_->can_use_lcd_text());
5852 EXPECT_EQ(expect_not_lcd_text, grand_child_->can_use_lcd_text());
5853
5854 // Case 4: Rotation.
5855 gfx::Transform rotation;
5856 rotation.Rotate(10.0);
5857 child_->SetTransform(rotation);
5858 ExecuteCalculateDrawProperties(root_, 1.f, 1.f, NULL, can_use_lcd_text_,
5859 layers_always_allowed_lcd_text_);
5860 EXPECT_EQ(expect_lcd_text, root_->can_use_lcd_text());
5861 EXPECT_EQ(expect_not_lcd_text, child_->can_use_lcd_text());
5862 EXPECT_EQ(expect_not_lcd_text, grand_child_->can_use_lcd_text());
5863
5864 // Case 5: Scale.
5865 gfx::Transform scale;
5866 scale.Scale(2.0, 2.0);
5867 child_->SetTransform(scale);
5868 ExecuteCalculateDrawProperties(root_, 1.f, 1.f, NULL, can_use_lcd_text_,
5869 layers_always_allowed_lcd_text_);
5870 EXPECT_EQ(expect_lcd_text, root_->can_use_lcd_text());
5871 EXPECT_EQ(expect_not_lcd_text, child_->can_use_lcd_text());
5872 EXPECT_EQ(expect_not_lcd_text, grand_child_->can_use_lcd_text());
5873
5874 // Case 6: Skew.
5875 gfx::Transform skew;
5876 skew.SkewX(10.0);
5877 child_->SetTransform(skew);
5878 ExecuteCalculateDrawProperties(root_, 1.f, 1.f, NULL, can_use_lcd_text_,
5879 layers_always_allowed_lcd_text_);
5880 EXPECT_EQ(expect_lcd_text, root_->can_use_lcd_text());
5881 EXPECT_EQ(expect_not_lcd_text, child_->can_use_lcd_text());
5882 EXPECT_EQ(expect_not_lcd_text, grand_child_->can_use_lcd_text());
5883
5884 // Case 7: Translucent.
5885 child_->SetTransform(identity_matrix);
5886 child_->SetOpacity(0.5f);
5887 ExecuteCalculateDrawProperties(root_, 1.f, 1.f, NULL, can_use_lcd_text_,
5888 layers_always_allowed_lcd_text_);
5889 EXPECT_EQ(expect_lcd_text, root_->can_use_lcd_text());
5890 EXPECT_EQ(expect_not_lcd_text, child_->can_use_lcd_text());
5891 EXPECT_EQ(expect_not_lcd_text, grand_child_->can_use_lcd_text());
5892
5893 // Case 8: Sanity check: restore transform and opacity.
5894 child_->SetTransform(identity_matrix);
5895 child_->SetOpacity(1.f);
5896 ExecuteCalculateDrawProperties(root_, 1.f, 1.f, NULL, can_use_lcd_text_,
5897 layers_always_allowed_lcd_text_);
5898 EXPECT_EQ(expect_lcd_text, root_->can_use_lcd_text());
5899 EXPECT_EQ(expect_lcd_text, child_->can_use_lcd_text());
5900 EXPECT_EQ(expect_lcd_text, grand_child_->can_use_lcd_text());
5901
5902 // Case 9: Non-opaque content.
5903 child_->SetContentsOpaque(false);
5904 ExecuteCalculateDrawProperties(root_, 1.f, 1.f, NULL, can_use_lcd_text_,
5905 layers_always_allowed_lcd_text_);
5906 EXPECT_EQ(expect_lcd_text, root_->can_use_lcd_text());
5907 EXPECT_EQ(expect_not_lcd_text, child_->can_use_lcd_text());
5908 EXPECT_EQ(expect_lcd_text, grand_child_->can_use_lcd_text());
5909
5910 // Case 10: Sanity check: restore content opaqueness.
5911 child_->SetContentsOpaque(true);
5912 ExecuteCalculateDrawProperties(root_, 1.f, 1.f, NULL, can_use_lcd_text_,
5913 layers_always_allowed_lcd_text_);
5914 EXPECT_EQ(expect_lcd_text, root_->can_use_lcd_text());
5915 EXPECT_EQ(expect_lcd_text, child_->can_use_lcd_text());
5916 EXPECT_EQ(expect_lcd_text, grand_child_->can_use_lcd_text());
5917 }
5918
5919 TEST_P(LCDTextTest, CanUseLCDTextWithAnimation) {
5920 bool expect_lcd_text = can_use_lcd_text_ || layers_always_allowed_lcd_text_;
5921
5922 // Sanity check: Make sure can_use_lcd_text_ is set on each node.
5923 ExecuteCalculateDrawProperties(root_, 1.f, 1.f, NULL, can_use_lcd_text_,
5924 layers_always_allowed_lcd_text_);
5925 EXPECT_EQ(expect_lcd_text, root_->can_use_lcd_text());
5926 EXPECT_EQ(expect_lcd_text, child_->can_use_lcd_text());
5927 EXPECT_EQ(expect_lcd_text, grand_child_->can_use_lcd_text());
5928
5929 // Add opacity animation.
5930 child_->SetOpacity(0.9f);
5931 AddOpacityTransitionToController(
5932 child_->layer_animation_controller(), 10.0, 0.9f, 0.1f, false);
5933
5934 ExecuteCalculateDrawProperties(root_, 1.f, 1.f, NULL, can_use_lcd_text_,
5935 layers_always_allowed_lcd_text_);
5936 // Text AA should not be adjusted while animation is active.
5937 // Make sure LCD text AA setting remains unchanged.
5938 EXPECT_EQ(expect_lcd_text, root_->can_use_lcd_text());
5939 EXPECT_EQ(expect_lcd_text, child_->can_use_lcd_text());
5940 EXPECT_EQ(expect_lcd_text, grand_child_->can_use_lcd_text());
5941 }
5942
5943 INSTANTIATE_TEST_CASE_P(LayerTreeHostCommonTest,
5944 LCDTextTest,
5945 testing::Combine(testing::Bool(),
5946 testing::Bool(),
5947 testing::Bool()));
5948
5949 TEST_F(LayerTreeHostCommonTest, SubtreeHidden_SingleLayer) {
5950 FakeImplProxy proxy;
5951 TestSharedBitmapManager shared_bitmap_manager;
5952 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
5953 host_impl.CreatePendingTree();
5954 const gfx::Transform identity_matrix;
5955
5956 scoped_refptr<Layer> root = Layer::Create();
5957 SetLayerPropertiesForTesting(root.get(),
5958 identity_matrix,
5959 gfx::Point3F(),
5960 gfx::PointF(),
5961 gfx::Size(50, 50),
5962 true,
5963 false);
5964 root->SetIsDrawable(true);
5965
5966 scoped_refptr<Layer> child = Layer::Create();
5967 SetLayerPropertiesForTesting(child.get(),
5968 identity_matrix,
5969 gfx::Point3F(),
5970 gfx::PointF(),
5971 gfx::Size(40, 40),
5972 true,
5973 false);
5974 child->SetIsDrawable(true);
5975
5976 scoped_refptr<Layer> grand_child = Layer::Create();
5977 SetLayerPropertiesForTesting(grand_child.get(),
5978 identity_matrix,
5979 gfx::Point3F(),
5980 gfx::PointF(),
5981 gfx::Size(30, 30),
5982 true,
5983 false);
5984 grand_child->SetIsDrawable(true);
5985 grand_child->SetHideLayerAndSubtree(true);
5986
5987 child->AddChild(grand_child);
5988 root->AddChild(child);
5989
5990 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
5991 host->SetRootLayer(root);
5992
5993 RenderSurfaceLayerList render_surface_layer_list;
5994 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
5995 root.get(), root->bounds(), &render_surface_layer_list);
5996 inputs.can_adjust_raster_scales = true;
5997 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
5998
5999 // We should have one render surface and two layers. The grand child has
6000 // hidden itself.
6001 ASSERT_EQ(1u, render_surface_layer_list.size());
6002 ASSERT_EQ(2u, root->render_surface()->layer_list().size());
6003 EXPECT_EQ(root->id(), root->render_surface()->layer_list().at(0)->id());
6004 EXPECT_EQ(child->id(), root->render_surface()->layer_list().at(1)->id());
6005 }
6006
6007 TEST_F(LayerTreeHostCommonTest, SubtreeHidden_SingleLayerImpl) {
6008 FakeImplProxy proxy;
6009 TestSharedBitmapManager shared_bitmap_manager;
6010 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
6011 host_impl.CreatePendingTree();
6012 const gfx::Transform identity_matrix;
6013
6014 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.pending_tree(), 1);
6015 SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
6016 gfx::PointF(), gfx::Size(50, 50), true, false,
6017 false);
6018 root->SetDrawsContent(true);
6019
6020 scoped_ptr<LayerImpl> child = LayerImpl::Create(host_impl.pending_tree(), 2);
6021 SetLayerPropertiesForTesting(child.get(), identity_matrix, gfx::Point3F(),
6022 gfx::PointF(), gfx::Size(40, 40), true, false,
6023 false);
6024 child->SetDrawsContent(true);
6025
6026 scoped_ptr<LayerImpl> grand_child =
6027 LayerImpl::Create(host_impl.pending_tree(), 3);
6028 SetLayerPropertiesForTesting(grand_child.get(), identity_matrix,
6029 gfx::Point3F(), gfx::PointF(), gfx::Size(30, 30),
6030 true, false, false);
6031 grand_child->SetDrawsContent(true);
6032 grand_child->SetHideLayerAndSubtree(true);
6033
6034 child->AddChild(grand_child.Pass());
6035 root->AddChild(child.Pass());
6036 root->SetHasRenderSurface(true);
6037
6038 LayerImplList render_surface_layer_list;
6039 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
6040 root.get(), root->bounds(), &render_surface_layer_list);
6041 inputs.can_adjust_raster_scales = true;
6042 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
6043
6044 // We should have one render surface and two layers. The grand child has
6045 // hidden itself.
6046 ASSERT_EQ(1u, render_surface_layer_list.size());
6047 ASSERT_EQ(2u, root->render_surface()->layer_list().size());
6048 EXPECT_EQ(1, root->render_surface()->layer_list().at(0)->id());
6049 EXPECT_EQ(2, root->render_surface()->layer_list().at(1)->id());
6050 }
6051
6052 TEST_F(LayerTreeHostCommonTest, SubtreeHidden_TwoLayers) {
6053 FakeImplProxy proxy;
6054 TestSharedBitmapManager shared_bitmap_manager;
6055 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
6056 host_impl.CreatePendingTree();
6057 const gfx::Transform identity_matrix;
6058
6059 scoped_refptr<Layer> root = Layer::Create();
6060 SetLayerPropertiesForTesting(root.get(),
6061 identity_matrix,
6062 gfx::Point3F(),
6063 gfx::PointF(),
6064 gfx::Size(50, 50),
6065 true,
6066 false);
6067 root->SetIsDrawable(true);
6068
6069 scoped_refptr<Layer> child = Layer::Create();
6070 SetLayerPropertiesForTesting(child.get(),
6071 identity_matrix,
6072 gfx::Point3F(),
6073 gfx::PointF(),
6074 gfx::Size(40, 40),
6075 true,
6076 false);
6077 child->SetIsDrawable(true);
6078 child->SetHideLayerAndSubtree(true);
6079
6080 scoped_refptr<Layer> grand_child = Layer::Create();
6081 SetLayerPropertiesForTesting(grand_child.get(),
6082 identity_matrix,
6083 gfx::Point3F(),
6084 gfx::PointF(),
6085 gfx::Size(30, 30),
6086 true,
6087 false);
6088 grand_child->SetIsDrawable(true);
6089
6090 child->AddChild(grand_child);
6091 root->AddChild(child);
6092
6093 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
6094 host->SetRootLayer(root);
6095
6096 RenderSurfaceLayerList render_surface_layer_list;
6097 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
6098 root.get(), root->bounds(), &render_surface_layer_list);
6099 inputs.can_adjust_raster_scales = true;
6100 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
6101
6102 // We should have one render surface and one layers. The child has
6103 // hidden itself and the grand child.
6104 ASSERT_EQ(1u, render_surface_layer_list.size());
6105 ASSERT_EQ(1u, root->render_surface()->layer_list().size());
6106 EXPECT_EQ(root->id(), root->render_surface()->layer_list().at(0)->id());
6107 }
6108
6109 TEST_F(LayerTreeHostCommonTest, SubtreeHidden_TwoLayersImpl) {
6110 FakeImplProxy proxy;
6111 TestSharedBitmapManager shared_bitmap_manager;
6112 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
6113 host_impl.CreatePendingTree();
6114 const gfx::Transform identity_matrix;
6115
6116 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.pending_tree(), 1);
6117 SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
6118 gfx::PointF(), gfx::Size(50, 50), true, false,
6119 true);
6120 root->SetDrawsContent(true);
6121
6122 scoped_ptr<LayerImpl> child = LayerImpl::Create(host_impl.pending_tree(), 2);
6123 SetLayerPropertiesForTesting(child.get(), identity_matrix, gfx::Point3F(),
6124 gfx::PointF(), gfx::Size(40, 40), true, false,
6125 false);
6126 child->SetDrawsContent(true);
6127 child->SetHideLayerAndSubtree(true);
6128
6129 scoped_ptr<LayerImpl> grand_child =
6130 LayerImpl::Create(host_impl.pending_tree(), 3);
6131 SetLayerPropertiesForTesting(grand_child.get(), identity_matrix,
6132 gfx::Point3F(), gfx::PointF(), gfx::Size(30, 30),
6133 true, false, false);
6134 grand_child->SetDrawsContent(true);
6135
6136 child->AddChild(grand_child.Pass());
6137 root->AddChild(child.Pass());
6138
6139 LayerImplList render_surface_layer_list;
6140 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
6141 root.get(), root->bounds(), &render_surface_layer_list);
6142 inputs.can_adjust_raster_scales = true;
6143 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
6144
6145 // We should have one render surface and one layers. The child has
6146 // hidden itself and the grand child.
6147 ASSERT_EQ(1u, render_surface_layer_list.size());
6148 ASSERT_EQ(1u, root->render_surface()->layer_list().size());
6149 EXPECT_EQ(1, root->render_surface()->layer_list().at(0)->id());
6150 }
6151
6152 void EmptyCopyOutputCallback(scoped_ptr<CopyOutputResult> result) {}
6153
6154 TEST_F(LayerTreeHostCommonTest, SubtreeHiddenWithCopyRequest) {
6155 FakeImplProxy proxy;
6156 TestSharedBitmapManager shared_bitmap_manager;
6157 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
6158 host_impl.CreatePendingTree();
6159 const gfx::Transform identity_matrix;
6160
6161 scoped_refptr<Layer> root = Layer::Create();
6162 SetLayerPropertiesForTesting(root.get(),
6163 identity_matrix,
6164 gfx::Point3F(),
6165 gfx::PointF(),
6166 gfx::Size(50, 50),
6167 true,
6168 false);
6169 root->SetIsDrawable(true);
6170
6171 scoped_refptr<Layer> copy_grand_parent = Layer::Create();
6172 SetLayerPropertiesForTesting(copy_grand_parent.get(),
6173 identity_matrix,
6174 gfx::Point3F(),
6175 gfx::PointF(),
6176 gfx::Size(40, 40),
6177 true,
6178 false);
6179 copy_grand_parent->SetIsDrawable(true);
6180
6181 scoped_refptr<Layer> copy_parent = Layer::Create();
6182 SetLayerPropertiesForTesting(copy_parent.get(),
6183 identity_matrix,
6184 gfx::Point3F(),
6185 gfx::PointF(),
6186 gfx::Size(30, 30),
6187 true,
6188 false);
6189 copy_parent->SetIsDrawable(true);
6190 copy_parent->SetForceRenderSurface(true);
6191
6192 scoped_refptr<Layer> copy_layer = Layer::Create();
6193 SetLayerPropertiesForTesting(copy_layer.get(),
6194 identity_matrix,
6195 gfx::Point3F(),
6196 gfx::PointF(),
6197 gfx::Size(20, 20),
6198 true,
6199 false);
6200 copy_layer->SetIsDrawable(true);
6201
6202 scoped_refptr<Layer> copy_child = Layer::Create();
6203 SetLayerPropertiesForTesting(copy_child.get(),
6204 identity_matrix,
6205 gfx::Point3F(),
6206 gfx::PointF(),
6207 gfx::Size(20, 20),
6208 true,
6209 false);
6210 copy_child->SetIsDrawable(true);
6211
6212 scoped_refptr<Layer> copy_grand_parent_sibling_before = Layer::Create();
6213 SetLayerPropertiesForTesting(copy_grand_parent_sibling_before.get(),
6214 identity_matrix,
6215 gfx::Point3F(),
6216 gfx::PointF(),
6217 gfx::Size(40, 40),
6218 true,
6219 false);
6220 copy_grand_parent_sibling_before->SetIsDrawable(true);
6221
6222 scoped_refptr<Layer> copy_grand_parent_sibling_after = Layer::Create();
6223 SetLayerPropertiesForTesting(copy_grand_parent_sibling_after.get(),
6224 identity_matrix,
6225 gfx::Point3F(),
6226 gfx::PointF(),
6227 gfx::Size(40, 40),
6228 true,
6229 false);
6230 copy_grand_parent_sibling_after->SetIsDrawable(true);
6231
6232 copy_layer->AddChild(copy_child);
6233 copy_parent->AddChild(copy_layer);
6234 copy_grand_parent->AddChild(copy_parent);
6235 root->AddChild(copy_grand_parent_sibling_before);
6236 root->AddChild(copy_grand_parent);
6237 root->AddChild(copy_grand_parent_sibling_after);
6238
6239 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
6240 host->SetRootLayer(root);
6241
6242 // Hide the copy_grand_parent and its subtree. But make a copy request in that
6243 // hidden subtree on copy_layer.
6244 copy_grand_parent->SetHideLayerAndSubtree(true);
6245 copy_grand_parent_sibling_before->SetHideLayerAndSubtree(true);
6246 copy_grand_parent_sibling_after->SetHideLayerAndSubtree(true);
6247 copy_layer->RequestCopyOfOutput(CopyOutputRequest::CreateRequest(
6248 base::Bind(&EmptyCopyOutputCallback)));
6249 EXPECT_TRUE(copy_layer->HasCopyRequest());
6250
6251 RenderSurfaceLayerList render_surface_layer_list;
6252 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
6253 root.get(), root->bounds(), &render_surface_layer_list);
6254 inputs.can_adjust_raster_scales = true;
6255 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
6256
6257 EXPECT_TRUE(root->draw_properties().layer_or_descendant_has_copy_request);
6258 EXPECT_TRUE(copy_grand_parent->draw_properties().
6259 layer_or_descendant_has_copy_request);
6260 EXPECT_TRUE(copy_parent->draw_properties().
6261 layer_or_descendant_has_copy_request);
6262 EXPECT_TRUE(copy_layer->draw_properties().
6263 layer_or_descendant_has_copy_request);
6264 EXPECT_FALSE(copy_child->draw_properties().
6265 layer_or_descendant_has_copy_request);
6266 EXPECT_FALSE(copy_grand_parent_sibling_before->draw_properties().
6267 layer_or_descendant_has_copy_request);
6268 EXPECT_FALSE(copy_grand_parent_sibling_after->draw_properties().
6269 layer_or_descendant_has_copy_request);
6270
6271 // We should have three render surfaces, one for the root, one for the parent
6272 // since it owns a surface, and one for the copy_layer.
6273 ASSERT_EQ(3u, render_surface_layer_list.size());
6274 EXPECT_EQ(root->id(), render_surface_layer_list.at(0)->id());
6275 EXPECT_EQ(copy_parent->id(), render_surface_layer_list.at(1)->id());
6276 EXPECT_EQ(copy_layer->id(), render_surface_layer_list.at(2)->id());
6277
6278 // The root render surface should have 2 contributing layers. The
6279 // copy_grand_parent is hidden along with its siblings, but the copy_parent
6280 // will appear since something in its subtree needs to be drawn for a copy
6281 // request.
6282 ASSERT_EQ(2u, root->render_surface()->layer_list().size());
6283 EXPECT_EQ(root->id(), root->render_surface()->layer_list().at(0)->id());
6284 EXPECT_EQ(copy_parent->id(),
6285 root->render_surface()->layer_list().at(1)->id());
6286
6287 // Nothing actually draws into the copy parent, so only the copy_layer will
6288 // appear in its list, since it needs to be drawn for the copy request.
6289 ASSERT_EQ(1u, copy_parent->render_surface()->layer_list().size());
6290 EXPECT_EQ(copy_layer->id(),
6291 copy_parent->render_surface()->layer_list().at(0)->id());
6292
6293 // The copy_layer's render surface should have two contributing layers.
6294 ASSERT_EQ(2u, copy_layer->render_surface()->layer_list().size());
6295 EXPECT_EQ(copy_layer->id(),
6296 copy_layer->render_surface()->layer_list().at(0)->id());
6297 EXPECT_EQ(copy_child->id(),
6298 copy_layer->render_surface()->layer_list().at(1)->id());
6299 }
6300
6301 TEST_F(LayerTreeHostCommonTest, ClippedOutCopyRequest) {
6302 FakeImplProxy proxy;
6303 TestSharedBitmapManager shared_bitmap_manager;
6304 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
6305 host_impl.CreatePendingTree();
6306 const gfx::Transform identity_matrix;
6307
6308 scoped_refptr<Layer> root = Layer::Create();
6309 SetLayerPropertiesForTesting(root.get(),
6310 identity_matrix,
6311 gfx::Point3F(),
6312 gfx::PointF(),
6313 gfx::Size(50, 50),
6314 true,
6315 false);
6316 root->SetIsDrawable(true);
6317
6318 scoped_refptr<Layer> copy_parent = Layer::Create();
6319 SetLayerPropertiesForTesting(copy_parent.get(),
6320 identity_matrix,
6321 gfx::Point3F(),
6322 gfx::PointF(),
6323 gfx::Size(),
6324 true,
6325 false);
6326 copy_parent->SetIsDrawable(true);
6327 copy_parent->SetMasksToBounds(true);
6328
6329 scoped_refptr<Layer> copy_layer = Layer::Create();
6330 SetLayerPropertiesForTesting(copy_layer.get(),
6331 identity_matrix,
6332 gfx::Point3F(),
6333 gfx::PointF(),
6334 gfx::Size(30, 30),
6335 true,
6336 false);
6337 copy_layer->SetIsDrawable(true);
6338
6339 scoped_refptr<Layer> copy_child = Layer::Create();
6340 SetLayerPropertiesForTesting(copy_child.get(),
6341 identity_matrix,
6342 gfx::Point3F(),
6343 gfx::PointF(),
6344 gfx::Size(20, 20),
6345 true,
6346 false);
6347 copy_child->SetIsDrawable(true);
6348
6349 copy_layer->AddChild(copy_child);
6350 copy_parent->AddChild(copy_layer);
6351 root->AddChild(copy_parent);
6352
6353 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
6354 host->SetRootLayer(root);
6355
6356 copy_layer->RequestCopyOfOutput(CopyOutputRequest::CreateRequest(
6357 base::Bind(&EmptyCopyOutputCallback)));
6358 EXPECT_TRUE(copy_layer->HasCopyRequest());
6359
6360 RenderSurfaceLayerList render_surface_layer_list;
6361 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
6362 root.get(), root->bounds(), &render_surface_layer_list);
6363 inputs.can_adjust_raster_scales = true;
6364 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
6365
6366 // We should have one render surface, as the others are clipped out.
6367 ASSERT_EQ(1u, render_surface_layer_list.size());
6368 EXPECT_EQ(root->id(), render_surface_layer_list.at(0)->id());
6369
6370 // The root render surface should only have 1 contributing layer, since the
6371 // other layers are empty/clipped away.
6372 ASSERT_EQ(1u, root->render_surface()->layer_list().size());
6373 EXPECT_EQ(root->id(), root->render_surface()->layer_list().at(0)->id());
6374 }
6375
6376 TEST_F(LayerTreeHostCommonTest, VisibleContentRectInsideSurface) {
6377 FakeImplProxy proxy;
6378 TestSharedBitmapManager shared_bitmap_manager;
6379 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
6380 host_impl.CreatePendingTree();
6381 const gfx::Transform identity_matrix;
6382
6383 scoped_refptr<Layer> root = Layer::Create();
6384 SetLayerPropertiesForTesting(root.get(),
6385 identity_matrix,
6386 gfx::Point3F(),
6387 gfx::PointF(),
6388 gfx::Size(50, 50),
6389 true,
6390 false);
6391 root->SetIsDrawable(true);
6392
6393 // The surface is moved slightly outside of the viewport.
6394 scoped_refptr<Layer> surface = Layer::Create();
6395 SetLayerPropertiesForTesting(surface.get(),
6396 identity_matrix,
6397 gfx::Point3F(),
6398 gfx::PointF(-10, -20),
6399 gfx::Size(),
6400 true,
6401 false);
6402 surface->SetForceRenderSurface(true);
6403
6404 scoped_refptr<Layer> surface_child = Layer::Create();
6405 SetLayerPropertiesForTesting(surface_child.get(),
6406 identity_matrix,
6407 gfx::Point3F(),
6408 gfx::PointF(),
6409 gfx::Size(50, 50),
6410 true,
6411 false);
6412 surface_child->SetIsDrawable(true);
6413
6414 surface->AddChild(surface_child);
6415 root->AddChild(surface);
6416
6417 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
6418 host->SetRootLayer(root);
6419
6420 RenderSurfaceLayerList render_surface_layer_list;
6421 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
6422 root.get(), root->bounds(), &render_surface_layer_list);
6423 inputs.can_adjust_raster_scales = true;
6424 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
6425
6426 // The visible_content_rect for the |surface_child| should not be clipped by
6427 // the viewport.
6428 EXPECT_EQ(gfx::Rect(50, 50).ToString(),
6429 surface_child->visible_content_rect().ToString());
6430 }
6431
6432 TEST_F(LayerTreeHostCommonTest, TransformedClipParent) {
6433 // Ensure that a transform between the layer and its render surface is not a
6434 // problem. Constructs the following layer tree.
6435 //
6436 // root (a render surface)
6437 // + render_surface
6438 // + clip_parent (scaled)
6439 // + intervening_clipping_layer
6440 // + clip_child
6441 //
6442 // The render surface should be resized correctly and the clip child should
6443 // inherit the right clip rect.
6444 scoped_refptr<Layer> root = Layer::Create();
6445 scoped_refptr<Layer> render_surface = Layer::Create();
6446 scoped_refptr<Layer> clip_parent = Layer::Create();
6447 scoped_refptr<Layer> intervening = Layer::Create();
6448 scoped_refptr<LayerWithForcedDrawsContent> clip_child =
6449 make_scoped_refptr(new LayerWithForcedDrawsContent);
6450
6451 root->AddChild(render_surface);
6452 render_surface->AddChild(clip_parent);
6453 clip_parent->AddChild(intervening);
6454 intervening->AddChild(clip_child);
6455
6456 clip_child->SetClipParent(clip_parent.get());
6457
6458 intervening->SetMasksToBounds(true);
6459 clip_parent->SetMasksToBounds(true);
6460
6461 render_surface->SetForceRenderSurface(true);
6462
6463 gfx::Transform scale_transform;
6464 scale_transform.Scale(2, 2);
6465
6466 gfx::Transform identity_transform;
6467
6468 SetLayerPropertiesForTesting(root.get(),
6469 identity_transform,
6470 gfx::Point3F(),
6471 gfx::PointF(),
6472 gfx::Size(50, 50),
6473 true,
6474 false);
6475 SetLayerPropertiesForTesting(render_surface.get(),
6476 identity_transform,
6477 gfx::Point3F(),
6478 gfx::PointF(),
6479 gfx::Size(10, 10),
6480 true,
6481 false);
6482 SetLayerPropertiesForTesting(clip_parent.get(),
6483 scale_transform,
6484 gfx::Point3F(),
6485 gfx::PointF(1.f, 1.f),
6486 gfx::Size(10, 10),
6487 true,
6488 false);
6489 SetLayerPropertiesForTesting(intervening.get(),
6490 identity_transform,
6491 gfx::Point3F(),
6492 gfx::PointF(1.f, 1.f),
6493 gfx::Size(5, 5),
6494 true,
6495 false);
6496 SetLayerPropertiesForTesting(clip_child.get(),
6497 identity_transform,
6498 gfx::Point3F(),
6499 gfx::PointF(1.f, 1.f),
6500 gfx::Size(10, 10),
6501 true,
6502 false);
6503
6504 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
6505 host->SetRootLayer(root);
6506
6507 ExecuteCalculateDrawProperties(root.get());
6508
6509 ASSERT_TRUE(root->render_surface());
6510 ASSERT_TRUE(render_surface->render_surface());
6511
6512 // Ensure that we've inherited our clip parent's clip and weren't affected
6513 // by the intervening clip layer.
6514 ASSERT_EQ(gfx::Rect(1, 1, 20, 20).ToString(),
6515 clip_parent->clip_rect().ToString());
6516 ASSERT_EQ(clip_parent->clip_rect().ToString(),
6517 clip_child->clip_rect().ToString());
6518 ASSERT_EQ(gfx::Rect(3, 3, 10, 10).ToString(),
6519 intervening->clip_rect().ToString());
6520
6521 // Ensure that the render surface reports a content rect that has been grown
6522 // to accomodate for the clip child.
6523 ASSERT_EQ(gfx::Rect(5, 5, 16, 16).ToString(),
6524 render_surface->render_surface()->content_rect().ToString());
6525
6526 // The above check implies the two below, but they nicely demonstrate that
6527 // we've grown, despite the intervening layer's clip.
6528 ASSERT_TRUE(clip_parent->clip_rect().Contains(
6529 render_surface->render_surface()->content_rect()));
6530 ASSERT_FALSE(intervening->clip_rect().Contains(
6531 render_surface->render_surface()->content_rect()));
6532 }
6533
6534 TEST_F(LayerTreeHostCommonTest, ClipParentWithInterveningRenderSurface) {
6535 // Ensure that intervening render surfaces are not a problem in the basic
6536 // case. In the following tree, both render surfaces should be resized to
6537 // accomodate for the clip child, despite an intervening clip.
6538 //
6539 // root (a render surface)
6540 // + clip_parent (masks to bounds)
6541 // + render_surface1 (sets opacity)
6542 // + intervening (masks to bounds)
6543 // + render_surface2 (also sets opacity)
6544 // + clip_child
6545 //
6546 scoped_refptr<Layer> root = Layer::Create();
6547 scoped_refptr<Layer> clip_parent = Layer::Create();
6548 scoped_refptr<Layer> render_surface1 = Layer::Create();
6549 scoped_refptr<Layer> intervening = Layer::Create();
6550 scoped_refptr<Layer> render_surface2 = Layer::Create();
6551 scoped_refptr<LayerWithForcedDrawsContent> clip_child =
6552 make_scoped_refptr(new LayerWithForcedDrawsContent);
6553
6554 root->AddChild(clip_parent);
6555 clip_parent->AddChild(render_surface1);
6556 render_surface1->AddChild(intervening);
6557 intervening->AddChild(render_surface2);
6558 render_surface2->AddChild(clip_child);
6559
6560 clip_child->SetClipParent(clip_parent.get());
6561
6562 intervening->SetMasksToBounds(true);
6563 clip_parent->SetMasksToBounds(true);
6564
6565 render_surface1->SetForceRenderSurface(true);
6566 render_surface2->SetForceRenderSurface(true);
6567
6568 gfx::Transform translation_transform;
6569 translation_transform.Translate(2, 2);
6570
6571 gfx::Transform identity_transform;
6572 SetLayerPropertiesForTesting(root.get(),
6573 identity_transform,
6574 gfx::Point3F(),
6575 gfx::PointF(),
6576 gfx::Size(50, 50),
6577 true,
6578 false);
6579 SetLayerPropertiesForTesting(clip_parent.get(),
6580 translation_transform,
6581 gfx::Point3F(),
6582 gfx::PointF(1.f, 1.f),
6583 gfx::Size(40, 40),
6584 true,
6585 false);
6586 SetLayerPropertiesForTesting(render_surface1.get(),
6587 identity_transform,
6588 gfx::Point3F(),
6589 gfx::PointF(),
6590 gfx::Size(10, 10),
6591 true,
6592 false);
6593 SetLayerPropertiesForTesting(intervening.get(),
6594 identity_transform,
6595 gfx::Point3F(),
6596 gfx::PointF(1.f, 1.f),
6597 gfx::Size(5, 5),
6598 true,
6599 false);
6600 SetLayerPropertiesForTesting(render_surface2.get(),
6601 identity_transform,
6602 gfx::Point3F(),
6603 gfx::PointF(),
6604 gfx::Size(10, 10),
6605 true,
6606 false);
6607 SetLayerPropertiesForTesting(clip_child.get(),
6608 identity_transform,
6609 gfx::Point3F(),
6610 gfx::PointF(-10.f, -10.f),
6611 gfx::Size(60, 60),
6612 true,
6613 false);
6614
6615 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
6616 host->SetRootLayer(root);
6617
6618 ExecuteCalculateDrawProperties(root.get());
6619
6620 EXPECT_TRUE(root->render_surface());
6621 EXPECT_TRUE(render_surface1->render_surface());
6622 EXPECT_TRUE(render_surface2->render_surface());
6623
6624 // Since the render surfaces could have expanded, they should not clip (their
6625 // bounds would no longer be reliable). We should resort to layer clipping
6626 // in this case.
6627 EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(),
6628 render_surface1->render_surface()->clip_rect().ToString());
6629 EXPECT_FALSE(render_surface1->render_surface()->is_clipped());
6630 EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(),
6631 render_surface2->render_surface()->clip_rect().ToString());
6632 EXPECT_FALSE(render_surface2->render_surface()->is_clipped());
6633
6634 // NB: clip rects are in target space.
6635 EXPECT_EQ(gfx::Rect(0, 0, 40, 40).ToString(),
6636 render_surface1->clip_rect().ToString());
6637 EXPECT_TRUE(render_surface1->is_clipped());
6638
6639 // This value is inherited from the clipping ancestor layer, 'intervening'.
6640 EXPECT_EQ(gfx::Rect(0, 0, 5, 5).ToString(),
6641 render_surface2->clip_rect().ToString());
6642 EXPECT_TRUE(render_surface2->is_clipped());
6643
6644 // The content rects of both render surfaces should both have expanded to
6645 // contain the clip child.
6646 EXPECT_EQ(gfx::Rect(0, 0, 40, 40).ToString(),
6647 render_surface1->render_surface()->content_rect().ToString());
6648 EXPECT_EQ(gfx::Rect(-1, -1, 40, 40).ToString(),
6649 render_surface2->render_surface()->content_rect().ToString());
6650
6651 // The clip child should have inherited the clip parent's clip (projected to
6652 // the right space, of course), and should have the correctly sized visible
6653 // content rect.
6654 EXPECT_EQ(gfx::Rect(-1, -1, 40, 40).ToString(),
6655 clip_child->clip_rect().ToString());
6656 EXPECT_EQ(gfx::Rect(9, 9, 40, 40).ToString(),
6657 clip_child->visible_content_rect().ToString());
6658 EXPECT_TRUE(clip_child->is_clipped());
6659 }
6660
6661 TEST_F(LayerTreeHostCommonTest, ClipParentScrolledInterveningLayer) {
6662 // Ensure that intervening render surfaces are not a problem, even if there
6663 // is a scroll involved. Note, we do _not_ have to consider any other sort
6664 // of transform.
6665 //
6666 // root (a render surface)
6667 // + clip_parent (masks to bounds)
6668 // + render_surface1 (sets opacity)
6669 // + intervening (masks to bounds AND scrolls)
6670 // + render_surface2 (also sets opacity)
6671 // + clip_child
6672 //
6673 scoped_refptr<Layer> root = Layer::Create();
6674 scoped_refptr<Layer> clip_parent = Layer::Create();
6675 scoped_refptr<Layer> render_surface1 = Layer::Create();
6676 scoped_refptr<Layer> intervening = Layer::Create();
6677 scoped_refptr<Layer> render_surface2 = Layer::Create();
6678 scoped_refptr<LayerWithForcedDrawsContent> clip_child =
6679 make_scoped_refptr(new LayerWithForcedDrawsContent);
6680
6681 root->AddChild(clip_parent);
6682 clip_parent->AddChild(render_surface1);
6683 render_surface1->AddChild(intervening);
6684 intervening->AddChild(render_surface2);
6685 render_surface2->AddChild(clip_child);
6686
6687 clip_child->SetClipParent(clip_parent.get());
6688
6689 intervening->SetMasksToBounds(true);
6690 clip_parent->SetMasksToBounds(true);
6691 intervening->SetScrollClipLayerId(clip_parent->id());
6692 intervening->SetScrollOffset(gfx::ScrollOffset(3, 3));
6693
6694 render_surface1->SetForceRenderSurface(true);
6695 render_surface2->SetForceRenderSurface(true);
6696
6697 gfx::Transform translation_transform;
6698 translation_transform.Translate(2, 2);
6699
6700 gfx::Transform identity_transform;
6701 SetLayerPropertiesForTesting(root.get(),
6702 identity_transform,
6703 gfx::Point3F(),
6704 gfx::PointF(),
6705 gfx::Size(50, 50),
6706 true,
6707 false);
6708 SetLayerPropertiesForTesting(clip_parent.get(),
6709 translation_transform,
6710 gfx::Point3F(),
6711 gfx::PointF(1.f, 1.f),
6712 gfx::Size(40, 40),
6713 true,
6714 false);
6715 SetLayerPropertiesForTesting(render_surface1.get(),
6716 identity_transform,
6717 gfx::Point3F(),
6718 gfx::PointF(),
6719 gfx::Size(10, 10),
6720 true,
6721 false);
6722 SetLayerPropertiesForTesting(intervening.get(),
6723 identity_transform,
6724 gfx::Point3F(),
6725 gfx::PointF(1.f, 1.f),
6726 gfx::Size(5, 5),
6727 true,
6728 false);
6729 SetLayerPropertiesForTesting(render_surface2.get(),
6730 identity_transform,
6731 gfx::Point3F(),
6732 gfx::PointF(),
6733 gfx::Size(10, 10),
6734 true,
6735 false);
6736 SetLayerPropertiesForTesting(clip_child.get(),
6737 identity_transform,
6738 gfx::Point3F(),
6739 gfx::PointF(-10.f, -10.f),
6740 gfx::Size(60, 60),
6741 true,
6742 false);
6743
6744 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
6745 host->SetRootLayer(root);
6746
6747 ExecuteCalculateDrawProperties(root.get());
6748
6749 EXPECT_TRUE(root->render_surface());
6750 EXPECT_TRUE(render_surface1->render_surface());
6751 EXPECT_TRUE(render_surface2->render_surface());
6752
6753 // Since the render surfaces could have expanded, they should not clip (their
6754 // bounds would no longer be reliable). We should resort to layer clipping
6755 // in this case.
6756 EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(),
6757 render_surface1->render_surface()->clip_rect().ToString());
6758 EXPECT_FALSE(render_surface1->render_surface()->is_clipped());
6759 EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(),
6760 render_surface2->render_surface()->clip_rect().ToString());
6761 EXPECT_FALSE(render_surface2->render_surface()->is_clipped());
6762
6763 // NB: clip rects are in target space.
6764 EXPECT_EQ(gfx::Rect(0, 0, 40, 40).ToString(),
6765 render_surface1->clip_rect().ToString());
6766 EXPECT_TRUE(render_surface1->is_clipped());
6767
6768 // This value is inherited from the clipping ancestor layer, 'intervening'.
6769 EXPECT_EQ(gfx::Rect(2, 2, 3, 3).ToString(),
6770 render_surface2->clip_rect().ToString());
6771 EXPECT_TRUE(render_surface2->is_clipped());
6772
6773 // The content rects of both render surfaces should both have expanded to
6774 // contain the clip child.
6775 EXPECT_EQ(gfx::Rect(0, 0, 40, 40).ToString(),
6776 render_surface1->render_surface()->content_rect().ToString());
6777 EXPECT_EQ(gfx::Rect(2, 2, 40, 40).ToString(),
6778 render_surface2->render_surface()->content_rect().ToString());
6779
6780 // The clip child should have inherited the clip parent's clip (projected to
6781 // the right space, of course), and should have the correctly sized visible
6782 // content rect.
6783 EXPECT_EQ(gfx::Rect(2, 2, 40, 40).ToString(),
6784 clip_child->clip_rect().ToString());
6785 EXPECT_EQ(gfx::Rect(12, 12, 40, 40).ToString(),
6786 clip_child->visible_content_rect().ToString());
6787 EXPECT_TRUE(clip_child->is_clipped());
6788 }
6789
6790 TEST_F(LayerTreeHostCommonTest, DescendantsOfClipChildren) {
6791 // Ensures that descendants of the clip child inherit the correct clip.
6792 //
6793 // root (a render surface)
6794 // + clip_parent (masks to bounds)
6795 // + intervening (masks to bounds)
6796 // + clip_child
6797 // + child
6798 //
6799 scoped_refptr<Layer> root = Layer::Create();
6800 scoped_refptr<Layer> clip_parent = Layer::Create();
6801 scoped_refptr<Layer> intervening = Layer::Create();
6802 scoped_refptr<Layer> clip_child = Layer::Create();
6803 scoped_refptr<LayerWithForcedDrawsContent> child =
6804 make_scoped_refptr(new LayerWithForcedDrawsContent);
6805
6806 root->AddChild(clip_parent);
6807 clip_parent->AddChild(intervening);
6808 intervening->AddChild(clip_child);
6809 clip_child->AddChild(child);
6810
6811 clip_child->SetClipParent(clip_parent.get());
6812
6813 intervening->SetMasksToBounds(true);
6814 clip_parent->SetMasksToBounds(true);
6815
6816 gfx::Transform identity_transform;
6817 SetLayerPropertiesForTesting(root.get(),
6818 identity_transform,
6819 gfx::Point3F(),
6820 gfx::PointF(),
6821 gfx::Size(50, 50),
6822 true,
6823 false);
6824 SetLayerPropertiesForTesting(clip_parent.get(),
6825 identity_transform,
6826 gfx::Point3F(),
6827 gfx::PointF(),
6828 gfx::Size(40, 40),
6829 true,
6830 false);
6831 SetLayerPropertiesForTesting(intervening.get(),
6832 identity_transform,
6833 gfx::Point3F(),
6834 gfx::PointF(),
6835 gfx::Size(5, 5),
6836 true,
6837 false);
6838 SetLayerPropertiesForTesting(clip_child.get(),
6839 identity_transform,
6840 gfx::Point3F(),
6841 gfx::PointF(),
6842 gfx::Size(60, 60),
6843 true,
6844 false);
6845 SetLayerPropertiesForTesting(child.get(),
6846 identity_transform,
6847 gfx::Point3F(),
6848 gfx::PointF(),
6849 gfx::Size(60, 60),
6850 true,
6851 false);
6852
6853 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
6854 host->SetRootLayer(root);
6855
6856 ExecuteCalculateDrawProperties(root.get());
6857
6858 EXPECT_TRUE(root->render_surface());
6859
6860 // Neither the clip child nor its descendant should have inherited the clip
6861 // from |intervening|.
6862 EXPECT_EQ(gfx::Rect(0, 0, 40, 40).ToString(),
6863 clip_child->clip_rect().ToString());
6864 EXPECT_TRUE(clip_child->is_clipped());
6865 EXPECT_EQ(gfx::Rect(0, 0, 40, 40).ToString(),
6866 child->visible_content_rect().ToString());
6867 EXPECT_TRUE(child->is_clipped());
6868 }
6869
6870 TEST_F(LayerTreeHostCommonTest,
6871 SurfacesShouldBeUnaffectedByNonDescendantClipChildren) {
6872 // Ensures that non-descendant clip children in the tree do not affect
6873 // render surfaces.
6874 //
6875 // root (a render surface)
6876 // + clip_parent (masks to bounds)
6877 // + render_surface1
6878 // + clip_child
6879 // + render_surface2
6880 // + non_clip_child
6881 //
6882 // In this example render_surface2 should be unaffected by clip_child.
6883 scoped_refptr<Layer> root = Layer::Create();
6884 scoped_refptr<Layer> clip_parent = Layer::Create();
6885 scoped_refptr<Layer> render_surface1 = Layer::Create();
6886 scoped_refptr<LayerWithForcedDrawsContent> clip_child =
6887 make_scoped_refptr(new LayerWithForcedDrawsContent);
6888 scoped_refptr<Layer> render_surface2 = Layer::Create();
6889 scoped_refptr<LayerWithForcedDrawsContent> non_clip_child =
6890 make_scoped_refptr(new LayerWithForcedDrawsContent);
6891
6892 root->AddChild(clip_parent);
6893 clip_parent->AddChild(render_surface1);
6894 render_surface1->AddChild(clip_child);
6895 clip_parent->AddChild(render_surface2);
6896 render_surface2->AddChild(non_clip_child);
6897
6898 clip_child->SetClipParent(clip_parent.get());
6899
6900 clip_parent->SetMasksToBounds(true);
6901 render_surface1->SetMasksToBounds(true);
6902
6903 gfx::Transform identity_transform;
6904 SetLayerPropertiesForTesting(root.get(),
6905 identity_transform,
6906 gfx::Point3F(),
6907 gfx::PointF(),
6908 gfx::Size(15, 15),
6909 true,
6910 false);
6911 SetLayerPropertiesForTesting(clip_parent.get(),
6912 identity_transform,
6913 gfx::Point3F(),
6914 gfx::PointF(),
6915 gfx::Size(10, 10),
6916 true,
6917 false);
6918 SetLayerPropertiesForTesting(render_surface1.get(),
6919 identity_transform,
6920 gfx::Point3F(),
6921 gfx::PointF(5, 5),
6922 gfx::Size(5, 5),
6923 true,
6924 false);
6925 SetLayerPropertiesForTesting(render_surface2.get(),
6926 identity_transform,
6927 gfx::Point3F(),
6928 gfx::PointF(),
6929 gfx::Size(5, 5),
6930 true,
6931 false);
6932 SetLayerPropertiesForTesting(clip_child.get(),
6933 identity_transform,
6934 gfx::Point3F(),
6935 gfx::PointF(-1, 1),
6936 gfx::Size(10, 10),
6937 true,
6938 false);
6939 SetLayerPropertiesForTesting(non_clip_child.get(),
6940 identity_transform,
6941 gfx::Point3F(),
6942 gfx::PointF(),
6943 gfx::Size(5, 5),
6944 true,
6945 false);
6946
6947 render_surface1->SetForceRenderSurface(true);
6948 render_surface2->SetForceRenderSurface(true);
6949
6950 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
6951 host->SetRootLayer(root);
6952
6953 ExecuteCalculateDrawProperties(root.get());
6954
6955 EXPECT_TRUE(root->render_surface());
6956 EXPECT_TRUE(render_surface1->render_surface());
6957 EXPECT_TRUE(render_surface2->render_surface());
6958
6959 EXPECT_EQ(gfx::Rect(0, 0, 5, 5).ToString(),
6960 render_surface1->clip_rect().ToString());
6961 EXPECT_TRUE(render_surface1->is_clipped());
6962
6963 // The render surface should not clip (it has unclipped descendants), instead
6964 // it should rely on layer clipping.
6965 EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(),
6966 render_surface1->render_surface()->clip_rect().ToString());
6967 EXPECT_FALSE(render_surface1->render_surface()->is_clipped());
6968
6969 // That said, it should have grown to accomodate the unclipped descendant.
6970 EXPECT_EQ(gfx::Rect(-1, 1, 6, 4).ToString(),
6971 render_surface1->render_surface()->content_rect().ToString());
6972
6973 // This render surface should clip. It has no unclipped descendants.
6974 EXPECT_EQ(gfx::Rect(0, 0, 5, 5).ToString(),
6975 render_surface2->clip_rect().ToString());
6976 EXPECT_TRUE(render_surface2->render_surface()->is_clipped());
6977
6978 // It also shouldn't have grown to accomodate the clip child.
6979 EXPECT_EQ(gfx::Rect(0, 0, 5, 5).ToString(),
6980 render_surface2->render_surface()->content_rect().ToString());
6981
6982 // Sanity check our num_unclipped_descendants values.
6983 EXPECT_EQ(1, render_surface1->num_unclipped_descendants());
6984 EXPECT_EQ(0, render_surface2->num_unclipped_descendants());
6985 }
6986
6987 TEST_F(LayerTreeHostCommonTest, CanRenderToSeparateSurface) {
6988 FakeImplProxy proxy;
6989 TestSharedBitmapManager shared_bitmap_manager;
6990 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
6991 scoped_ptr<LayerImpl> root =
6992 LayerImpl::Create(host_impl.active_tree(), 12345);
6993 scoped_ptr<LayerImpl> child1 =
6994 LayerImpl::Create(host_impl.active_tree(), 123456);
6995 scoped_ptr<LayerImpl> child2 =
6996 LayerImpl::Create(host_impl.active_tree(), 1234567);
6997 scoped_ptr<LayerImpl> child3 =
6998 LayerImpl::Create(host_impl.active_tree(), 12345678);
6999
7000 gfx::Transform identity_matrix;
7001 gfx::Point3F transform_origin;
7002 gfx::PointF position;
7003 gfx::Size bounds(100, 100);
7004 SetLayerPropertiesForTesting(root.get(), identity_matrix, transform_origin,
7005 position, bounds, true, false, true);
7006 root->SetDrawsContent(true);
7007
7008 // This layer structure normally forces render surface due to preserves3d
7009 // behavior.
7010 SetLayerPropertiesForTesting(child1.get(), identity_matrix, transform_origin,
7011 position, bounds, false, true, true);
7012 child1->SetDrawsContent(true);
7013 SetLayerPropertiesForTesting(child2.get(), identity_matrix, transform_origin,
7014 position, bounds, true, false, false);
7015 child2->SetDrawsContent(true);
7016 SetLayerPropertiesForTesting(child3.get(), identity_matrix, transform_origin,
7017 position, bounds, true, false, false);
7018 child3->SetDrawsContent(true);
7019
7020 child2->Set3dSortingContextId(1);
7021 child3->Set3dSortingContextId(1);
7022
7023 child2->AddChild(child3.Pass());
7024 child1->AddChild(child2.Pass());
7025 root->AddChild(child1.Pass());
7026
7027 {
7028 LayerImplList render_surface_layer_list;
7029 FakeLayerTreeHostImpl::RecursiveUpdateNumChildren(root.get());
7030 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
7031 root.get(), root->bounds(), &render_surface_layer_list);
7032 inputs.can_render_to_separate_surface = true;
7033 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
7034
7035 EXPECT_EQ(2u, render_surface_layer_list.size());
7036
7037 int count_represents_target_render_surface = 0;
7038 int count_represents_contributing_render_surface = 0;
7039 int count_represents_itself = 0;
7040 auto end = LayerIterator<LayerImpl>::End(&render_surface_layer_list);
7041 for (auto it = LayerIterator<LayerImpl>::Begin(&render_surface_layer_list);
7042 it != end; ++it) {
7043 if (it.represents_target_render_surface())
7044 count_represents_target_render_surface++;
7045 if (it.represents_contributing_render_surface())
7046 count_represents_contributing_render_surface++;
7047 if (it.represents_itself())
7048 count_represents_itself++;
7049 }
7050
7051 // Two render surfaces.
7052 EXPECT_EQ(2, count_represents_target_render_surface);
7053 // Second render surface contributes to root render surface.
7054 EXPECT_EQ(1, count_represents_contributing_render_surface);
7055 // All 4 layers represent itself.
7056 EXPECT_EQ(4, count_represents_itself);
7057 }
7058
7059 {
7060 LayerImplList render_surface_layer_list;
7061 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
7062 root.get(), root->bounds(), &render_surface_layer_list);
7063 inputs.can_render_to_separate_surface = false;
7064 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
7065
7066 EXPECT_EQ(1u, render_surface_layer_list.size());
7067
7068 int count_represents_target_render_surface = 0;
7069 int count_represents_contributing_render_surface = 0;
7070 int count_represents_itself = 0;
7071 auto end = LayerIterator<LayerImpl>::End(&render_surface_layer_list);
7072 for (auto it = LayerIterator<LayerImpl>::Begin(&render_surface_layer_list);
7073 it != end; ++it) {
7074 if (it.represents_target_render_surface())
7075 count_represents_target_render_surface++;
7076 if (it.represents_contributing_render_surface())
7077 count_represents_contributing_render_surface++;
7078 if (it.represents_itself())
7079 count_represents_itself++;
7080 }
7081
7082 // Only root layer has a render surface.
7083 EXPECT_EQ(1, count_represents_target_render_surface);
7084 // No layer contributes a render surface to root render surface.
7085 EXPECT_EQ(0, count_represents_contributing_render_surface);
7086 // All 4 layers represent itself.
7087 EXPECT_EQ(4, count_represents_itself);
7088 }
7089 }
7090
7091 TEST_F(LayerTreeHostCommonTest, DoNotIncludeBackfaceInvisibleSurfaces) {
7092 scoped_refptr<Layer> root = Layer::Create();
7093 scoped_refptr<Layer> render_surface = Layer::Create();
7094 scoped_refptr<LayerWithForcedDrawsContent> child =
7095 make_scoped_refptr(new LayerWithForcedDrawsContent);
7096
7097 root->AddChild(render_surface);
7098 render_surface->AddChild(child);
7099
7100 gfx::Transform identity_transform;
7101 SetLayerPropertiesForTesting(root.get(),
7102 identity_transform,
7103 gfx::Point3F(),
7104 gfx::PointF(),
7105 gfx::Size(50, 50),
7106 true,
7107 false);
7108 SetLayerPropertiesForTesting(render_surface.get(),
7109 identity_transform,
7110 gfx::Point3F(),
7111 gfx::PointF(),
7112 gfx::Size(30, 30),
7113 false,
7114 true);
7115 SetLayerPropertiesForTesting(child.get(),
7116 identity_transform,
7117 gfx::Point3F(),
7118 gfx::PointF(),
7119 gfx::Size(20, 20),
7120 true,
7121 false);
7122
7123 root->SetShouldFlattenTransform(false);
7124 root->Set3dSortingContextId(1);
7125 render_surface->SetDoubleSided(false);
7126 render_surface->SetForceRenderSurface(true);
7127
7128 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
7129 host->SetRootLayer(root);
7130
7131 ExecuteCalculateDrawProperties(root.get());
7132
7133 EXPECT_EQ(2u, render_surface_layer_list()->size());
7134 EXPECT_EQ(1u,
7135 render_surface_layer_list()->at(0)
7136 ->render_surface()->layer_list().size());
7137 EXPECT_EQ(1u,
7138 render_surface_layer_list()->at(1)
7139 ->render_surface()->layer_list().size());
7140
7141 gfx::Transform rotation_transform = identity_transform;
7142 rotation_transform.RotateAboutXAxis(180.0);
7143
7144 render_surface->SetTransform(rotation_transform);
7145
7146 ExecuteCalculateDrawProperties(root.get());
7147
7148 EXPECT_EQ(1u, render_surface_layer_list()->size());
7149 EXPECT_EQ(0u,
7150 render_surface_layer_list()->at(0)
7151 ->render_surface()->layer_list().size());
7152 }
7153
7154 TEST_F(LayerTreeHostCommonTest, ClippedByScrollParent) {
7155 // Checks that the simple case (being clipped by a scroll parent that would
7156 // have been processed before you anyhow) results in the right clips.
7157 //
7158 // + root
7159 // + scroll_parent_border
7160 // | + scroll_parent_clip
7161 // | + scroll_parent
7162 // + scroll_child
7163 //
7164 scoped_refptr<Layer> root = Layer::Create();
7165 scoped_refptr<Layer> scroll_parent_border = Layer::Create();
7166 scoped_refptr<Layer> scroll_parent_clip = Layer::Create();
7167 scoped_refptr<LayerWithForcedDrawsContent> scroll_parent =
7168 make_scoped_refptr(new LayerWithForcedDrawsContent);
7169 scoped_refptr<LayerWithForcedDrawsContent> scroll_child =
7170 make_scoped_refptr(new LayerWithForcedDrawsContent);
7171
7172 root->AddChild(scroll_child);
7173
7174 root->AddChild(scroll_parent_border);
7175 scroll_parent_border->AddChild(scroll_parent_clip);
7176 scroll_parent_clip->AddChild(scroll_parent);
7177
7178 scroll_parent_clip->SetMasksToBounds(true);
7179
7180 scroll_child->SetScrollParent(scroll_parent.get());
7181
7182 gfx::Transform identity_transform;
7183 SetLayerPropertiesForTesting(root.get(),
7184 identity_transform,
7185 gfx::Point3F(),
7186 gfx::PointF(),
7187 gfx::Size(50, 50),
7188 true,
7189 false);
7190 SetLayerPropertiesForTesting(scroll_parent_border.get(),
7191 identity_transform,
7192 gfx::Point3F(),
7193 gfx::PointF(),
7194 gfx::Size(40, 40),
7195 true,
7196 false);
7197 SetLayerPropertiesForTesting(scroll_parent_clip.get(),
7198 identity_transform,
7199 gfx::Point3F(),
7200 gfx::PointF(),
7201 gfx::Size(30, 30),
7202 true,
7203 false);
7204 SetLayerPropertiesForTesting(scroll_parent.get(),
7205 identity_transform,
7206 gfx::Point3F(),
7207 gfx::PointF(),
7208 gfx::Size(50, 50),
7209 true,
7210 false);
7211 SetLayerPropertiesForTesting(scroll_child.get(),
7212 identity_transform,
7213 gfx::Point3F(),
7214 gfx::PointF(),
7215 gfx::Size(50, 50),
7216 true,
7217 false);
7218
7219 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
7220 host->SetRootLayer(root);
7221
7222 ExecuteCalculateDrawProperties(root.get());
7223
7224 EXPECT_TRUE(root->render_surface());
7225
7226 EXPECT_EQ(gfx::Rect(0, 0, 30, 30).ToString(),
7227 scroll_child->clip_rect().ToString());
7228 EXPECT_TRUE(scroll_child->is_clipped());
7229 }
7230
7231 TEST_F(LayerTreeHostCommonTest, SingularTransformSubtreesDoNotDraw) {
7232 scoped_refptr<LayerWithForcedDrawsContent> root =
7233 make_scoped_refptr(new LayerWithForcedDrawsContent);
7234 scoped_refptr<LayerWithForcedDrawsContent> parent =
7235 make_scoped_refptr(new LayerWithForcedDrawsContent);
7236 scoped_refptr<LayerWithForcedDrawsContent> child =
7237 make_scoped_refptr(new LayerWithForcedDrawsContent);
7238
7239 root->AddChild(parent);
7240 parent->AddChild(child);
7241
7242 gfx::Transform identity_transform;
7243 SetLayerPropertiesForTesting(root.get(),
7244 identity_transform,
7245 gfx::Point3F(),
7246 gfx::PointF(),
7247 gfx::Size(50, 50),
7248 true,
7249 true);
7250 root->SetForceRenderSurface(true);
7251 SetLayerPropertiesForTesting(parent.get(),
7252 identity_transform,
7253 gfx::Point3F(),
7254 gfx::PointF(),
7255 gfx::Size(30, 30),
7256 true,
7257 true);
7258 parent->SetForceRenderSurface(true);
7259 SetLayerPropertiesForTesting(child.get(),
7260 identity_transform,
7261 gfx::Point3F(),
7262 gfx::PointF(),
7263 gfx::Size(20, 20),
7264 true,
7265 true);
7266 child->SetForceRenderSurface(true);
7267
7268 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
7269 host->SetRootLayer(root);
7270
7271 ExecuteCalculateDrawProperties(root.get());
7272
7273 EXPECT_EQ(3u, render_surface_layer_list()->size());
7274
7275 gfx::Transform singular_transform;
7276 singular_transform.Scale3d(
7277 SkDoubleToMScalar(1.0), SkDoubleToMScalar(1.0), SkDoubleToMScalar(0.0));
7278
7279 child->SetTransform(singular_transform);
7280
7281 ExecuteCalculateDrawProperties(root.get());
7282
7283 EXPECT_EQ(2u, render_surface_layer_list()->size());
7284
7285 // Ensure that the entire subtree under a layer with singular transform does
7286 // not get rendered.
7287 parent->SetTransform(singular_transform);
7288 child->SetTransform(identity_transform);
7289
7290 ExecuteCalculateDrawProperties(root.get());
7291
7292 EXPECT_EQ(1u, render_surface_layer_list()->size());
7293 }
7294
7295 TEST_F(LayerTreeHostCommonTest, ClippedByOutOfOrderScrollParent) {
7296 // Checks that clipping by a scroll parent that follows you in paint order
7297 // still results in correct clipping.
7298 //
7299 // + root
7300 // + scroll_child
7301 // + scroll_parent_border
7302 // + scroll_parent_clip
7303 // + scroll_parent
7304 //
7305 scoped_refptr<Layer> root = Layer::Create();
7306 scoped_refptr<Layer> scroll_parent_border = Layer::Create();
7307 scoped_refptr<Layer> scroll_parent_clip = Layer::Create();
7308 scoped_refptr<LayerWithForcedDrawsContent> scroll_parent =
7309 make_scoped_refptr(new LayerWithForcedDrawsContent);
7310 scoped_refptr<LayerWithForcedDrawsContent> scroll_child =
7311 make_scoped_refptr(new LayerWithForcedDrawsContent);
7312
7313 root->AddChild(scroll_parent_border);
7314 scroll_parent_border->AddChild(scroll_parent_clip);
7315 scroll_parent_clip->AddChild(scroll_parent);
7316
7317 root->AddChild(scroll_child);
7318
7319 scroll_parent_clip->SetMasksToBounds(true);
7320
7321 scroll_child->SetScrollParent(scroll_parent.get());
7322
7323 gfx::Transform identity_transform;
7324 SetLayerPropertiesForTesting(root.get(),
7325 identity_transform,
7326 gfx::Point3F(),
7327 gfx::PointF(),
7328 gfx::Size(50, 50),
7329 true,
7330 false);
7331 SetLayerPropertiesForTesting(scroll_parent_border.get(),
7332 identity_transform,
7333 gfx::Point3F(),
7334 gfx::PointF(),
7335 gfx::Size(40, 40),
7336 true,
7337 false);
7338 SetLayerPropertiesForTesting(scroll_parent_clip.get(),
7339 identity_transform,
7340 gfx::Point3F(),
7341 gfx::PointF(),
7342 gfx::Size(30, 30),
7343 true,
7344 false);
7345 SetLayerPropertiesForTesting(scroll_parent.get(),
7346 identity_transform,
7347 gfx::Point3F(),
7348 gfx::PointF(),
7349 gfx::Size(50, 50),
7350 true,
7351 false);
7352 SetLayerPropertiesForTesting(scroll_child.get(),
7353 identity_transform,
7354 gfx::Point3F(),
7355 gfx::PointF(),
7356 gfx::Size(50, 50),
7357 true,
7358 false);
7359
7360 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
7361 host->SetRootLayer(root);
7362
7363 ExecuteCalculateDrawProperties(root.get());
7364
7365 EXPECT_TRUE(root->render_surface());
7366
7367 EXPECT_EQ(gfx::Rect(0, 0, 30, 30).ToString(),
7368 scroll_child->clip_rect().ToString());
7369 EXPECT_TRUE(scroll_child->is_clipped());
7370 }
7371
7372 TEST_F(LayerTreeHostCommonTest, ClippedByOutOfOrderScrollGrandparent) {
7373 // Checks that clipping by a scroll parent and scroll grandparent that follow
7374 // you in paint order still results in correct clipping.
7375 //
7376 // + root
7377 // + scroll_child
7378 // + scroll_parent_border
7379 // | + scroll_parent_clip
7380 // | + scroll_parent
7381 // + scroll_grandparent_border
7382 // + scroll_grandparent_clip
7383 // + scroll_grandparent
7384 //
7385 scoped_refptr<Layer> root = Layer::Create();
7386 scoped_refptr<Layer> scroll_parent_border = Layer::Create();
7387 scoped_refptr<Layer> scroll_parent_clip = Layer::Create();
7388 scoped_refptr<LayerWithForcedDrawsContent> scroll_parent =
7389 make_scoped_refptr(new LayerWithForcedDrawsContent);
7390
7391 scoped_refptr<Layer> scroll_grandparent_border = Layer::Create();
7392 scoped_refptr<Layer> scroll_grandparent_clip = Layer::Create();
7393 scoped_refptr<LayerWithForcedDrawsContent> scroll_grandparent =
7394 make_scoped_refptr(new LayerWithForcedDrawsContent);
7395
7396 scoped_refptr<LayerWithForcedDrawsContent> scroll_child =
7397 make_scoped_refptr(new LayerWithForcedDrawsContent);
7398
7399 root->AddChild(scroll_child);
7400
7401 root->AddChild(scroll_parent_border);
7402 scroll_parent_border->AddChild(scroll_parent_clip);
7403 scroll_parent_clip->AddChild(scroll_parent);
7404
7405 root->AddChild(scroll_grandparent_border);
7406 scroll_grandparent_border->AddChild(scroll_grandparent_clip);
7407 scroll_grandparent_clip->AddChild(scroll_grandparent);
7408
7409 scroll_parent_clip->SetMasksToBounds(true);
7410 scroll_grandparent_clip->SetMasksToBounds(true);
7411
7412 scroll_child->SetScrollParent(scroll_parent.get());
7413 scroll_parent_border->SetScrollParent(scroll_grandparent.get());
7414
7415 gfx::Transform identity_transform;
7416 SetLayerPropertiesForTesting(root.get(),
7417 identity_transform,
7418 gfx::Point3F(),
7419 gfx::PointF(),
7420 gfx::Size(50, 50),
7421 true,
7422 false);
7423 SetLayerPropertiesForTesting(scroll_grandparent_border.get(),
7424 identity_transform,
7425 gfx::Point3F(),
7426 gfx::PointF(),
7427 gfx::Size(40, 40),
7428 true,
7429 false);
7430 SetLayerPropertiesForTesting(scroll_grandparent_clip.get(),
7431 identity_transform,
7432 gfx::Point3F(),
7433 gfx::PointF(),
7434 gfx::Size(20, 20),
7435 true,
7436 false);
7437 SetLayerPropertiesForTesting(scroll_grandparent.get(),
7438 identity_transform,
7439 gfx::Point3F(),
7440 gfx::PointF(),
7441 gfx::Size(50, 50),
7442 true,
7443 false);
7444 SetLayerPropertiesForTesting(scroll_parent_border.get(),
7445 identity_transform,
7446 gfx::Point3F(),
7447 gfx::PointF(),
7448 gfx::Size(40, 40),
7449 true,
7450 false);
7451 SetLayerPropertiesForTesting(scroll_parent_clip.get(),
7452 identity_transform,
7453 gfx::Point3F(),
7454 gfx::PointF(),
7455 gfx::Size(30, 30),
7456 true,
7457 false);
7458 SetLayerPropertiesForTesting(scroll_parent.get(),
7459 identity_transform,
7460 gfx::Point3F(),
7461 gfx::PointF(),
7462 gfx::Size(50, 50),
7463 true,
7464 false);
7465 SetLayerPropertiesForTesting(scroll_child.get(),
7466 identity_transform,
7467 gfx::Point3F(),
7468 gfx::PointF(),
7469 gfx::Size(50, 50),
7470 true,
7471 false);
7472
7473 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
7474 host->SetRootLayer(root);
7475
7476 ExecuteCalculateDrawProperties(root.get());
7477
7478 EXPECT_TRUE(root->render_surface());
7479
7480 EXPECT_EQ(gfx::Rect(0, 0, 20, 20).ToString(),
7481 scroll_child->clip_rect().ToString());
7482 EXPECT_TRUE(scroll_child->is_clipped());
7483
7484 // Despite the fact that we visited the above layers out of order to get the
7485 // correct clip, the layer lists should be unaffected.
7486 EXPECT_EQ(3u, root->render_surface()->layer_list().size());
7487 EXPECT_EQ(scroll_child.get(),
7488 root->render_surface()->layer_list().at(0).get());
7489 EXPECT_EQ(scroll_parent.get(),
7490 root->render_surface()->layer_list().at(1).get());
7491 EXPECT_EQ(scroll_grandparent.get(),
7492 root->render_surface()->layer_list().at(2).get());
7493 }
7494
7495 TEST_F(LayerTreeHostCommonTest, OutOfOrderClippingRequiresRSLLSorting) {
7496 // Ensures that even if we visit layers out of order, we still produce a
7497 // correctly ordered render surface layer list.
7498 // + root
7499 // + scroll_child
7500 // + scroll_parent_border
7501 // + scroll_parent_clip
7502 // + scroll_parent
7503 // + render_surface1
7504 // + scroll_grandparent_border
7505 // + scroll_grandparent_clip
7506 // + scroll_grandparent
7507 // + render_surface2
7508 //
7509 scoped_refptr<LayerWithForcedDrawsContent> root =
7510 make_scoped_refptr(new LayerWithForcedDrawsContent);
7511
7512 scoped_refptr<Layer> scroll_parent_border = Layer::Create();
7513 scoped_refptr<Layer> scroll_parent_clip = Layer::Create();
7514 scoped_refptr<LayerWithForcedDrawsContent> scroll_parent =
7515 make_scoped_refptr(new LayerWithForcedDrawsContent);
7516 scoped_refptr<LayerWithForcedDrawsContent> render_surface1 =
7517 make_scoped_refptr(new LayerWithForcedDrawsContent);
7518
7519 scoped_refptr<Layer> scroll_grandparent_border = Layer::Create();
7520 scoped_refptr<Layer> scroll_grandparent_clip = Layer::Create();
7521 scoped_refptr<LayerWithForcedDrawsContent> scroll_grandparent =
7522 make_scoped_refptr(new LayerWithForcedDrawsContent);
7523 scoped_refptr<LayerWithForcedDrawsContent> render_surface2 =
7524 make_scoped_refptr(new LayerWithForcedDrawsContent);
7525
7526 scoped_refptr<LayerWithForcedDrawsContent> scroll_child =
7527 make_scoped_refptr(new LayerWithForcedDrawsContent);
7528
7529 root->AddChild(scroll_child);
7530
7531 root->AddChild(scroll_parent_border);
7532 scroll_parent_border->AddChild(scroll_parent_clip);
7533 scroll_parent_clip->AddChild(scroll_parent);
7534 scroll_parent->AddChild(render_surface2);
7535
7536 root->AddChild(scroll_grandparent_border);
7537 scroll_grandparent_border->AddChild(scroll_grandparent_clip);
7538 scroll_grandparent_clip->AddChild(scroll_grandparent);
7539 scroll_grandparent->AddChild(render_surface1);
7540
7541 scroll_parent_clip->SetMasksToBounds(true);
7542 scroll_grandparent_clip->SetMasksToBounds(true);
7543
7544 scroll_child->SetScrollParent(scroll_parent.get());
7545 scroll_parent_border->SetScrollParent(scroll_grandparent.get());
7546
7547 render_surface1->SetForceRenderSurface(true);
7548 render_surface2->SetForceRenderSurface(true);
7549
7550 gfx::Transform identity_transform;
7551 SetLayerPropertiesForTesting(root.get(),
7552 identity_transform,
7553 gfx::Point3F(),
7554 gfx::PointF(),
7555 gfx::Size(50, 50),
7556 true,
7557 false);
7558 SetLayerPropertiesForTesting(scroll_grandparent_border.get(),
7559 identity_transform,
7560 gfx::Point3F(),
7561 gfx::PointF(),
7562 gfx::Size(40, 40),
7563 true,
7564 false);
7565 SetLayerPropertiesForTesting(scroll_grandparent_clip.get(),
7566 identity_transform,
7567 gfx::Point3F(),
7568 gfx::PointF(),
7569 gfx::Size(20, 20),
7570 true,
7571 false);
7572 SetLayerPropertiesForTesting(scroll_grandparent.get(),
7573 identity_transform,
7574 gfx::Point3F(),
7575 gfx::PointF(),
7576 gfx::Size(50, 50),
7577 true,
7578 false);
7579 SetLayerPropertiesForTesting(render_surface1.get(),
7580 identity_transform,
7581 gfx::Point3F(),
7582 gfx::PointF(),
7583 gfx::Size(50, 50),
7584 true,
7585 false);
7586 SetLayerPropertiesForTesting(scroll_parent_border.get(),
7587 identity_transform,
7588 gfx::Point3F(),
7589 gfx::PointF(),
7590 gfx::Size(40, 40),
7591 true,
7592 false);
7593 SetLayerPropertiesForTesting(scroll_parent_clip.get(),
7594 identity_transform,
7595 gfx::Point3F(),
7596 gfx::PointF(),
7597 gfx::Size(30, 30),
7598 true,
7599 false);
7600 SetLayerPropertiesForTesting(scroll_parent.get(),
7601 identity_transform,
7602 gfx::Point3F(),
7603 gfx::PointF(),
7604 gfx::Size(50, 50),
7605 true,
7606 false);
7607 SetLayerPropertiesForTesting(render_surface2.get(),
7608 identity_transform,
7609 gfx::Point3F(),
7610 gfx::PointF(),
7611 gfx::Size(50, 50),
7612 true,
7613 false);
7614 SetLayerPropertiesForTesting(scroll_child.get(),
7615 identity_transform,
7616 gfx::Point3F(),
7617 gfx::PointF(),
7618 gfx::Size(50, 50),
7619 true,
7620 false);
7621
7622 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
7623 host->SetRootLayer(root);
7624
7625 RenderSurfaceLayerList render_surface_layer_list;
7626 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
7627 root.get(),
7628 root->bounds(),
7629 identity_transform,
7630 &render_surface_layer_list);
7631
7632 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
7633
7634 EXPECT_TRUE(root->render_surface());
7635
7636 EXPECT_EQ(gfx::Rect(0, 0, 20, 20).ToString(),
7637 scroll_child->clip_rect().ToString());
7638 EXPECT_TRUE(scroll_child->is_clipped());
7639
7640 // Despite the fact that we had to process the layers out of order to get the
7641 // right clip, our render_surface_layer_list's order should be unaffected.
7642 EXPECT_EQ(3u, render_surface_layer_list.size());
7643 EXPECT_EQ(root.get(), render_surface_layer_list.at(0));
7644 EXPECT_EQ(render_surface2.get(), render_surface_layer_list.at(1));
7645 EXPECT_EQ(render_surface1.get(), render_surface_layer_list.at(2));
7646 EXPECT_TRUE(render_surface_layer_list.at(0)->render_surface());
7647 EXPECT_TRUE(render_surface_layer_list.at(1)->render_surface());
7648 EXPECT_TRUE(render_surface_layer_list.at(2)->render_surface());
7649 }
7650
7651 TEST_F(LayerTreeHostCommonTest, FixedPositionWithInterveningRenderSurface) {
7652 // Ensures that when we have a render surface between a fixed position layer
7653 // and its container, we compute the fixed position layer's draw transform
7654 // with respect to that intervening render surface, not with respect to its
7655 // container's render target.
7656 //
7657 // + root
7658 // + render_surface
7659 // + fixed
7660 //
7661 scoped_refptr<Layer> root = Layer::Create();
7662 scoped_refptr<LayerWithForcedDrawsContent> render_surface =
7663 make_scoped_refptr(new LayerWithForcedDrawsContent());
7664 scoped_refptr<LayerWithForcedDrawsContent> fixed =
7665 make_scoped_refptr(new LayerWithForcedDrawsContent());
7666
7667 root->AddChild(render_surface);
7668 render_surface->AddChild(fixed);
7669
7670 root->SetIsContainerForFixedPositionLayers(true);
7671 render_surface->SetForceRenderSurface(true);
7672
7673 LayerPositionConstraint constraint;
7674 constraint.set_is_fixed_position(true);
7675 fixed->SetPositionConstraint(constraint);
7676
7677 SetLayerPropertiesForTesting(root.get(), gfx::Transform(), gfx::Point3F(),
7678 gfx::PointF(), gfx::Size(50, 50), true, false);
7679 SetLayerPropertiesForTesting(render_surface.get(), gfx::Transform(),
7680 gfx::Point3F(), gfx::PointF(7.f, 9.f),
7681 gfx::Size(50, 50), true, false);
7682 SetLayerPropertiesForTesting(fixed.get(), gfx::Transform(), gfx::Point3F(),
7683 gfx::PointF(10.f, 15.f), gfx::Size(50, 50), true,
7684 false);
7685
7686 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
7687 host->SetRootLayer(root);
7688
7689 ExecuteCalculateDrawProperties(root.get());
7690
7691 gfx::Transform expected_draw_transform;
7692 expected_draw_transform.Translate(10.f, 15.f);
7693 EXPECT_EQ(expected_draw_transform, fixed->draw_transform());
7694
7695 gfx::Transform expected_screen_space_transform;
7696 expected_screen_space_transform.Translate(17.f, 24.f);
7697 EXPECT_EQ(expected_screen_space_transform, fixed->screen_space_transform());
7698 }
7699
7700 TEST_F(LayerTreeHostCommonTest, ScrollCompensationWithRounding) {
7701 // This test verifies that a scrolling layer that gets snapped to
7702 // integer coordinates doesn't move a fixed position child.
7703 //
7704 // + root
7705 // + container
7706 // + scroller
7707 // + fixed
7708 //
7709 FakeImplProxy proxy;
7710 TestSharedBitmapManager shared_bitmap_manager;
7711 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
7712 host_impl.CreatePendingTree();
7713 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.active_tree(), 1);
7714 scoped_ptr<LayerImpl> container =
7715 LayerImpl::Create(host_impl.active_tree(), 2);
7716 LayerImpl* container_layer = container.get();
7717 scoped_ptr<LayerImpl> scroller =
7718 LayerImpl::Create(host_impl.active_tree(), 3);
7719 LayerImpl* scroll_layer = scroller.get();
7720 scoped_ptr<LayerImpl> fixed = LayerImpl::Create(host_impl.active_tree(), 4);
7721 LayerImpl* fixed_layer = fixed.get();
7722
7723 container->SetIsContainerForFixedPositionLayers(true);
7724
7725 LayerPositionConstraint constraint;
7726 constraint.set_is_fixed_position(true);
7727 fixed->SetPositionConstraint(constraint);
7728
7729 scroller->SetScrollClipLayer(container->id());
7730
7731 gfx::Transform identity_transform;
7732 gfx::Transform container_transform;
7733 container_transform.Translate3d(10.0, 20.0, 0.0);
7734 gfx::Vector2dF container_offset = container_transform.To2dTranslation();
7735
7736 SetLayerPropertiesForTesting(root.get(), identity_transform, gfx::Point3F(),
7737 gfx::PointF(), gfx::Size(50, 50), true, false,
7738 true);
7739 SetLayerPropertiesForTesting(container.get(), container_transform,
7740 gfx::Point3F(), gfx::PointF(), gfx::Size(40, 40),
7741 true, false, false);
7742 SetLayerPropertiesForTesting(scroller.get(), identity_transform,
7743 gfx::Point3F(), gfx::PointF(), gfx::Size(30, 30),
7744 true, false, false);
7745 SetLayerPropertiesForTesting(fixed.get(), identity_transform, gfx::Point3F(),
7746 gfx::PointF(), gfx::Size(50, 50), true, false,
7747 false);
7748
7749 scroller->AddChild(fixed.Pass());
7750 container->AddChild(scroller.Pass());
7751 root->AddChild(container.Pass());
7752
7753 // Rounded to integers already.
7754 {
7755 gfx::Vector2dF scroll_delta(3.0, 5.0);
7756 scroll_layer->SetScrollDelta(scroll_delta);
7757
7758 LayerImplList render_surface_layer_list;
7759 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
7760 root.get(), root->bounds(), &render_surface_layer_list);
7761 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
7762
7763 EXPECT_TRANSFORMATION_MATRIX_EQ(
7764 container_layer->draw_properties().screen_space_transform,
7765 fixed_layer->draw_properties().screen_space_transform);
7766 EXPECT_VECTOR_EQ(
7767 fixed_layer->draw_properties().screen_space_transform.To2dTranslation(),
7768 container_offset);
7769 EXPECT_VECTOR_EQ(scroll_layer->draw_properties()
7770 .screen_space_transform.To2dTranslation(),
7771 container_offset - scroll_delta);
7772 }
7773
7774 // Scroll delta requiring rounding.
7775 {
7776 gfx::Vector2dF scroll_delta(4.1f, 8.1f);
7777 scroll_layer->SetScrollDelta(scroll_delta);
7778
7779 gfx::Vector2dF rounded_scroll_delta(4.f, 8.f);
7780
7781 LayerImplList render_surface_layer_list;
7782 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
7783 root.get(), root->bounds(), &render_surface_layer_list);
7784 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
7785
7786 EXPECT_TRANSFORMATION_MATRIX_EQ(
7787 container_layer->draw_properties().screen_space_transform,
7788 fixed_layer->draw_properties().screen_space_transform);
7789 EXPECT_VECTOR_EQ(
7790 fixed_layer->draw_properties().screen_space_transform.To2dTranslation(),
7791 container_offset);
7792 EXPECT_VECTOR_EQ(scroll_layer->draw_properties()
7793 .screen_space_transform.To2dTranslation(),
7794 container_offset - rounded_scroll_delta);
7795 }
7796
7797 // Scale is applied earlier in the tree.
7798 {
7799 gfx::Transform scaled_container_transform = container_transform;
7800 scaled_container_transform.Scale3d(3.0, 3.0, 1.0);
7801 container_layer->SetTransform(scaled_container_transform);
7802
7803 gfx::Vector2dF scroll_delta(4.5f, 8.5f);
7804 scroll_layer->SetScrollDelta(scroll_delta);
7805
7806 LayerImplList render_surface_layer_list;
7807 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
7808 root.get(), root->bounds(), &render_surface_layer_list);
7809 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
7810
7811 EXPECT_TRANSFORMATION_MATRIX_EQ(
7812 container_layer->draw_properties().screen_space_transform,
7813 fixed_layer->draw_properties().screen_space_transform);
7814 EXPECT_VECTOR_EQ(
7815 fixed_layer->draw_properties().screen_space_transform.To2dTranslation(),
7816 container_offset);
7817
7818 container_layer->SetTransform(container_transform);
7819 }
7820
7821 // Scale is applied on the scroll layer itself.
7822 {
7823 gfx::Transform scale_transform;
7824 scale_transform.Scale3d(3.0, 3.0, 1.0);
7825 scroll_layer->SetTransform(scale_transform);
7826
7827 gfx::Vector2dF scroll_delta(4.5f, 8.5f);
7828 scroll_layer->SetScrollDelta(scroll_delta);
7829
7830 LayerImplList render_surface_layer_list;
7831 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
7832 root.get(), root->bounds(), &render_surface_layer_list);
7833 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
7834
7835 EXPECT_VECTOR_EQ(
7836 fixed_layer->draw_properties().screen_space_transform.To2dTranslation(),
7837 container_offset);
7838
7839 scroll_layer->SetTransform(identity_transform);
7840 }
7841 }
7842
7843 TEST_F(LayerTreeHostCommonTest,
7844 ScrollCompensationMainScrollOffsetFractionalPart) {
7845 // This test verifies that a scrolling layer that has fractional scroll offset
7846 // from main doesn't move a fixed position child.
7847 //
7848 // + root
7849 // + container
7850 // + scroller
7851 // + fixed
7852 //
7853 FakeImplProxy proxy;
7854 TestSharedBitmapManager shared_bitmap_manager;
7855 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
7856 host_impl.CreatePendingTree();
7857 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.active_tree(), 1);
7858 scoped_ptr<LayerImpl> container =
7859 LayerImpl::Create(host_impl.active_tree(), 2);
7860 LayerImpl* container_layer = container.get();
7861 scoped_ptr<LayerImpl> scroller =
7862 LayerImpl::Create(host_impl.active_tree(), 3);
7863 LayerImpl* scroll_layer = scroller.get();
7864 scoped_ptr<LayerImpl> fixed = LayerImpl::Create(host_impl.active_tree(), 4);
7865 LayerImpl* fixed_layer = fixed.get();
7866
7867 container->SetIsContainerForFixedPositionLayers(true);
7868
7869 LayerPositionConstraint constraint;
7870 constraint.set_is_fixed_position(true);
7871 fixed->SetPositionConstraint(constraint);
7872
7873 scroller->SetScrollClipLayer(container->id());
7874
7875 gfx::Transform identity_transform;
7876 gfx::Transform container_transform;
7877 container_transform.Translate3d(10.0, 20.0, 0.0);
7878 gfx::Vector2dF container_offset = container_transform.To2dTranslation();
7879
7880 SetLayerPropertiesForTesting(root.get(), identity_transform, gfx::Point3F(),
7881 gfx::PointF(), gfx::Size(50, 50), true, false,
7882 true);
7883 SetLayerPropertiesForTesting(container.get(), container_transform,
7884 gfx::Point3F(), gfx::PointF(), gfx::Size(40, 40),
7885 true, false, false);
7886 SetLayerPropertiesForTesting(scroller.get(), identity_transform,
7887 gfx::Point3F(), gfx::PointF(0.0, 0.0),
7888 gfx::Size(30, 30), true, false, false);
7889
7890 gfx::ScrollOffset scroll_offset(3.3, 4.2);
7891 gfx::Vector2dF main_scroll_fractional_part(0.3f, 0.2f);
7892 gfx::Vector2dF scroll_delta(0.1f, 0.4f);
7893 // Blink only uses the integer part of the scroll_offset for fixed
7894 // position layer.
7895 SetLayerPropertiesForTesting(fixed.get(), identity_transform, gfx::Point3F(),
7896 gfx::PointF(3.0f, 4.0f), gfx::Size(50, 50), true,
7897 false, false);
7898 scroll_layer->PushScrollOffsetFromMainThread(scroll_offset);
7899 scroll_layer->SetScrollDelta(scroll_delta);
7900 scroll_layer->SetScrollCompensationAdjustment(main_scroll_fractional_part);
7901
7902 scroller->AddChild(fixed.Pass());
7903 container->AddChild(scroller.Pass());
7904 root->AddChild(container.Pass());
7905
7906 LayerImplList render_surface_layer_list;
7907 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
7908 root.get(), root->bounds(), &render_surface_layer_list);
7909 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
7910
7911 EXPECT_TRANSFORMATION_MATRIX_EQ(
7912 container_layer->draw_properties().screen_space_transform,
7913 fixed_layer->draw_properties().screen_space_transform);
7914 EXPECT_VECTOR_EQ(
7915 fixed_layer->draw_properties().screen_space_transform.To2dTranslation(),
7916 container_offset);
7917
7918 gfx::ScrollOffset effective_scroll_offset =
7919 ScrollOffsetWithDelta(scroll_offset, scroll_delta);
7920 gfx::Vector2d rounded_effective_scroll_offset =
7921 ToRoundedVector2d(ScrollOffsetToVector2dF(effective_scroll_offset));
7922 EXPECT_VECTOR_EQ(
7923 scroll_layer->draw_properties().screen_space_transform.To2dTranslation(),
7924 container_offset - rounded_effective_scroll_offset);
7925 }
7926
7927 class AnimationScaleFactorTrackingLayerImpl : public LayerImpl {
7928 public:
7929 static scoped_ptr<AnimationScaleFactorTrackingLayerImpl> Create(
7930 LayerTreeImpl* tree_impl,
7931 int id) {
7932 return make_scoped_ptr(
7933 new AnimationScaleFactorTrackingLayerImpl(tree_impl, id));
7934 }
7935
7936 ~AnimationScaleFactorTrackingLayerImpl() override {}
7937
7938 private:
7939 explicit AnimationScaleFactorTrackingLayerImpl(LayerTreeImpl* tree_impl,
7940 int id)
7941 : LayerImpl(tree_impl, id) {
7942 SetDrawsContent(true);
7943 }
7944 };
7945
7946 TEST_F(LayerTreeHostCommonTest, MaximumAnimationScaleFactor) {
7947 FakeImplProxy proxy;
7948 TestSharedBitmapManager shared_bitmap_manager;
7949 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
7950 gfx::Transform identity_matrix;
7951 scoped_ptr<AnimationScaleFactorTrackingLayerImpl> grand_parent =
7952 AnimationScaleFactorTrackingLayerImpl::Create(host_impl.active_tree(), 1);
7953 scoped_ptr<AnimationScaleFactorTrackingLayerImpl> parent =
7954 AnimationScaleFactorTrackingLayerImpl::Create(host_impl.active_tree(), 2);
7955 scoped_ptr<AnimationScaleFactorTrackingLayerImpl> child =
7956 AnimationScaleFactorTrackingLayerImpl::Create(host_impl.active_tree(), 3);
7957 scoped_ptr<AnimationScaleFactorTrackingLayerImpl> grand_child =
7958 AnimationScaleFactorTrackingLayerImpl::Create(host_impl.active_tree(), 4);
7959
7960 AnimationScaleFactorTrackingLayerImpl* parent_raw = parent.get();
7961 AnimationScaleFactorTrackingLayerImpl* child_raw = child.get();
7962 AnimationScaleFactorTrackingLayerImpl* grand_child_raw = grand_child.get();
7963
7964 child->AddChild(grand_child.Pass());
7965 parent->AddChild(child.Pass());
7966 grand_parent->AddChild(parent.Pass());
7967
7968 SetLayerPropertiesForTesting(grand_parent.get(), identity_matrix,
7969 gfx::Point3F(), gfx::PointF(), gfx::Size(1, 2),
7970 true, false, true);
7971 SetLayerPropertiesForTesting(parent_raw, identity_matrix, gfx::Point3F(),
7972 gfx::PointF(), gfx::Size(1, 2), true, false,
7973 false);
7974 SetLayerPropertiesForTesting(child_raw, identity_matrix, gfx::Point3F(),
7975 gfx::PointF(), gfx::Size(1, 2), true, false,
7976 false);
7977
7978 SetLayerPropertiesForTesting(grand_child_raw, identity_matrix, gfx::Point3F(),
7979 gfx::PointF(), gfx::Size(1, 2), true, false,
7980 false);
7981
7982 ExecuteCalculateDrawProperties(grand_parent.get());
7983
7984 // No layers have animations.
7985 EXPECT_EQ(0.f,
7986 grand_parent->draw_properties().maximum_animation_contents_scale);
7987 EXPECT_EQ(0.f,
7988 parent_raw->draw_properties().maximum_animation_contents_scale);
7989 EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
7990 EXPECT_EQ(
7991 0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
7992
7993 TransformOperations translation;
7994 translation.AppendTranslate(1.f, 2.f, 3.f);
7995
7996 AddAnimatedTransformToLayer(
7997 parent_raw, 1.0, TransformOperations(), translation);
7998
7999 // No layers have scale-affecting animations.
8000 EXPECT_EQ(0.f,
8001 grand_parent->draw_properties().maximum_animation_contents_scale);
8002 EXPECT_EQ(0.f,
8003 parent_raw->draw_properties().maximum_animation_contents_scale);
8004 EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
8005 EXPECT_EQ(
8006 0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
8007
8008 TransformOperations scale;
8009 scale.AppendScale(5.f, 4.f, 3.f);
8010
8011 AddAnimatedTransformToLayer(child_raw, 1.0, TransformOperations(), scale);
8012 ExecuteCalculateDrawProperties(grand_parent.get());
8013
8014 // Only |child| has a scale-affecting animation.
8015 EXPECT_EQ(0.f,
8016 grand_parent->draw_properties().maximum_animation_contents_scale);
8017 EXPECT_EQ(0.f,
8018 parent_raw->draw_properties().maximum_animation_contents_scale);
8019 EXPECT_EQ(5.f, child_raw->draw_properties().maximum_animation_contents_scale);
8020 EXPECT_EQ(
8021 5.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
8022
8023 AddAnimatedTransformToLayer(
8024 grand_parent.get(), 1.0, TransformOperations(), scale);
8025 ExecuteCalculateDrawProperties(grand_parent.get());
8026
8027 // |grand_parent| and |child| have scale-affecting animations.
8028 EXPECT_EQ(5.f,
8029 grand_parent->draw_properties().maximum_animation_contents_scale);
8030 EXPECT_EQ(5.f,
8031 parent_raw->draw_properties().maximum_animation_contents_scale);
8032 // We don't support combining animated scales from two nodes; 0.f means
8033 // that the maximum scale could not be computed.
8034 EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
8035 EXPECT_EQ(
8036 0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
8037
8038 AddAnimatedTransformToLayer(parent_raw, 1.0, TransformOperations(), scale);
8039 ExecuteCalculateDrawProperties(grand_parent.get());
8040
8041 // |grand_parent|, |parent|, and |child| have scale-affecting animations.
8042 EXPECT_EQ(5.f,
8043 grand_parent->draw_properties().maximum_animation_contents_scale);
8044 EXPECT_EQ(0.f,
8045 parent_raw->draw_properties().maximum_animation_contents_scale);
8046 EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
8047 EXPECT_EQ(
8048 0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
8049
8050 grand_parent->layer_animation_controller()->AbortAnimations(
8051 Animation::TRANSFORM);
8052 parent_raw->layer_animation_controller()->AbortAnimations(
8053 Animation::TRANSFORM);
8054 child_raw->layer_animation_controller()->AbortAnimations(
8055 Animation::TRANSFORM);
8056
8057 TransformOperations perspective;
8058 perspective.AppendPerspective(10.f);
8059
8060 AddAnimatedTransformToLayer(
8061 child_raw, 1.0, TransformOperations(), perspective);
8062 ExecuteCalculateDrawProperties(grand_parent.get());
8063
8064 // |child| has a scale-affecting animation but computing the maximum of this
8065 // animation is not supported.
8066 EXPECT_EQ(0.f,
8067 grand_parent->draw_properties().maximum_animation_contents_scale);
8068 EXPECT_EQ(0.f,
8069 parent_raw->draw_properties().maximum_animation_contents_scale);
8070 EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
8071 EXPECT_EQ(
8072 0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
8073
8074 child_raw->layer_animation_controller()->AbortAnimations(
8075 Animation::TRANSFORM);
8076
8077 gfx::Transform scale_matrix;
8078 scale_matrix.Scale(1.f, 2.f);
8079 grand_parent->SetTransform(scale_matrix);
8080 parent_raw->SetTransform(scale_matrix);
8081 AddAnimatedTransformToLayer(parent_raw, 1.0, TransformOperations(), scale);
8082 ExecuteCalculateDrawProperties(grand_parent.get());
8083
8084 // |grand_parent| and |parent| each have scale 2.f. |parent| has a scale
8085 // animation with maximum scale 5.f.
8086 EXPECT_EQ(0.f,
8087 grand_parent->draw_properties().maximum_animation_contents_scale);
8088 EXPECT_EQ(10.f,
8089 parent_raw->draw_properties().maximum_animation_contents_scale);
8090 EXPECT_EQ(10.f,
8091 child_raw->draw_properties().maximum_animation_contents_scale);
8092 EXPECT_EQ(
8093 10.f,
8094 grand_child_raw->draw_properties().maximum_animation_contents_scale);
8095
8096 gfx::Transform perspective_matrix;
8097 perspective_matrix.ApplyPerspectiveDepth(2.f);
8098 child_raw->SetTransform(perspective_matrix);
8099 ExecuteCalculateDrawProperties(grand_parent.get());
8100
8101 // |child| has a transform that's neither a translation nor a scale.
8102 EXPECT_EQ(0.f,
8103 grand_parent->draw_properties().maximum_animation_contents_scale);
8104 EXPECT_EQ(10.f,
8105 parent_raw->draw_properties().maximum_animation_contents_scale);
8106 EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
8107 EXPECT_EQ(
8108 0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
8109
8110 parent_raw->SetTransform(perspective_matrix);
8111 ExecuteCalculateDrawProperties(grand_parent.get());
8112
8113 // |parent| and |child| have transforms that are neither translations nor
8114 // scales.
8115 EXPECT_EQ(0.f,
8116 grand_parent->draw_properties().maximum_animation_contents_scale);
8117 EXPECT_EQ(0.f,
8118 parent_raw->draw_properties().maximum_animation_contents_scale);
8119 EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
8120 EXPECT_EQ(
8121 0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
8122
8123 parent_raw->SetTransform(identity_matrix);
8124 child_raw->SetTransform(identity_matrix);
8125 grand_parent->SetTransform(perspective_matrix);
8126
8127 ExecuteCalculateDrawProperties(grand_parent.get());
8128
8129 // |grand_parent| has a transform that's neither a translation nor a scale.
8130 EXPECT_EQ(0.f,
8131 grand_parent->draw_properties().maximum_animation_contents_scale);
8132 EXPECT_EQ(0.f,
8133 parent_raw->draw_properties().maximum_animation_contents_scale);
8134 EXPECT_EQ(0.f, child_raw->draw_properties().maximum_animation_contents_scale);
8135 EXPECT_EQ(
8136 0.f, grand_child_raw->draw_properties().maximum_animation_contents_scale);
8137 }
8138
8139 static int membership_id(LayerImpl* layer) {
8140 return layer->draw_properties().last_drawn_render_surface_layer_list_id;
8141 }
8142
8143 static void GatherDrawnLayers(LayerImplList* rsll,
8144 std::set<LayerImpl*>* drawn_layers) {
8145 for (LayerIterator<LayerImpl> it = LayerIterator<LayerImpl>::Begin(rsll),
8146 end = LayerIterator<LayerImpl>::End(rsll);
8147 it != end;
8148 ++it) {
8149 LayerImpl* layer = *it;
8150 if (it.represents_itself())
8151 drawn_layers->insert(layer);
8152
8153 if (!it.represents_contributing_render_surface())
8154 continue;
8155
8156 if (layer->mask_layer())
8157 drawn_layers->insert(layer->mask_layer());
8158 if (layer->replica_layer() && layer->replica_layer()->mask_layer())
8159 drawn_layers->insert(layer->replica_layer()->mask_layer());
8160 }
8161 }
8162
8163 TEST_F(LayerTreeHostCommonTest, RenderSurfaceLayerListMembership) {
8164 FakeImplProxy proxy;
8165 TestSharedBitmapManager shared_bitmap_manager;
8166 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
8167 gfx::Transform identity_matrix;
8168
8169 scoped_ptr<LayerImpl> grand_parent =
8170 LayerImpl::Create(host_impl.active_tree(), 1);
8171 scoped_ptr<LayerImpl> parent = LayerImpl::Create(host_impl.active_tree(), 3);
8172 scoped_ptr<LayerImpl> child = LayerImpl::Create(host_impl.active_tree(), 5);
8173 scoped_ptr<LayerImpl> grand_child1 =
8174 LayerImpl::Create(host_impl.active_tree(), 7);
8175 scoped_ptr<LayerImpl> grand_child2 =
8176 LayerImpl::Create(host_impl.active_tree(), 9);
8177
8178 LayerImpl* grand_parent_raw = grand_parent.get();
8179 LayerImpl* parent_raw = parent.get();
8180 LayerImpl* child_raw = child.get();
8181 LayerImpl* grand_child1_raw = grand_child1.get();
8182 LayerImpl* grand_child2_raw = grand_child2.get();
8183
8184 child->AddChild(grand_child1.Pass());
8185 child->AddChild(grand_child2.Pass());
8186 parent->AddChild(child.Pass());
8187 grand_parent->AddChild(parent.Pass());
8188
8189 SetLayerPropertiesForTesting(grand_parent_raw, identity_matrix,
8190 gfx::Point3F(), gfx::PointF(), gfx::Size(1, 2),
8191 true, false, true);
8192 SetLayerPropertiesForTesting(parent_raw, identity_matrix, gfx::Point3F(),
8193 gfx::PointF(), gfx::Size(1, 2), true, false,
8194 false);
8195
8196 SetLayerPropertiesForTesting(child_raw, identity_matrix, gfx::Point3F(),
8197 gfx::PointF(), gfx::Size(1, 2), true, false,
8198 false);
8199
8200 SetLayerPropertiesForTesting(grand_child1_raw, identity_matrix,
8201 gfx::Point3F(), gfx::PointF(), gfx::Size(1, 2),
8202 true, false, false);
8203
8204 SetLayerPropertiesForTesting(grand_child2_raw, identity_matrix,
8205 gfx::Point3F(), gfx::PointF(), gfx::Size(1, 2),
8206 true, false, false);
8207
8208 // Start with nothing being drawn.
8209 ExecuteCalculateDrawProperties(grand_parent_raw);
8210 int member_id = render_surface_layer_list_count();
8211
8212 EXPECT_NE(member_id, membership_id(grand_parent_raw));
8213 EXPECT_NE(member_id, membership_id(parent_raw));
8214 EXPECT_NE(member_id, membership_id(child_raw));
8215 EXPECT_NE(member_id, membership_id(grand_child1_raw));
8216 EXPECT_NE(member_id, membership_id(grand_child2_raw));
8217
8218 std::set<LayerImpl*> expected;
8219 std::set<LayerImpl*> actual;
8220 GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
8221 EXPECT_EQ(expected, actual);
8222
8223 // If we force render surface, but none of the layers are in the layer list,
8224 // then this layer should not appear in RSLL.
8225 grand_child1_raw->SetHasRenderSurface(true);
8226
8227 ExecuteCalculateDrawProperties(grand_parent_raw);
8228 member_id = render_surface_layer_list_count();
8229
8230 EXPECT_NE(member_id, membership_id(grand_parent_raw));
8231 EXPECT_NE(member_id, membership_id(parent_raw));
8232 EXPECT_NE(member_id, membership_id(child_raw));
8233 EXPECT_NE(member_id, membership_id(grand_child1_raw));
8234 EXPECT_NE(member_id, membership_id(grand_child2_raw));
8235
8236 expected.clear();
8237 actual.clear();
8238 GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
8239 EXPECT_EQ(expected, actual);
8240
8241 // However, if we say that this layer also draws content, it will appear in
8242 // RSLL.
8243 grand_child1_raw->SetDrawsContent(true);
8244
8245 ExecuteCalculateDrawProperties(grand_parent_raw);
8246 member_id = render_surface_layer_list_count();
8247
8248 EXPECT_NE(member_id, membership_id(grand_parent_raw));
8249 EXPECT_NE(member_id, membership_id(parent_raw));
8250 EXPECT_NE(member_id, membership_id(child_raw));
8251 EXPECT_EQ(member_id, membership_id(grand_child1_raw));
8252 EXPECT_NE(member_id, membership_id(grand_child2_raw));
8253
8254 expected.clear();
8255 expected.insert(grand_child1_raw);
8256
8257 actual.clear();
8258 GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
8259 EXPECT_EQ(expected, actual);
8260
8261 // Now child is forced to have a render surface, and one if its children draws
8262 // content.
8263 grand_child1_raw->SetDrawsContent(false);
8264 grand_child1_raw->SetHasRenderSurface(false);
8265 child_raw->SetHasRenderSurface(true);
8266 grand_child2_raw->SetDrawsContent(true);
8267
8268 ExecuteCalculateDrawProperties(grand_parent_raw);
8269 member_id = render_surface_layer_list_count();
8270
8271 EXPECT_NE(member_id, membership_id(grand_parent_raw));
8272 EXPECT_NE(member_id, membership_id(parent_raw));
8273 EXPECT_NE(member_id, membership_id(child_raw));
8274 EXPECT_NE(member_id, membership_id(grand_child1_raw));
8275 EXPECT_EQ(member_id, membership_id(grand_child2_raw));
8276
8277 expected.clear();
8278 expected.insert(grand_child2_raw);
8279
8280 actual.clear();
8281 GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
8282 EXPECT_EQ(expected, actual);
8283
8284 // Add a mask layer to child.
8285 child_raw->SetMaskLayer(LayerImpl::Create(host_impl.active_tree(), 6).Pass());
8286
8287 ExecuteCalculateDrawProperties(grand_parent_raw);
8288 member_id = render_surface_layer_list_count();
8289
8290 EXPECT_NE(member_id, membership_id(grand_parent_raw));
8291 EXPECT_NE(member_id, membership_id(parent_raw));
8292 EXPECT_NE(member_id, membership_id(child_raw));
8293 EXPECT_EQ(member_id, membership_id(child_raw->mask_layer()));
8294 EXPECT_NE(member_id, membership_id(grand_child1_raw));
8295 EXPECT_EQ(member_id, membership_id(grand_child2_raw));
8296
8297 expected.clear();
8298 expected.insert(grand_child2_raw);
8299 expected.insert(child_raw->mask_layer());
8300
8301 expected.clear();
8302 expected.insert(grand_child2_raw);
8303 expected.insert(child_raw->mask_layer());
8304
8305 actual.clear();
8306 GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
8307 EXPECT_EQ(expected, actual);
8308
8309 // Add replica mask layer.
8310 scoped_ptr<LayerImpl> replica_layer =
8311 LayerImpl::Create(host_impl.active_tree(), 20);
8312 replica_layer->SetMaskLayer(LayerImpl::Create(host_impl.active_tree(), 21));
8313 child_raw->SetReplicaLayer(replica_layer.Pass());
8314
8315 ExecuteCalculateDrawProperties(grand_parent_raw);
8316 member_id = render_surface_layer_list_count();
8317
8318 EXPECT_NE(member_id, membership_id(grand_parent_raw));
8319 EXPECT_NE(member_id, membership_id(parent_raw));
8320 EXPECT_NE(member_id, membership_id(child_raw));
8321 EXPECT_EQ(member_id, membership_id(child_raw->mask_layer()));
8322 EXPECT_EQ(member_id, membership_id(child_raw->replica_layer()->mask_layer()));
8323 EXPECT_NE(member_id, membership_id(grand_child1_raw));
8324 EXPECT_EQ(member_id, membership_id(grand_child2_raw));
8325
8326 expected.clear();
8327 expected.insert(grand_child2_raw);
8328 expected.insert(child_raw->mask_layer());
8329 expected.insert(child_raw->replica_layer()->mask_layer());
8330
8331 actual.clear();
8332 GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
8333 EXPECT_EQ(expected, actual);
8334
8335 child_raw->TakeReplicaLayer();
8336
8337 // With nothing drawing, we should have no layers.
8338 grand_child2_raw->SetDrawsContent(false);
8339
8340 ExecuteCalculateDrawProperties(grand_parent_raw);
8341 member_id = render_surface_layer_list_count();
8342
8343 EXPECT_NE(member_id, membership_id(grand_parent_raw));
8344 EXPECT_NE(member_id, membership_id(parent_raw));
8345 EXPECT_NE(member_id, membership_id(child_raw));
8346 EXPECT_NE(member_id, membership_id(child_raw->mask_layer()));
8347 EXPECT_NE(member_id, membership_id(grand_child1_raw));
8348 EXPECT_NE(member_id, membership_id(grand_child2_raw));
8349
8350 expected.clear();
8351 actual.clear();
8352 GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
8353 EXPECT_EQ(expected, actual);
8354
8355 // Child itself draws means that we should have the child and the mask in the
8356 // list.
8357 child_raw->SetDrawsContent(true);
8358
8359 ExecuteCalculateDrawProperties(grand_parent_raw);
8360 member_id = render_surface_layer_list_count();
8361
8362 EXPECT_NE(member_id, membership_id(grand_parent_raw));
8363 EXPECT_NE(member_id, membership_id(parent_raw));
8364 EXPECT_EQ(member_id, membership_id(child_raw));
8365 EXPECT_EQ(member_id, membership_id(child_raw->mask_layer()));
8366 EXPECT_NE(member_id, membership_id(grand_child1_raw));
8367 EXPECT_NE(member_id, membership_id(grand_child2_raw));
8368
8369 expected.clear();
8370 expected.insert(child_raw);
8371 expected.insert(child_raw->mask_layer());
8372 actual.clear();
8373 GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
8374 EXPECT_EQ(expected, actual);
8375
8376 child_raw->TakeMaskLayer();
8377
8378 // Now everyone's a member!
8379 grand_parent_raw->SetDrawsContent(true);
8380 parent_raw->SetDrawsContent(true);
8381 child_raw->SetDrawsContent(true);
8382 grand_child1_raw->SetDrawsContent(true);
8383 grand_child2_raw->SetDrawsContent(true);
8384
8385 ExecuteCalculateDrawProperties(grand_parent_raw);
8386 member_id = render_surface_layer_list_count();
8387
8388 EXPECT_EQ(member_id, membership_id(grand_parent_raw));
8389 EXPECT_EQ(member_id, membership_id(parent_raw));
8390 EXPECT_EQ(member_id, membership_id(child_raw));
8391 EXPECT_EQ(member_id, membership_id(grand_child1_raw));
8392 EXPECT_EQ(member_id, membership_id(grand_child2_raw));
8393
8394 expected.clear();
8395 expected.insert(grand_parent_raw);
8396 expected.insert(parent_raw);
8397 expected.insert(child_raw);
8398 expected.insert(grand_child1_raw);
8399 expected.insert(grand_child2_raw);
8400
8401 actual.clear();
8402 GatherDrawnLayers(render_surface_layer_list_impl(), &actual);
8403 EXPECT_EQ(expected, actual);
8404 }
8405
8406 TEST_F(LayerTreeHostCommonTest, DrawPropertyScales) {
8407 FakeImplProxy proxy;
8408 TestSharedBitmapManager shared_bitmap_manager;
8409 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
8410
8411 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl.active_tree(), 1);
8412 LayerImpl* root_layer = root.get();
8413 scoped_ptr<LayerImpl> child1 = LayerImpl::Create(host_impl.active_tree(), 2);
8414 LayerImpl* child1_layer = child1.get();
8415 scoped_ptr<LayerImpl> child2 = LayerImpl::Create(host_impl.active_tree(), 3);
8416 LayerImpl* child2_layer = child2.get();
8417
8418 root->AddChild(child1.Pass());
8419 root->AddChild(child2.Pass());
8420 root->SetHasRenderSurface(true);
8421
8422 gfx::Transform identity_matrix, scale_transform_child1,
8423 scale_transform_child2;
8424 scale_transform_child1.Scale(2, 3);
8425 scale_transform_child2.Scale(4, 5);
8426
8427 SetLayerPropertiesForTesting(root_layer, identity_matrix, gfx::Point3F(),
8428 gfx::PointF(), gfx::Size(1, 1), true, false,
8429 true);
8430 SetLayerPropertiesForTesting(child1_layer, scale_transform_child1,
8431 gfx::Point3F(), gfx::PointF(), gfx::Size(), true,
8432 false, false);
8433
8434 child1_layer->SetMaskLayer(
8435 LayerImpl::Create(host_impl.active_tree(), 4).Pass());
8436
8437 scoped_ptr<LayerImpl> replica_layer =
8438 LayerImpl::Create(host_impl.active_tree(), 5);
8439 replica_layer->SetHasRenderSurface(true);
8440 replica_layer->SetMaskLayer(LayerImpl::Create(host_impl.active_tree(), 6));
8441 child1_layer->SetReplicaLayer(replica_layer.Pass());
8442 child1_layer->SetHasRenderSurface(true);
8443
8444 ExecuteCalculateDrawProperties(root_layer);
8445
8446 TransformOperations scale;
8447 scale.AppendScale(5.f, 8.f, 3.f);
8448
8449 AddAnimatedTransformToLayer(child2_layer, 1.0, TransformOperations(), scale);
8450 SetLayerPropertiesForTesting(child2_layer, scale_transform_child2,
8451 gfx::Point3F(), gfx::PointF(), gfx::Size(), true,
8452 false, false);
8453
8454 ExecuteCalculateDrawProperties(root_layer);
8455
8456 EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().ideal_contents_scale);
8457 EXPECT_FLOAT_EQ(3.f, child1_layer->draw_properties().ideal_contents_scale);
8458 EXPECT_FLOAT_EQ(
8459 3.f, child1_layer->mask_layer()->draw_properties().ideal_contents_scale);
8460 EXPECT_FLOAT_EQ(3.f,
8461 child1_layer->replica_layer()
8462 ->mask_layer()
8463 ->draw_properties()
8464 .ideal_contents_scale);
8465 EXPECT_FLOAT_EQ(5.f, child2_layer->draw_properties().ideal_contents_scale);
8466
8467 EXPECT_FLOAT_EQ(
8468 0.f, root_layer->draw_properties().maximum_animation_contents_scale);
8469 EXPECT_FLOAT_EQ(
8470 0.f, child1_layer->draw_properties().maximum_animation_contents_scale);
8471 EXPECT_FLOAT_EQ(0.f,
8472 child1_layer->mask_layer()
8473 ->draw_properties()
8474 .maximum_animation_contents_scale);
8475 EXPECT_FLOAT_EQ(0.f,
8476 child1_layer->replica_layer()
8477 ->mask_layer()
8478 ->draw_properties()
8479 .maximum_animation_contents_scale);
8480 EXPECT_FLOAT_EQ(
8481 8.f, child2_layer->draw_properties().maximum_animation_contents_scale);
8482
8483 EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().page_scale_factor);
8484 EXPECT_FLOAT_EQ(1.f, child1_layer->draw_properties().page_scale_factor);
8485 EXPECT_FLOAT_EQ(
8486 1.f, child1_layer->mask_layer()->draw_properties().page_scale_factor);
8487 EXPECT_FLOAT_EQ(1.f,
8488 child1_layer->replica_layer()
8489 ->mask_layer()
8490 ->draw_properties()
8491 .page_scale_factor);
8492 EXPECT_FLOAT_EQ(1.f, child2_layer->draw_properties().page_scale_factor);
8493
8494 EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().device_scale_factor);
8495 EXPECT_FLOAT_EQ(1.f, child1_layer->draw_properties().device_scale_factor);
8496 EXPECT_FLOAT_EQ(
8497 1.f, child1_layer->mask_layer()->draw_properties().device_scale_factor);
8498 EXPECT_FLOAT_EQ(1.f,
8499 child1_layer->replica_layer()
8500 ->mask_layer()
8501 ->draw_properties()
8502 .device_scale_factor);
8503 EXPECT_FLOAT_EQ(1.f, child2_layer->draw_properties().device_scale_factor);
8504
8505 // Changing page-scale would affect ideal_contents_scale and
8506 // maximum_animation_contents_scale.
8507
8508 float page_scale_factor = 3.f;
8509 float device_scale_factor = 1.0f;
8510 std::vector<LayerImpl*> render_surface_layer_list;
8511 gfx::Size device_viewport_size =
8512 gfx::Size(root_layer->bounds().width() * device_scale_factor,
8513 root_layer->bounds().height() * device_scale_factor);
8514 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
8515 root_layer, device_viewport_size, &render_surface_layer_list);
8516
8517 inputs.page_scale_factor = page_scale_factor;
8518 inputs.can_adjust_raster_scales = true;
8519 inputs.page_scale_application_layer = root_layer;
8520 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
8521
8522 EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().ideal_contents_scale);
8523 EXPECT_FLOAT_EQ(9.f, child1_layer->draw_properties().ideal_contents_scale);
8524 EXPECT_FLOAT_EQ(
8525 9.f, child1_layer->mask_layer()->draw_properties().ideal_contents_scale);
8526 EXPECT_FLOAT_EQ(9.f,
8527 child1_layer->replica_layer()
8528 ->mask_layer()
8529 ->draw_properties()
8530 .ideal_contents_scale);
8531 EXPECT_FLOAT_EQ(15.f, child2_layer->draw_properties().ideal_contents_scale);
8532
8533 EXPECT_FLOAT_EQ(
8534 0.f, root_layer->draw_properties().maximum_animation_contents_scale);
8535 EXPECT_FLOAT_EQ(
8536 0.f, child1_layer->draw_properties().maximum_animation_contents_scale);
8537 EXPECT_FLOAT_EQ(0.f,
8538 child1_layer->mask_layer()
8539 ->draw_properties()
8540 .maximum_animation_contents_scale);
8541 EXPECT_FLOAT_EQ(0.f,
8542 child1_layer->replica_layer()
8543 ->mask_layer()
8544 ->draw_properties()
8545 .maximum_animation_contents_scale);
8546 EXPECT_FLOAT_EQ(
8547 24.f, child2_layer->draw_properties().maximum_animation_contents_scale);
8548
8549 EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().page_scale_factor);
8550 EXPECT_FLOAT_EQ(3.f, child1_layer->draw_properties().page_scale_factor);
8551 EXPECT_FLOAT_EQ(
8552 3.f, child1_layer->mask_layer()->draw_properties().page_scale_factor);
8553 EXPECT_FLOAT_EQ(3.f,
8554 child1_layer->replica_layer()
8555 ->mask_layer()
8556 ->draw_properties()
8557 .page_scale_factor);
8558 EXPECT_FLOAT_EQ(3.f, child2_layer->draw_properties().page_scale_factor);
8559
8560 EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().device_scale_factor);
8561 EXPECT_FLOAT_EQ(1.f, child1_layer->draw_properties().device_scale_factor);
8562 EXPECT_FLOAT_EQ(
8563 1.f, child1_layer->mask_layer()->draw_properties().device_scale_factor);
8564 EXPECT_FLOAT_EQ(1.f,
8565 child1_layer->replica_layer()
8566 ->mask_layer()
8567 ->draw_properties()
8568 .device_scale_factor);
8569 EXPECT_FLOAT_EQ(1.f, child2_layer->draw_properties().device_scale_factor);
8570
8571 // Changing device-scale would affect ideal_contents_scale and
8572 // maximum_animation_contents_scale.
8573
8574 device_scale_factor = 4.0f;
8575 inputs.device_scale_factor = device_scale_factor;
8576 inputs.can_adjust_raster_scales = true;
8577 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
8578
8579 EXPECT_FLOAT_EQ(4.f, root_layer->draw_properties().ideal_contents_scale);
8580 EXPECT_FLOAT_EQ(36.f, child1_layer->draw_properties().ideal_contents_scale);
8581 EXPECT_FLOAT_EQ(
8582 36.f, child1_layer->mask_layer()->draw_properties().ideal_contents_scale);
8583 EXPECT_FLOAT_EQ(36.f,
8584 child1_layer->replica_layer()
8585 ->mask_layer()
8586 ->draw_properties()
8587 .ideal_contents_scale);
8588 EXPECT_FLOAT_EQ(60.f, child2_layer->draw_properties().ideal_contents_scale);
8589
8590 EXPECT_FLOAT_EQ(
8591 0.f, root_layer->draw_properties().maximum_animation_contents_scale);
8592 EXPECT_FLOAT_EQ(
8593 0.f, child1_layer->draw_properties().maximum_animation_contents_scale);
8594 EXPECT_FLOAT_EQ(0.f,
8595 child1_layer->mask_layer()
8596 ->draw_properties()
8597 .maximum_animation_contents_scale);
8598 EXPECT_FLOAT_EQ(0.f,
8599 child1_layer->replica_layer()
8600 ->mask_layer()
8601 ->draw_properties()
8602 .maximum_animation_contents_scale);
8603 EXPECT_FLOAT_EQ(
8604 96.f, child2_layer->draw_properties().maximum_animation_contents_scale);
8605
8606 EXPECT_FLOAT_EQ(1.f, root_layer->draw_properties().page_scale_factor);
8607 EXPECT_FLOAT_EQ(3.f, child1_layer->draw_properties().page_scale_factor);
8608 EXPECT_FLOAT_EQ(
8609 3.f, child1_layer->mask_layer()->draw_properties().page_scale_factor);
8610 EXPECT_FLOAT_EQ(3.f,
8611 child1_layer->replica_layer()
8612 ->mask_layer()
8613 ->draw_properties()
8614 .page_scale_factor);
8615 EXPECT_FLOAT_EQ(3.f, child2_layer->draw_properties().page_scale_factor);
8616
8617 EXPECT_FLOAT_EQ(4.f, root_layer->draw_properties().device_scale_factor);
8618 EXPECT_FLOAT_EQ(4.f, child1_layer->draw_properties().device_scale_factor);
8619 EXPECT_FLOAT_EQ(
8620 4.f, child1_layer->mask_layer()->draw_properties().device_scale_factor);
8621 EXPECT_FLOAT_EQ(4.f,
8622 child1_layer->replica_layer()
8623 ->mask_layer()
8624 ->draw_properties()
8625 .device_scale_factor);
8626 EXPECT_FLOAT_EQ(4.f, child2_layer->draw_properties().device_scale_factor);
8627 }
8628
8629 TEST_F(LayerTreeHostCommonTest, VisibleContentRectInChildRenderSurface) {
8630 scoped_refptr<Layer> root = Layer::Create();
8631 SetLayerPropertiesForTesting(root.get(),
8632 gfx::Transform(),
8633 gfx::Point3F(),
8634 gfx::PointF(),
8635 gfx::Size(768 / 2, 3000),
8636 true,
8637 false);
8638 root->SetIsDrawable(true);
8639
8640 scoped_refptr<Layer> clip = Layer::Create();
8641 SetLayerPropertiesForTesting(clip.get(),
8642 gfx::Transform(),
8643 gfx::Point3F(),
8644 gfx::PointF(),
8645 gfx::Size(768 / 2, 10000),
8646 true,
8647 false);
8648 clip->SetMasksToBounds(true);
8649
8650 scoped_refptr<Layer> content = Layer::Create();
8651 SetLayerPropertiesForTesting(content.get(),
8652 gfx::Transform(),
8653 gfx::Point3F(),
8654 gfx::PointF(),
8655 gfx::Size(768 / 2, 10000),
8656 true,
8657 false);
8658 content->SetIsDrawable(true);
8659 content->SetForceRenderSurface(true);
8660
8661 root->AddChild(clip);
8662 clip->AddChild(content);
8663
8664 FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D);
8665 scoped_ptr<FakeLayerTreeHost> host = FakeLayerTreeHost::Create(&client);
8666 host->SetRootLayer(root);
8667
8668 gfx::Size device_viewport_size(768, 582);
8669 RenderSurfaceLayerList render_surface_layer_list;
8670 LayerTreeHostCommon::CalcDrawPropsMainInputsForTesting inputs(
8671 host->root_layer(), device_viewport_size, &render_surface_layer_list);
8672 inputs.device_scale_factor = 2.f;
8673 inputs.page_scale_factor = 1.f;
8674 inputs.page_scale_application_layer = NULL;
8675 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
8676
8677 // Layers in the root render surface have their visible content rect clipped
8678 // by the viewport.
8679 EXPECT_EQ(gfx::Rect(768 / 2, 582 / 2), root->visible_content_rect());
8680
8681 // Layers drawing to a child render surface should still have their visible
8682 // content rect clipped by the viewport.
8683 EXPECT_EQ(gfx::Rect(768 / 2, 582 / 2), content->visible_content_rect());
8684 }
8685
8686 TEST_F(LayerTreeHostCommonTest, BoundsDeltaAffectVisibleContentRect) {
8687 FakeImplProxy proxy;
8688 TestSharedBitmapManager shared_bitmap_manager;
8689 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr);
8690
8691 // Set two layers: the root layer clips it's child,
8692 // the child draws its content.
8693
8694 gfx::Size root_size = gfx::Size(300, 500);
8695
8696 // Sublayer should be bigger than the root enlarged by bounds_delta.
8697 gfx::Size sublayer_size = gfx::Size(300, 1000);
8698
8699 // Device viewport accomidated the root and the top controls.
8700 gfx::Size device_viewport_size = gfx::Size(300, 600);
8701 gfx::Transform identity_matrix;
8702
8703 host_impl.active_tree()->SetRootLayer(
8704 LayerImpl::Create(host_impl.active_tree(), 1));
8705
8706 LayerImpl* root = host_impl.active_tree()->root_layer();
8707 SetLayerPropertiesForTesting(root,
8708 identity_matrix,
8709 gfx::Point3F(),
8710 gfx::PointF(),
8711 root_size,
8712 false,
8713 false,
8714 true);
8715
8716 root->SetContentBounds(root_size);
8717 root->SetMasksToBounds(true);
8718
8719 root->AddChild(LayerImpl::Create(host_impl.active_tree(), 2));
8720
8721 LayerImpl* sublayer = root->child_at(0);
8722 SetLayerPropertiesForTesting(sublayer,
8723 identity_matrix,
8724 gfx::Point3F(),
8725 gfx::PointF(),
8726 sublayer_size,
8727 false,
8728 false,
8729 false);
8730
8731 sublayer->SetContentBounds(sublayer_size);
8732 sublayer->SetDrawsContent(true);
8733
8734 LayerImplList layer_impl_list;
8735 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
8736 root, device_viewport_size, &layer_impl_list);
8737
8738 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
8739
8740 EXPECT_EQ(gfx::Rect(root_size), sublayer->visible_content_rect());
8741
8742 root->SetBoundsDelta(gfx::Vector2dF(0.0, 50.0));
8743
8744 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
8745
8746 gfx::Rect affected_by_delta(0, 0, root_size.width(),
8747 root_size.height() + 50);
8748 EXPECT_EQ(affected_by_delta, sublayer->visible_content_rect());
8749 }
8750
8751 TEST_F(LayerTreeHostCommonTest, VisibleContentRectForAnimatedLayer) {
8752 const gfx::Transform identity_matrix;
8753 scoped_refptr<Layer> root = Layer::Create();
8754 scoped_refptr<LayerWithForcedDrawsContent> animated =
8755 make_scoped_refptr(new LayerWithForcedDrawsContent());
8756
8757 root->AddChild(animated);
8758
8759 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
8760 host->SetRootLayer(root);
8761
8762 SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(),
8763 gfx::PointF(), gfx::Size(100, 100), true, false);
8764 SetLayerPropertiesForTesting(animated.get(), identity_matrix, gfx::Point3F(),
8765 gfx::PointF(), gfx::Size(20, 20), true, false);
8766
8767 root->SetMasksToBounds(true);
8768 root->SetForceRenderSurface(true);
8769 animated->SetOpacity(0.f);
8770
8771 AddOpacityTransitionToController(animated->layer_animation_controller(), 10.0,
8772 0.f, 1.f, false);
8773
8774 ExecuteCalculateDrawProperties(root.get());
8775
8776 EXPECT_FALSE(animated->visible_rect_from_property_trees().IsEmpty());
8777 }
8778
8779 // Verify that having an animated filter (but no current filter, as these
8780 // are mutually exclusive) correctly creates a render surface.
8781 TEST_F(LayerTreeHostCommonTest, AnimatedFilterCreatesRenderSurface) {
8782 scoped_refptr<Layer> root = Layer::Create();
8783 scoped_refptr<Layer> child = Layer::Create();
8784 scoped_refptr<Layer> grandchild = Layer::Create();
8785 root->AddChild(child);
8786 child->AddChild(grandchild);
8787
8788 gfx::Transform identity_transform;
8789 SetLayerPropertiesForTesting(root.get(), identity_transform, gfx::Point3F(),
8790 gfx::PointF(), gfx::Size(50, 50), true, false);
8791 SetLayerPropertiesForTesting(child.get(), identity_transform, gfx::Point3F(),
8792 gfx::PointF(), gfx::Size(50, 50), true, false);
8793 SetLayerPropertiesForTesting(grandchild.get(), identity_transform,
8794 gfx::Point3F(), gfx::PointF(), gfx::Size(50, 50),
8795 true, false);
8796 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
8797 host->SetRootLayer(root);
8798
8799 AddAnimatedFilterToLayer(child.get(), 10.0, 0.1f, 0.2f);
8800
8801 ExecuteCalculateDrawProperties(root.get());
8802
8803 EXPECT_TRUE(root->render_surface());
8804 EXPECT_TRUE(child->render_surface());
8805 EXPECT_FALSE(grandchild->render_surface());
8806
8807 EXPECT_TRUE(root->filters().IsEmpty());
8808 EXPECT_TRUE(child->filters().IsEmpty());
8809 EXPECT_TRUE(grandchild->filters().IsEmpty());
8810
8811 EXPECT_FALSE(root->FilterIsAnimating());
8812 EXPECT_TRUE(child->FilterIsAnimating());
8813 EXPECT_FALSE(grandchild->FilterIsAnimating());
8814 }
8815
8816 // Ensures that the property tree code accounts for offsets between fixed
8817 // position layers and their respective containers.
8818 TEST_F(LayerTreeHostCommonTest, PropertyTreesAccountForFixedParentOffset) {
8819 scoped_refptr<Layer> root = Layer::Create();
8820 scoped_refptr<Layer> child = Layer::Create();
8821 scoped_refptr<LayerWithForcedDrawsContent> grandchild =
8822 make_scoped_refptr(new LayerWithForcedDrawsContent());
8823
8824 root->AddChild(child);
8825 child->AddChild(grandchild);
8826
8827 gfx::Transform identity_transform;
8828 SetLayerPropertiesForTesting(root.get(), identity_transform, gfx::Point3F(),
8829 gfx::PointF(), gfx::Size(50, 50), true, false);
8830 SetLayerPropertiesForTesting(child.get(), identity_transform, gfx::Point3F(),
8831 gfx::PointF(1000, 1000), gfx::Size(50, 50), true,
8832 false);
8833 SetLayerPropertiesForTesting(grandchild.get(), identity_transform,
8834 gfx::Point3F(), gfx::PointF(-1000, -1000),
8835 gfx::Size(50, 50), true, false);
8836
8837 root->SetMasksToBounds(true);
8838 root->SetIsContainerForFixedPositionLayers(true);
8839 LayerPositionConstraint constraint;
8840 constraint.set_is_fixed_position(true);
8841 grandchild->SetPositionConstraint(constraint);
8842
8843 root->SetIsContainerForFixedPositionLayers(true);
8844
8845 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
8846 host->SetRootLayer(root);
8847
8848 ExecuteCalculateDrawProperties(root.get());
8849
8850 EXPECT_EQ(gfx::Rect(0, 0, 50, 50),
8851 grandchild->visible_rect_from_property_trees());
8852 }
8853
8854 TEST_F(LayerTreeHostCommonTest, CombineClipsUsingContentTarget) {
8855 // In the following layer tree, the layer |box|'s render target is |surface|.
8856 // |surface| also creates a transform node. We want to combine clips for |box|
8857 // in the space of its target (i.e., |surface|), not its target's target. This
8858 // test ensures that happens.
8859
8860 gfx::Transform rotate;
8861 rotate.Rotate(5);
8862 gfx::Transform identity;
8863
8864 scoped_refptr<Layer> root = Layer::Create();
8865 SetLayerPropertiesForTesting(root.get(), identity, gfx::Point3F(),
8866 gfx::PointF(), gfx::Size(2500, 1500), true,
8867 false);
8868
8869 scoped_refptr<Layer> frame_clip = Layer::Create();
8870 SetLayerPropertiesForTesting(frame_clip.get(), identity, gfx::Point3F(),
8871 gfx::PointF(), gfx::Size(2500, 1500), true,
8872 false);
8873 frame_clip->SetMasksToBounds(true);
8874
8875 scoped_refptr<Layer> rotated = Layer::Create();
8876 SetLayerPropertiesForTesting(rotated.get(), rotate,
8877 gfx::Point3F(1250, 250, 0), gfx::PointF(),
8878 gfx::Size(2500, 500), true, false);
8879
8880 scoped_refptr<Layer> surface = Layer::Create();
8881 SetLayerPropertiesForTesting(surface.get(), rotate, gfx::Point3F(),
8882 gfx::PointF(), gfx::Size(2500, 500), true,
8883 false);
8884 surface->SetOpacity(0.5);
8885
8886 scoped_refptr<LayerWithForcedDrawsContent> container =
8887 make_scoped_refptr(new LayerWithForcedDrawsContent());
8888 SetLayerPropertiesForTesting(container.get(), identity, gfx::Point3F(),
8889 gfx::PointF(), gfx::Size(300, 300), true, false);
8890
8891 scoped_refptr<LayerWithForcedDrawsContent> box =
8892 make_scoped_refptr(new LayerWithForcedDrawsContent());
8893 SetLayerPropertiesForTesting(box.get(), identity, gfx::Point3F(),
8894 gfx::PointF(), gfx::Size(100, 100), true, false);
8895
8896 root->AddChild(frame_clip);
8897 frame_clip->AddChild(rotated);
8898 rotated->AddChild(surface);
8899 surface->AddChild(container);
8900 surface->AddChild(box);
8901
8902 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
8903 host->SetRootLayer(root);
8904
8905 ExecuteCalculateDrawProperties(root.get());
8906 }
8907
8908 TEST_F(LayerTreeHostCommonTest, OnlyApplyFixedPositioningOnce) {
8909 gfx::Transform identity;
8910 gfx::Transform translate_z;
8911 translate_z.Translate3d(0, 0, 10);
8912
8913 scoped_refptr<Layer> root = Layer::Create();
8914 SetLayerPropertiesForTesting(root.get(), identity, gfx::Point3F(),
8915 gfx::PointF(), gfx::Size(800, 800), true, false);
8916 root->SetIsContainerForFixedPositionLayers(true);
8917
8918 scoped_refptr<Layer> frame_clip = Layer::Create();
8919 SetLayerPropertiesForTesting(frame_clip.get(), translate_z, gfx::Point3F(),
8920 gfx::PointF(500, 100), gfx::Size(100, 100), true,
8921 false);
8922 frame_clip->SetMasksToBounds(true);
8923
8924 scoped_refptr<LayerWithForcedDrawsContent> fixed =
8925 make_scoped_refptr(new LayerWithForcedDrawsContent());
8926 SetLayerPropertiesForTesting(fixed.get(), identity, gfx::Point3F(),
8927 gfx::PointF(), gfx::Size(1000, 1000), true,
8928 false);
8929
8930 LayerPositionConstraint constraint;
8931 constraint.set_is_fixed_position(true);
8932 fixed->SetPositionConstraint(constraint);
8933
8934 root->AddChild(frame_clip);
8935 frame_clip->AddChild(fixed);
8936
8937 scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
8938 host->SetRootLayer(root);
8939
8940 ExecuteCalculateDrawProperties(root.get());
8941
8942 gfx::Rect expected(0, 0, 100, 100);
8943 EXPECT_EQ(expected, fixed->visible_rect_from_property_trees());
8944 }
8945
8946 } // namespace
8947 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_common_perftest.cc ('k') | cc/trees/layer_tree_host_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698