OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/damage_tracker.h" | 5 #include "cc/damage_tracker.h" |
6 | 6 |
7 #include "cc/layer_impl.h" | 7 #include "cc/layer_impl.h" |
8 #include "cc/layer_tree_host_common.h" | 8 #include "cc/layer_tree_host_common.h" |
9 #include "cc/math_util.h" | 9 #include "cc/math_util.h" |
10 #include "cc/single_thread_proxy.h" | 10 #include "cc/single_thread_proxy.h" |
| 11 #include "cc/test/fake_impl_proxy.h" |
| 12 #include "cc/test/fake_layer_tree_host_impl.h" |
11 #include "cc/test/geometry_test_utils.h" | 13 #include "cc/test/geometry_test_utils.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
13 #include "third_party/skia/include/effects/SkBlurImageFilter.h" | 15 #include "third_party/skia/include/effects/SkBlurImageFilter.h" |
14 #include "ui/gfx/quad_f.h" | 16 #include "ui/gfx/quad_f.h" |
15 #include <public/WebFilterOperation.h> | 17 #include <public/WebFilterOperation.h> |
16 #include <public/WebFilterOperations.h> | 18 #include <public/WebFilterOperations.h> |
17 | 19 |
18 using namespace WebKit; | 20 using namespace WebKit; |
19 using namespace WebKitTests; | 21 using namespace WebKitTests; |
20 | 22 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 | 58 |
57 // Iterate back-to-front, so that damage correctly propagates from descendan
t surfaces to ancestors. | 59 // Iterate back-to-front, so that damage correctly propagates from descendan
t surfaces to ancestors. |
58 for (int i = renderSurfaceLayerList.size() - 1; i >= 0; --i) { | 60 for (int i = renderSurfaceLayerList.size() - 1; i >= 0; --i) { |
59 RenderSurfaceImpl* targetSurface = renderSurfaceLayerList[i]->renderSurf
ace(); | 61 RenderSurfaceImpl* targetSurface = renderSurfaceLayerList[i]->renderSurf
ace(); |
60 targetSurface->damageTracker()->updateDamageTrackingState(targetSurface-
>layerList(), targetSurface->owningLayerId(), targetSurface->surfacePropertyChan
gedOnlyFromDescendant(), targetSurface->contentRect(), renderSurfaceLayerList[i]
->maskLayer(), renderSurfaceLayerList[i]->filters(), renderSurfaceLayerList[i]->
filter().get()); | 62 targetSurface->damageTracker()->updateDamageTrackingState(targetSurface-
>layerList(), targetSurface->owningLayerId(), targetSurface->surfacePropertyChan
gedOnlyFromDescendant(), targetSurface->contentRect(), renderSurfaceLayerList[i]
->maskLayer(), renderSurfaceLayerList[i]->filters(), renderSurfaceLayerList[i]->
filter().get()); |
61 } | 63 } |
62 | 64 |
63 root->resetAllChangeTrackingForSubtree(); | 65 root->resetAllChangeTrackingForSubtree(); |
64 } | 66 } |
65 | 67 |
66 scoped_ptr<LayerImpl> createTestTreeWithOneSurface() | 68 class DamageTrackerTest : public testing::Test { |
67 { | 69 public: |
68 scoped_ptr<LayerImpl> root = LayerImpl::create(1); | 70 DamageTrackerTest() |
69 scoped_ptr<LayerImpl> child = LayerImpl::create(2); | 71 : m_hostImpl(&m_proxy) |
| 72 { |
| 73 } |
70 | 74 |
71 root->setPosition(gfx::PointF()); | 75 scoped_ptr<LayerImpl> createTestTreeWithOneSurface() |
72 root->setAnchorPoint(gfx::PointF()); | 76 { |
73 root->setBounds(gfx::Size(500, 500)); | 77 scoped_ptr<LayerImpl> root = LayerImpl::create(&m_hostImpl, 1); |
74 root->setContentBounds(gfx::Size(500, 500)); | 78 scoped_ptr<LayerImpl> child = LayerImpl::create(&m_hostImpl, 2); |
75 root->setDrawsContent(true); | |
76 root->createRenderSurface(); | |
77 root->renderSurface()->setContentRect(gfx::Rect(gfx::Point(), gfx::Size(500,
500))); | |
78 | 79 |
79 child->setPosition(gfx::PointF(100, 100)); | 80 root->setPosition(gfx::PointF()); |
80 child->setAnchorPoint(gfx::PointF()); | 81 root->setAnchorPoint(gfx::PointF()); |
81 child->setBounds(gfx::Size(30, 30)); | 82 root->setBounds(gfx::Size(500, 500)); |
82 child->setContentBounds(gfx::Size(30, 30)); | 83 root->setContentBounds(gfx::Size(500, 500)); |
83 child->setDrawsContent(true); | 84 root->setDrawsContent(true); |
84 root->addChild(child.Pass()); | 85 root->createRenderSurface(); |
| 86 root->renderSurface()->setContentRect(gfx::Rect(gfx::Point(), gfx::Size(
500, 500))); |
85 | 87 |
86 return root.Pass(); | 88 child->setPosition(gfx::PointF(100, 100)); |
87 } | 89 child->setAnchorPoint(gfx::PointF()); |
| 90 child->setBounds(gfx::Size(30, 30)); |
| 91 child->setContentBounds(gfx::Size(30, 30)); |
| 92 child->setDrawsContent(true); |
| 93 root->addChild(child.Pass()); |
88 | 94 |
89 scoped_ptr<LayerImpl> createTestTreeWithTwoSurfaces() | 95 return root.Pass(); |
90 { | 96 } |
91 // This test tree has two render surfaces: one for the root, and one for | |
92 // child1. Additionally, the root has a second child layer, and child1 has t
wo | |
93 // children of its own. | |
94 | 97 |
95 scoped_ptr<LayerImpl> root = LayerImpl::create(1); | 98 scoped_ptr<LayerImpl> createTestTreeWithTwoSurfaces() |
96 scoped_ptr<LayerImpl> child1 = LayerImpl::create(2); | 99 { |
97 scoped_ptr<LayerImpl> child2 = LayerImpl::create(3); | 100 // This test tree has two render surfaces: one for the root, and one for |
98 scoped_ptr<LayerImpl> grandChild1 = LayerImpl::create(4); | 101 // child1. Additionally, the root has a second child layer, and child1 h
as two |
99 scoped_ptr<LayerImpl> grandChild2 = LayerImpl::create(5); | 102 // children of its own. |
100 | 103 |
101 root->setPosition(gfx::PointF()); | 104 scoped_ptr<LayerImpl> root = LayerImpl::create(&m_hostImpl, 1); |
102 root->setAnchorPoint(gfx::PointF()); | 105 scoped_ptr<LayerImpl> child1 = LayerImpl::create(&m_hostImpl, 2); |
103 root->setBounds(gfx::Size(500, 500)); | 106 scoped_ptr<LayerImpl> child2 = LayerImpl::create(&m_hostImpl, 3); |
104 root->setContentBounds(gfx::Size(500, 500)); | 107 scoped_ptr<LayerImpl> grandChild1 = LayerImpl::create(&m_hostImpl, 4); |
105 root->setDrawsContent(true); | 108 scoped_ptr<LayerImpl> grandChild2 = LayerImpl::create(&m_hostImpl, 5); |
106 root->createRenderSurface(); | |
107 root->renderSurface()->setContentRect(gfx::Rect(gfx::Point(), gfx::Size(500,
500))); | |
108 | 109 |
109 child1->setPosition(gfx::PointF(100, 100)); | 110 root->setPosition(gfx::PointF()); |
110 child1->setAnchorPoint(gfx::PointF()); | 111 root->setAnchorPoint(gfx::PointF()); |
111 child1->setBounds(gfx::Size(30, 30)); | 112 root->setBounds(gfx::Size(500, 500)); |
112 child1->setContentBounds(gfx::Size(30, 30)); | 113 root->setContentBounds(gfx::Size(500, 500)); |
113 child1->setOpacity(0.5); // with a child that drawsContent, this will cause
the layer to create its own renderSurface. | 114 root->setDrawsContent(true); |
114 child1->setDrawsContent(false); // this layer does not draw, but is intended
to create its own renderSurface. | 115 root->createRenderSurface(); |
115 child1->setForceRenderSurface(true); | 116 root->renderSurface()->setContentRect(gfx::Rect(gfx::Point(), gfx::Size(
500, 500))); |
116 | 117 |
117 child2->setPosition(gfx::PointF(11, 11)); | 118 child1->setPosition(gfx::PointF(100, 100)); |
118 child2->setAnchorPoint(gfx::PointF()); | 119 child1->setAnchorPoint(gfx::PointF()); |
119 child2->setBounds(gfx::Size(18, 18)); | 120 child1->setBounds(gfx::Size(30, 30)); |
120 child2->setContentBounds(gfx::Size(18, 18)); | 121 child1->setContentBounds(gfx::Size(30, 30)); |
121 child2->setDrawsContent(true); | 122 child1->setOpacity(0.5); // with a child that drawsContent, this will ca
use the layer to create its own renderSurface. |
| 123 child1->setDrawsContent(false); // this layer does not draw, but is inte
nded to create its own renderSurface. |
| 124 child1->setForceRenderSurface(true); |
122 | 125 |
123 grandChild1->setPosition(gfx::PointF(200, 200)); | 126 child2->setPosition(gfx::PointF(11, 11)); |
124 grandChild1->setAnchorPoint(gfx::PointF()); | 127 child2->setAnchorPoint(gfx::PointF()); |
125 grandChild1->setBounds(gfx::Size(6, 8)); | 128 child2->setBounds(gfx::Size(18, 18)); |
126 grandChild1->setContentBounds(gfx::Size(6, 8)); | 129 child2->setContentBounds(gfx::Size(18, 18)); |
127 grandChild1->setDrawsContent(true); | 130 child2->setDrawsContent(true); |
128 | 131 |
129 grandChild2->setPosition(gfx::PointF(190, 190)); | 132 grandChild1->setPosition(gfx::PointF(200, 200)); |
130 grandChild2->setAnchorPoint(gfx::PointF()); | 133 grandChild1->setAnchorPoint(gfx::PointF()); |
131 grandChild2->setBounds(gfx::Size(6, 8)); | 134 grandChild1->setBounds(gfx::Size(6, 8)); |
132 grandChild2->setContentBounds(gfx::Size(6, 8)); | 135 grandChild1->setContentBounds(gfx::Size(6, 8)); |
133 grandChild2->setDrawsContent(true); | 136 grandChild1->setDrawsContent(true); |
134 | 137 |
135 child1->addChild(grandChild1.Pass()); | 138 grandChild2->setPosition(gfx::PointF(190, 190)); |
136 child1->addChild(grandChild2.Pass()); | 139 grandChild2->setAnchorPoint(gfx::PointF()); |
137 root->addChild(child1.Pass()); | 140 grandChild2->setBounds(gfx::Size(6, 8)); |
138 root->addChild(child2.Pass()); | 141 grandChild2->setContentBounds(gfx::Size(6, 8)); |
| 142 grandChild2->setDrawsContent(true); |
139 | 143 |
140 return root.Pass(); | 144 child1->addChild(grandChild1.Pass()); |
141 } | 145 child1->addChild(grandChild2.Pass()); |
| 146 root->addChild(child1.Pass()); |
| 147 root->addChild(child2.Pass()); |
142 | 148 |
143 scoped_ptr<LayerImpl> createAndSetUpTestTreeWithOneSurface() | 149 return root.Pass(); |
144 { | 150 } |
145 scoped_ptr<LayerImpl> root = createTestTreeWithOneSurface(); | |
146 | 151 |
147 // Setup includes going past the first frame which always damages everything
, so | 152 scoped_ptr<LayerImpl> createAndSetUpTestTreeWithOneSurface() |
148 // that we can actually perform specific tests. | 153 { |
149 emulateDrawingOneFrame(root.get()); | 154 scoped_ptr<LayerImpl> root = createTestTreeWithOneSurface(); |
150 | 155 |
151 return root.Pass(); | 156 // Setup includes going past the first frame which always damages everyt
hing, so |
152 } | 157 // that we can actually perform specific tests. |
| 158 emulateDrawingOneFrame(root.get()); |
153 | 159 |
154 scoped_ptr<LayerImpl> createAndSetUpTestTreeWithTwoSurfaces() | 160 return root.Pass(); |
155 { | 161 } |
156 scoped_ptr<LayerImpl> root = createTestTreeWithTwoSurfaces(); | |
157 | 162 |
158 // Setup includes going past the first frame which always damages everything
, so | 163 scoped_ptr<LayerImpl> createAndSetUpTestTreeWithTwoSurfaces() |
159 // that we can actually perform specific tests. | 164 { |
160 emulateDrawingOneFrame(root.get()); | 165 scoped_ptr<LayerImpl> root = createTestTreeWithTwoSurfaces(); |
161 | 166 |
162 return root.Pass(); | 167 // Setup includes going past the first frame which always damages everyt
hing, so |
163 } | 168 // that we can actually perform specific tests. |
| 169 emulateDrawingOneFrame(root.get()); |
164 | 170 |
165 class DamageTrackerTest : public testing::Test { | 171 return root.Pass(); |
| 172 } |
| 173 |
| 174 protected: |
| 175 FakeImplProxy m_proxy; |
| 176 FakeLayerTreeHostImpl m_hostImpl; |
166 }; | 177 }; |
167 | 178 |
168 TEST_F(DamageTrackerTest, sanityCheckTestTreeWithOneSurface) | 179 TEST_F(DamageTrackerTest, sanityCheckTestTreeWithOneSurface) |
169 { | 180 { |
170 // Sanity check that the simple test tree will actually produce the expected
render | 181 // Sanity check that the simple test tree will actually produce the expected
render |
171 // surfaces and layer lists. | 182 // surfaces and layer lists. |
172 | 183 |
173 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); | 184 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); |
174 | 185 |
175 EXPECT_EQ(2u, root->renderSurface()->layerList().size()); | 186 EXPECT_EQ(2u, root->renderSurface()->layerList().size()); |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 | 529 |
519 TEST_F(DamageTrackerTest, verifyDamageForAddingAndRemovingLayer) | 530 TEST_F(DamageTrackerTest, verifyDamageForAddingAndRemovingLayer) |
520 { | 531 { |
521 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); | 532 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); |
522 LayerImpl* child1 = root->children()[0]; | 533 LayerImpl* child1 = root->children()[0]; |
523 | 534 |
524 // CASE 1: Adding a new layer should cause the appropriate damage. | 535 // CASE 1: Adding a new layer should cause the appropriate damage. |
525 // | 536 // |
526 clearDamageForAllSurfaces(root.get()); | 537 clearDamageForAllSurfaces(root.get()); |
527 { | 538 { |
528 scoped_ptr<LayerImpl> child2 = LayerImpl::create(3); | 539 scoped_ptr<LayerImpl> child2 = LayerImpl::create(&m_hostImpl, 3); |
529 child2->setPosition(gfx::PointF(400, 380)); | 540 child2->setPosition(gfx::PointF(400, 380)); |
530 child2->setAnchorPoint(gfx::PointF()); | 541 child2->setAnchorPoint(gfx::PointF()); |
531 child2->setBounds(gfx::Size(6, 8)); | 542 child2->setBounds(gfx::Size(6, 8)); |
532 child2->setContentBounds(gfx::Size(6, 8)); | 543 child2->setContentBounds(gfx::Size(6, 8)); |
533 child2->setDrawsContent(true); | 544 child2->setDrawsContent(true); |
534 root->addChild(child2.Pass()); | 545 root->addChild(child2.Pass()); |
535 } | 546 } |
536 emulateDrawingOneFrame(root.get()); | 547 emulateDrawingOneFrame(root.get()); |
537 | 548 |
538 // Sanity check - all 3 layers should be on the same render surface; render
surfaces are tested elsewhere. | 549 // Sanity check - all 3 layers should be on the same render surface; render
surfaces are tested elsewhere. |
(...skipping 19 matching lines...) Expand all Loading... |
558 | 569 |
559 TEST_F(DamageTrackerTest, verifyDamageForNewUnchangedLayer) | 570 TEST_F(DamageTrackerTest, verifyDamageForNewUnchangedLayer) |
560 { | 571 { |
561 // If child2 is added to the layer tree, but it doesn't have any explicit da
mage of | 572 // If child2 is added to the layer tree, but it doesn't have any explicit da
mage of |
562 // its own, it should still indeed damage the target surface. | 573 // its own, it should still indeed damage the target surface. |
563 | 574 |
564 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); | 575 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); |
565 | 576 |
566 clearDamageForAllSurfaces(root.get()); | 577 clearDamageForAllSurfaces(root.get()); |
567 { | 578 { |
568 scoped_ptr<LayerImpl> child2 = LayerImpl::create(3); | 579 scoped_ptr<LayerImpl> child2 = LayerImpl::create(&m_hostImpl, 3); |
569 child2->setPosition(gfx::PointF(400, 380)); | 580 child2->setPosition(gfx::PointF(400, 380)); |
570 child2->setAnchorPoint(gfx::PointF()); | 581 child2->setAnchorPoint(gfx::PointF()); |
571 child2->setBounds(gfx::Size(6, 8)); | 582 child2->setBounds(gfx::Size(6, 8)); |
572 child2->setContentBounds(gfx::Size(6, 8)); | 583 child2->setContentBounds(gfx::Size(6, 8)); |
573 child2->setDrawsContent(true); | 584 child2->setDrawsContent(true); |
574 child2->resetAllChangeTrackingForSubtree(); | 585 child2->resetAllChangeTrackingForSubtree(); |
575 // Sanity check the initial conditions of the test, if these asserts tri
gger, it | 586 // Sanity check the initial conditions of the test, if these asserts tri
gger, it |
576 // means the test no longer actually covers the intended scenario. | 587 // means the test no longer actually covers the intended scenario. |
577 ASSERT_FALSE(child2->layerPropertyChanged()); | 588 ASSERT_FALSE(child2->layerPropertyChanged()); |
578 ASSERT_TRUE(child2->updateRect().IsEmpty()); | 589 ASSERT_TRUE(child2->updateRect().IsEmpty()); |
579 root->addChild(child2.Pass()); | 590 root->addChild(child2.Pass()); |
580 } | 591 } |
581 emulateDrawingOneFrame(root.get()); | 592 emulateDrawingOneFrame(root.get()); |
582 | 593 |
583 // Sanity check - all 3 layers should be on the same render surface; render
surfaces are tested elsewhere. | 594 // Sanity check - all 3 layers should be on the same render surface; render
surfaces are tested elsewhere. |
584 ASSERT_EQ(3u, root->renderSurface()->layerList().size()); | 595 ASSERT_EQ(3u, root->renderSurface()->layerList().size()); |
585 | 596 |
586 gfx::RectF rootDamageRect = root->renderSurface()->damageTracker()->currentD
amageRect(); | 597 gfx::RectF rootDamageRect = root->renderSurface()->damageTracker()->currentD
amageRect(); |
587 EXPECT_FLOAT_RECT_EQ(gfx::RectF(400, 380, 6, 8), rootDamageRect); | 598 EXPECT_FLOAT_RECT_EQ(gfx::RectF(400, 380, 6, 8), rootDamageRect); |
588 } | 599 } |
589 | 600 |
590 TEST_F(DamageTrackerTest, verifyDamageForMultipleLayers) | 601 TEST_F(DamageTrackerTest, verifyDamageForMultipleLayers) |
591 { | 602 { |
592 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); | 603 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); |
593 LayerImpl* child1 = root->children()[0]; | 604 LayerImpl* child1 = root->children()[0]; |
594 | 605 |
595 // In this test we don't want the above tree manipulation to be considered p
art of the same frame. | 606 // In this test we don't want the above tree manipulation to be considered p
art of the same frame. |
596 clearDamageForAllSurfaces(root.get()); | 607 clearDamageForAllSurfaces(root.get()); |
597 { | 608 { |
598 scoped_ptr<LayerImpl> child2 = LayerImpl::create(3); | 609 scoped_ptr<LayerImpl> child2 = LayerImpl::create(&m_hostImpl, 3); |
599 child2->setPosition(gfx::PointF(400, 380)); | 610 child2->setPosition(gfx::PointF(400, 380)); |
600 child2->setAnchorPoint(gfx::PointF()); | 611 child2->setAnchorPoint(gfx::PointF()); |
601 child2->setBounds(gfx::Size(6, 8)); | 612 child2->setBounds(gfx::Size(6, 8)); |
602 child2->setContentBounds(gfx::Size(6, 8)); | 613 child2->setContentBounds(gfx::Size(6, 8)); |
603 child2->setDrawsContent(true); | 614 child2->setDrawsContent(true); |
604 root->addChild(child2.Pass()); | 615 root->addChild(child2.Pass()); |
605 } | 616 } |
606 LayerImpl* child2 = root->children()[1]; | 617 LayerImpl* child2 = root->children()[1]; |
607 emulateDrawingOneFrame(root.get()); | 618 emulateDrawingOneFrame(root.get()); |
608 | 619 |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
809 LayerImpl* grandChild2 = child1->children()[1]; | 820 LayerImpl* grandChild2 = child1->children()[1]; |
810 | 821 |
811 // Damage on a surface that has a reflection should cause the target surface
to | 822 // Damage on a surface that has a reflection should cause the target surface
to |
812 // receive the surface's damage and the surface's reflected damage. | 823 // receive the surface's damage and the surface's reflected damage. |
813 | 824 |
814 // For this test case, we modify grandChild2, and add grandChild3 to extend
the bounds | 825 // For this test case, we modify grandChild2, and add grandChild3 to extend
the bounds |
815 // of child1's surface. This way, we can test reflection changes without cha
nging | 826 // of child1's surface. This way, we can test reflection changes without cha
nging |
816 // contentBounds of the surface. | 827 // contentBounds of the surface. |
817 grandChild2->setPosition(gfx::PointF(180, 180)); | 828 grandChild2->setPosition(gfx::PointF(180, 180)); |
818 { | 829 { |
819 scoped_ptr<LayerImpl> grandChild3 = LayerImpl::create(6); | 830 scoped_ptr<LayerImpl> grandChild3 = LayerImpl::create(&m_hostImpl, 6); |
820 grandChild3->setPosition(gfx::PointF(240, 240)); | 831 grandChild3->setPosition(gfx::PointF(240, 240)); |
821 grandChild3->setAnchorPoint(gfx::PointF()); | 832 grandChild3->setAnchorPoint(gfx::PointF()); |
822 grandChild3->setBounds(gfx::Size(10, 10)); | 833 grandChild3->setBounds(gfx::Size(10, 10)); |
823 grandChild3->setContentBounds(gfx::Size(10, 10)); | 834 grandChild3->setContentBounds(gfx::Size(10, 10)); |
824 grandChild3->setDrawsContent(true); | 835 grandChild3->setDrawsContent(true); |
825 child1->addChild(grandChild3.Pass()); | 836 child1->addChild(grandChild3.Pass()); |
826 } | 837 } |
827 child1->setOpacity(0.5); | 838 child1->setOpacity(0.5); |
828 emulateDrawingOneFrame(root.get()); | 839 emulateDrawingOneFrame(root.get()); |
829 | 840 |
830 // CASE 1: adding a reflection about the left edge of grandChild1. | 841 // CASE 1: adding a reflection about the left edge of grandChild1. |
831 // | 842 // |
832 clearDamageForAllSurfaces(root.get()); | 843 clearDamageForAllSurfaces(root.get()); |
833 { | 844 { |
834 scoped_ptr<LayerImpl> grandChild1Replica = LayerImpl::create(7); | 845 scoped_ptr<LayerImpl> grandChild1Replica = LayerImpl::create(&m_hostImpl
, 7); |
835 grandChild1Replica->setPosition(gfx::PointF()); | 846 grandChild1Replica->setPosition(gfx::PointF()); |
836 grandChild1Replica->setAnchorPoint(gfx::PointF()); | 847 grandChild1Replica->setAnchorPoint(gfx::PointF()); |
837 gfx::Transform reflection; | 848 gfx::Transform reflection; |
838 reflection.Scale3d(-1, 1, 1); | 849 reflection.Scale3d(-1, 1, 1); |
839 grandChild1Replica->setTransform(reflection); | 850 grandChild1Replica->setTransform(reflection); |
840 grandChild1->setReplicaLayer(grandChild1Replica.Pass()); | 851 grandChild1->setReplicaLayer(grandChild1Replica.Pass()); |
841 } | 852 } |
842 emulateDrawingOneFrame(root.get()); | 853 emulateDrawingOneFrame(root.get()); |
843 | 854 |
844 gfx::RectF grandChildDamageRect = grandChild1->renderSurface()->damageTracke
r()->currentDamageRect(); | 855 gfx::RectF grandChildDamageRect = grandChild1->renderSurface()->damageTracke
r()->currentDamageRect(); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
892 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); | 903 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); |
893 LayerImpl* child = root->children()[0]; | 904 LayerImpl* child = root->children()[0]; |
894 | 905 |
895 // In the current implementation of the damage tracker, changes to mask laye
rs should | 906 // In the current implementation of the damage tracker, changes to mask laye
rs should |
896 // damage the entire corresponding surface. | 907 // damage the entire corresponding surface. |
897 | 908 |
898 clearDamageForAllSurfaces(root.get()); | 909 clearDamageForAllSurfaces(root.get()); |
899 | 910 |
900 // Set up the mask layer. | 911 // Set up the mask layer. |
901 { | 912 { |
902 scoped_ptr<LayerImpl> maskLayer = LayerImpl::create(3); | 913 scoped_ptr<LayerImpl> maskLayer = LayerImpl::create(&m_hostImpl, 3); |
903 maskLayer->setPosition(child->position()); | 914 maskLayer->setPosition(child->position()); |
904 maskLayer->setAnchorPoint(gfx::PointF()); | 915 maskLayer->setAnchorPoint(gfx::PointF()); |
905 maskLayer->setBounds(child->bounds()); | 916 maskLayer->setBounds(child->bounds()); |
906 maskLayer->setContentBounds(child->bounds()); | 917 maskLayer->setContentBounds(child->bounds()); |
907 child->setMaskLayer(maskLayer.Pass()); | 918 child->setMaskLayer(maskLayer.Pass()); |
908 } | 919 } |
909 LayerImpl* maskLayer = child->maskLayer(); | 920 LayerImpl* maskLayer = child->maskLayer(); |
910 | 921 |
911 // Add opacity and a grandChild so that the render surface persists even aft
er we remove the mask. | 922 // Add opacity and a grandChild so that the render surface persists even aft
er we remove the mask. |
912 child->setOpacity(0.5); | 923 child->setOpacity(0.5); |
913 { | 924 { |
914 scoped_ptr<LayerImpl> grandChild = LayerImpl::create(4); | 925 scoped_ptr<LayerImpl> grandChild = LayerImpl::create(&m_hostImpl, 4); |
915 grandChild->setPosition(gfx::PointF(2, 2)); | 926 grandChild->setPosition(gfx::PointF(2, 2)); |
916 grandChild->setAnchorPoint(gfx::PointF()); | 927 grandChild->setAnchorPoint(gfx::PointF()); |
917 grandChild->setBounds(gfx::Size(2, 2)); | 928 grandChild->setBounds(gfx::Size(2, 2)); |
918 grandChild->setContentBounds(gfx::Size(2, 2)); | 929 grandChild->setContentBounds(gfx::Size(2, 2)); |
919 grandChild->setDrawsContent(true); | 930 grandChild->setDrawsContent(true); |
920 child->addChild(grandChild.Pass()); | 931 child->addChild(grandChild.Pass()); |
921 } | 932 } |
922 emulateDrawingOneFrame(root.get()); | 933 emulateDrawingOneFrame(root.get()); |
923 | 934 |
924 // Sanity check that a new surface was created for the child. | 935 // Sanity check that a new surface was created for the child. |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
977 LayerImpl* child1 = root->children()[0]; | 988 LayerImpl* child1 = root->children()[0]; |
978 LayerImpl* grandChild1 = child1->children()[0]; | 989 LayerImpl* grandChild1 = child1->children()[0]; |
979 | 990 |
980 // Changes to a replica's mask should not damage the original surface, becau
se it is | 991 // Changes to a replica's mask should not damage the original surface, becau
se it is |
981 // not masked. But it does damage the ancestor target surface. | 992 // not masked. But it does damage the ancestor target surface. |
982 | 993 |
983 clearDamageForAllSurfaces(root.get()); | 994 clearDamageForAllSurfaces(root.get()); |
984 | 995 |
985 // Create a reflection about the left edge of grandChild1. | 996 // Create a reflection about the left edge of grandChild1. |
986 { | 997 { |
987 scoped_ptr<LayerImpl> grandChild1Replica = LayerImpl::create(6); | 998 scoped_ptr<LayerImpl> grandChild1Replica = LayerImpl::create(&m_hostImpl
, 6); |
988 grandChild1Replica->setPosition(gfx::PointF()); | 999 grandChild1Replica->setPosition(gfx::PointF()); |
989 grandChild1Replica->setAnchorPoint(gfx::PointF()); | 1000 grandChild1Replica->setAnchorPoint(gfx::PointF()); |
990 gfx::Transform reflection; | 1001 gfx::Transform reflection; |
991 reflection.Scale3d(-1, 1, 1); | 1002 reflection.Scale3d(-1, 1, 1); |
992 grandChild1Replica->setTransform(reflection); | 1003 grandChild1Replica->setTransform(reflection); |
993 grandChild1->setReplicaLayer(grandChild1Replica.Pass()); | 1004 grandChild1->setReplicaLayer(grandChild1Replica.Pass()); |
994 } | 1005 } |
995 LayerImpl* grandChild1Replica = grandChild1->replicaLayer(); | 1006 LayerImpl* grandChild1Replica = grandChild1->replicaLayer(); |
996 | 1007 |
997 // Set up the mask layer on the replica layer | 1008 // Set up the mask layer on the replica layer |
998 { | 1009 { |
999 scoped_ptr<LayerImpl> replicaMaskLayer = LayerImpl::create(7); | 1010 scoped_ptr<LayerImpl> replicaMaskLayer = LayerImpl::create(&m_hostImpl,
7); |
1000 replicaMaskLayer->setPosition(gfx::PointF()); | 1011 replicaMaskLayer->setPosition(gfx::PointF()); |
1001 replicaMaskLayer->setAnchorPoint(gfx::PointF()); | 1012 replicaMaskLayer->setAnchorPoint(gfx::PointF()); |
1002 replicaMaskLayer->setBounds(grandChild1->bounds()); | 1013 replicaMaskLayer->setBounds(grandChild1->bounds()); |
1003 replicaMaskLayer->setContentBounds(grandChild1->bounds()); | 1014 replicaMaskLayer->setContentBounds(grandChild1->bounds()); |
1004 grandChild1Replica->setMaskLayer(replicaMaskLayer.Pass()); | 1015 grandChild1Replica->setMaskLayer(replicaMaskLayer.Pass()); |
1005 } | 1016 } |
1006 LayerImpl* replicaMaskLayer = grandChild1Replica->maskLayer(); | 1017 LayerImpl* replicaMaskLayer = grandChild1Replica->maskLayer(); |
1007 | 1018 |
1008 emulateDrawingOneFrame(root.get()); | 1019 emulateDrawingOneFrame(root.get()); |
1009 | 1020 |
(...skipping 29 matching lines...) Expand all Loading... |
1039 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithTwoSurfaces(); | 1050 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithTwoSurfaces(); |
1040 LayerImpl* child1 = root->children()[0]; | 1051 LayerImpl* child1 = root->children()[0]; |
1041 LayerImpl* grandChild1 = child1->children()[0]; | 1052 LayerImpl* grandChild1 = child1->children()[0]; |
1042 | 1053 |
1043 // Verify that the correct replicaOriginTransform is used for the replicaMas
k; | 1054 // Verify that the correct replicaOriginTransform is used for the replicaMas
k; |
1044 clearDamageForAllSurfaces(root.get()); | 1055 clearDamageForAllSurfaces(root.get()); |
1045 | 1056 |
1046 grandChild1->setAnchorPoint(gfx::PointF(1, 0)); // This is not exactly the a
nchor being tested, but by convention its expected to be the same as the replica
's anchor point. | 1057 grandChild1->setAnchorPoint(gfx::PointF(1, 0)); // This is not exactly the a
nchor being tested, but by convention its expected to be the same as the replica
's anchor point. |
1047 | 1058 |
1048 { | 1059 { |
1049 scoped_ptr<LayerImpl> grandChild1Replica = LayerImpl::create(6); | 1060 scoped_ptr<LayerImpl> grandChild1Replica = LayerImpl::create(&m_hostImpl
, 6); |
1050 grandChild1Replica->setPosition(gfx::PointF()); | 1061 grandChild1Replica->setPosition(gfx::PointF()); |
1051 grandChild1Replica->setAnchorPoint(gfx::PointF(1, 0)); // This is the an
chor being tested. | 1062 grandChild1Replica->setAnchorPoint(gfx::PointF(1, 0)); // This is the an
chor being tested. |
1052 gfx::Transform reflection; | 1063 gfx::Transform reflection; |
1053 reflection.Scale3d(-1, 1, 1); | 1064 reflection.Scale3d(-1, 1, 1); |
1054 grandChild1Replica->setTransform(reflection); | 1065 grandChild1Replica->setTransform(reflection); |
1055 grandChild1->setReplicaLayer(grandChild1Replica.Pass()); | 1066 grandChild1->setReplicaLayer(grandChild1Replica.Pass()); |
1056 } | 1067 } |
1057 LayerImpl* grandChild1Replica = grandChild1->replicaLayer(); | 1068 LayerImpl* grandChild1Replica = grandChild1->replicaLayer(); |
1058 | 1069 |
1059 // Set up the mask layer on the replica layer | 1070 // Set up the mask layer on the replica layer |
1060 { | 1071 { |
1061 scoped_ptr<LayerImpl> replicaMaskLayer = LayerImpl::create(7); | 1072 scoped_ptr<LayerImpl> replicaMaskLayer = LayerImpl::create(&m_hostImpl,
7); |
1062 replicaMaskLayer->setPosition(gfx::PointF()); | 1073 replicaMaskLayer->setPosition(gfx::PointF()); |
1063 replicaMaskLayer->setAnchorPoint(gfx::PointF()); // note, this is not th
e anchor being tested. | 1074 replicaMaskLayer->setAnchorPoint(gfx::PointF()); // note, this is not th
e anchor being tested. |
1064 replicaMaskLayer->setBounds(grandChild1->bounds()); | 1075 replicaMaskLayer->setBounds(grandChild1->bounds()); |
1065 replicaMaskLayer->setContentBounds(grandChild1->bounds()); | 1076 replicaMaskLayer->setContentBounds(grandChild1->bounds()); |
1066 grandChild1Replica->setMaskLayer(replicaMaskLayer.Pass()); | 1077 grandChild1Replica->setMaskLayer(replicaMaskLayer.Pass()); |
1067 } | 1078 } |
1068 LayerImpl* replicaMaskLayer = grandChild1Replica->maskLayer(); | 1079 LayerImpl* replicaMaskLayer = grandChild1Replica->maskLayer(); |
1069 | 1080 |
1070 emulateDrawingOneFrame(root.get()); | 1081 emulateDrawingOneFrame(root.get()); |
1071 | 1082 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 emulateDrawingOneFrame(root.get()); | 1116 emulateDrawingOneFrame(root.get()); |
1106 rootDamageRect = root->renderSurface()->damageTracker()->currentDamageRect()
; | 1117 rootDamageRect = root->renderSurface()->damageTracker()->currentDamageRect()
; |
1107 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 500, 500), rootDamageRect); | 1118 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 500, 500), rootDamageRect); |
1108 } | 1119 } |
1109 | 1120 |
1110 TEST_F(DamageTrackerTest, verifyDamageForEmptyLayerList) | 1121 TEST_F(DamageTrackerTest, verifyDamageForEmptyLayerList) |
1111 { | 1122 { |
1112 // Though it should never happen, its a good idea to verify that the damage
tracker | 1123 // Though it should never happen, its a good idea to verify that the damage
tracker |
1113 // does not crash when it receives an empty layerList. | 1124 // does not crash when it receives an empty layerList. |
1114 | 1125 |
1115 scoped_ptr<LayerImpl> root = LayerImpl::create(1); | 1126 scoped_ptr<LayerImpl> root = LayerImpl::create(&m_hostImpl, 1); |
1116 root->createRenderSurface(); | 1127 root->createRenderSurface(); |
1117 | 1128 |
1118 ASSERT_TRUE(root == root->renderTarget()); | 1129 ASSERT_TRUE(root == root->renderTarget()); |
1119 RenderSurfaceImpl* targetSurface = root->renderSurface(); | 1130 RenderSurfaceImpl* targetSurface = root->renderSurface(); |
1120 targetSurface->clearLayerLists(); | 1131 targetSurface->clearLayerLists(); |
1121 targetSurface->damageTracker()->updateDamageTrackingState(targetSurface->lay
erList(), targetSurface->owningLayerId(), false, gfx::Rect(), 0, WebFilterOperat
ions(), 0); | 1132 targetSurface->damageTracker()->updateDamageTrackingState(targetSurface->lay
erList(), targetSurface->owningLayerId(), false, gfx::Rect(), 0, WebFilterOperat
ions(), 0); |
1122 | 1133 |
1123 gfx::RectF damageRect = targetSurface->damageTracker()->currentDamageRect(); | 1134 gfx::RectF damageRect = targetSurface->damageTracker()->currentDamageRect(); |
1124 EXPECT_TRUE(damageRect.IsEmpty()); | 1135 EXPECT_TRUE(damageRect.IsEmpty()); |
1125 } | 1136 } |
(...skipping 25 matching lines...) Expand all Loading... |
1151 EXPECT_TRUE(rootDamageRect.IsEmpty()); | 1162 EXPECT_TRUE(rootDamageRect.IsEmpty()); |
1152 | 1163 |
1153 // Damage should remain empty even after one frame, since there's yet no new
damage | 1164 // Damage should remain empty even after one frame, since there's yet no new
damage |
1154 emulateDrawingOneFrame(root.get()); | 1165 emulateDrawingOneFrame(root.get()); |
1155 rootDamageRect = root->renderSurface()->damageTracker()->currentDamageRect()
; | 1166 rootDamageRect = root->renderSurface()->damageTracker()->currentDamageRect()
; |
1156 EXPECT_TRUE(rootDamageRect.IsEmpty()); | 1167 EXPECT_TRUE(rootDamageRect.IsEmpty()); |
1157 } | 1168 } |
1158 | 1169 |
1159 } // namespace | 1170 } // namespace |
1160 } // namespace cc | 1171 } // namespace cc |
OLD | NEW |