| 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_sorter.h" | 8 #include "cc/layer_sorter.h" |
| 9 #include "cc/layer_tree_host_common.h" | 9 #include "cc/layer_tree_host_common.h" |
| 10 #include "cc/math_util.h" | 10 #include "cc/math_util.h" |
| 11 #include "cc/single_thread_proxy.h" | 11 #include "cc/single_thread_proxy.h" |
| 12 #include "cc/test/geometry_test_utils.h" | 12 #include "cc/test/geometry_test_utils.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 #include "third_party/skia/include/effects/SkBlurImageFilter.h" | 14 #include "third_party/skia/include/effects/SkBlurImageFilter.h" |
| 15 #include <public/WebFilterOperation.h> | 15 #include <public/WebFilterOperation.h> |
| 16 #include <public/WebFilterOperations.h> | 16 #include <public/WebFilterOperations.h> |
| 17 | 17 |
| 18 using namespace WebKit; | 18 using namespace WebKit; |
| 19 using namespace WebKitTests; | 19 using namespace WebKitTests; |
| 20 | 20 |
| 21 using gfx::Transform; |
| 22 |
| 21 namespace cc { | 23 namespace cc { |
| 22 namespace { | 24 namespace { |
| 23 | 25 |
| 24 void executeCalculateDrawTransformsAndVisibility(LayerImpl* root, std::vector<La
yerImpl*>& renderSurfaceLayerList) | 26 void executeCalculateDrawTransformsAndVisibility(LayerImpl* root, std::vector<La
yerImpl*>& renderSurfaceLayerList) |
| 25 { | 27 { |
| 26 LayerSorter layerSorter; | 28 LayerSorter layerSorter; |
| 27 int dummyMaxTextureSize = 512; | 29 int dummyMaxTextureSize = 512; |
| 28 | 30 |
| 29 // Sanity check: The test itself should create the root layer's render surfa
ce, so | 31 // Sanity check: The test itself should create the root layer's render surfa
ce, so |
| 30 // that the surface (and its damage tracker) can persist acros
s multiple | 32 // that the surface (and its damage tracker) can persist acros
s multiple |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 } | 280 } |
| 279 | 281 |
| 280 TEST_F(DamageTrackerTest, verifyDamageForTransformedLayer) | 282 TEST_F(DamageTrackerTest, verifyDamageForTransformedLayer) |
| 281 { | 283 { |
| 282 // If a layer is transformed, the damage rect should still enclose the entir
e | 284 // If a layer is transformed, the damage rect should still enclose the entir
e |
| 283 // transformed layer. | 285 // transformed layer. |
| 284 | 286 |
| 285 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); | 287 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); |
| 286 LayerImpl* child = root->children()[0]; | 288 LayerImpl* child = root->children()[0]; |
| 287 | 289 |
| 288 WebTransformationMatrix rotation; | 290 Transform rotation; |
| 289 rotation.rotate(45); | 291 rotation.PreconcatRotate(45); |
| 290 | 292 |
| 291 clearDamageForAllSurfaces(root.get()); | 293 clearDamageForAllSurfaces(root.get()); |
| 292 child->setAnchorPoint(gfx::PointF(0.5, 0.5)); | 294 child->setAnchorPoint(gfx::PointF(0.5, 0.5)); |
| 293 child->setPosition(gfx::PointF(85, 85)); | 295 child->setPosition(gfx::PointF(85, 85)); |
| 294 emulateDrawingOneFrame(root.get()); | 296 emulateDrawingOneFrame(root.get()); |
| 295 | 297 |
| 296 // Sanity check that the layer actually moved to (85, 85), damaging its old
location and new location. | 298 // Sanity check that the layer actually moved to (85, 85), damaging its old
location and new location. |
| 297 gfx::RectF rootDamageRect = root->renderSurface()->damageTracker()->currentD
amageRect(); | 299 gfx::RectF rootDamageRect = root->renderSurface()->damageTracker()->currentD
amageRect(); |
| 298 EXPECT_FLOAT_RECT_EQ(gfx::RectF(85, 85, 45, 45), rootDamageRect); | 300 EXPECT_FLOAT_RECT_EQ(gfx::RectF(85, 85, 45, 45), rootDamageRect); |
| 299 | 301 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 321 // | 323 // |
| 322 // The transform is constructed so that if w < 0 clipping is not performed,
the | 324 // The transform is constructed so that if w < 0 clipping is not performed,
the |
| 323 // incorrect rect will be very small, specifically: position (500.972504, 49
8.544617) and size 0.056610 x 2.910767. | 325 // incorrect rect will be very small, specifically: position (500.972504, 49
8.544617) and size 0.056610 x 2.910767. |
| 324 // Instead, the correctly transformed rect should actually be very huge (i.e
. in theory, -infinity on the left), | 326 // Instead, the correctly transformed rect should actually be very huge (i.e
. in theory, -infinity on the left), |
| 325 // and positioned so that the right-most bound rect will be approximately 50
1 units in root surface space. | 327 // and positioned so that the right-most bound rect will be approximately 50
1 units in root surface space. |
| 326 // | 328 // |
| 327 | 329 |
| 328 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); | 330 scoped_ptr<LayerImpl> root = createAndSetUpTestTreeWithOneSurface(); |
| 329 LayerImpl* child = root->children()[0]; | 331 LayerImpl* child = root->children()[0]; |
| 330 | 332 |
| 331 WebTransformationMatrix transform; | 333 Transform transform; |
| 332 transform.translate3d(500, 500, 0); | 334 transform.PreconcatTranslate3d(500, 500, 0); |
| 333 transform.applyPerspective(1); | 335 transform.PreconcatPerspectiveDepth(1); |
| 334 transform.rotate3d(0, 45, 0); | 336 MathUtil::rotateEulerAngles(&transform, 0, 45, 0); |
| 335 transform.translate3d(-50, -50, 0); | 337 transform.PreconcatTranslate3d(-50, -50, 0); |
| 336 | 338 |
| 337 // Set up the child | 339 // Set up the child |
| 338 child->setPosition(gfx::PointF(0, 0)); | 340 child->setPosition(gfx::PointF(0, 0)); |
| 339 child->setBounds(gfx::Size(100, 100)); | 341 child->setBounds(gfx::Size(100, 100)); |
| 340 child->setContentBounds(gfx::Size(100, 100)); | 342 child->setContentBounds(gfx::Size(100, 100)); |
| 341 child->setTransform(transform); | 343 child->setTransform(transform); |
| 342 emulateDrawingOneFrame(root.get()); | 344 emulateDrawingOneFrame(root.get()); |
| 343 | 345 |
| 344 // Sanity check that the child layer's bounds would actually get clipped by
w < 0, | 346 // Sanity check that the child layer's bounds would actually get clipped by
w < 0, |
| 345 // otherwise this test is not actually testing the intended scenario. | 347 // otherwise this test is not actually testing the intended scenario. |
| (...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 826 child1->setOpacity(0.5); | 828 child1->setOpacity(0.5); |
| 827 emulateDrawingOneFrame(root.get()); | 829 emulateDrawingOneFrame(root.get()); |
| 828 | 830 |
| 829 // CASE 1: adding a reflection about the left edge of grandChild1. | 831 // CASE 1: adding a reflection about the left edge of grandChild1. |
| 830 // | 832 // |
| 831 clearDamageForAllSurfaces(root.get()); | 833 clearDamageForAllSurfaces(root.get()); |
| 832 { | 834 { |
| 833 scoped_ptr<LayerImpl> grandChild1Replica = LayerImpl::create(7); | 835 scoped_ptr<LayerImpl> grandChild1Replica = LayerImpl::create(7); |
| 834 grandChild1Replica->setPosition(gfx::PointF()); | 836 grandChild1Replica->setPosition(gfx::PointF()); |
| 835 grandChild1Replica->setAnchorPoint(gfx::PointF()); | 837 grandChild1Replica->setAnchorPoint(gfx::PointF()); |
| 836 WebTransformationMatrix reflection; | 838 Transform reflection; |
| 837 reflection.scale3d(-1, 1, 1); | 839 reflection.PreconcatScale3d(-1, 1, 1); |
| 838 grandChild1Replica->setTransform(reflection); | 840 grandChild1Replica->setTransform(reflection); |
| 839 grandChild1->setReplicaLayer(grandChild1Replica.Pass()); | 841 grandChild1->setReplicaLayer(grandChild1Replica.Pass()); |
| 840 } | 842 } |
| 841 emulateDrawingOneFrame(root.get()); | 843 emulateDrawingOneFrame(root.get()); |
| 842 | 844 |
| 843 gfx::RectF grandChildDamageRect = grandChild1->renderSurface()->damageTracke
r()->currentDamageRect(); | 845 gfx::RectF grandChildDamageRect = grandChild1->renderSurface()->damageTracke
r()->currentDamageRect(); |
| 844 gfx::RectF childDamageRect = child1->renderSurface()->damageTracker()->curre
ntDamageRect(); | 846 gfx::RectF childDamageRect = child1->renderSurface()->damageTracker()->curre
ntDamageRect(); |
| 845 gfx::RectF rootDamageRect = root->renderSurface()->damageTracker()->currentD
amageRect(); | 847 gfx::RectF rootDamageRect = root->renderSurface()->damageTracker()->currentD
amageRect(); |
| 846 | 848 |
| 847 // The grandChild surface damage should not include its own replica. The chi
ld | 849 // The grandChild surface damage should not include its own replica. The chi
ld |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 979 // Changes to a replica's mask should not damage the original surface, becau
se it is | 981 // Changes to a replica's mask should not damage the original surface, becau
se it is |
| 980 // not masked. But it does damage the ancestor target surface. | 982 // not masked. But it does damage the ancestor target surface. |
| 981 | 983 |
| 982 clearDamageForAllSurfaces(root.get()); | 984 clearDamageForAllSurfaces(root.get()); |
| 983 | 985 |
| 984 // Create a reflection about the left edge of grandChild1. | 986 // Create a reflection about the left edge of grandChild1. |
| 985 { | 987 { |
| 986 scoped_ptr<LayerImpl> grandChild1Replica = LayerImpl::create(6); | 988 scoped_ptr<LayerImpl> grandChild1Replica = LayerImpl::create(6); |
| 987 grandChild1Replica->setPosition(gfx::PointF()); | 989 grandChild1Replica->setPosition(gfx::PointF()); |
| 988 grandChild1Replica->setAnchorPoint(gfx::PointF()); | 990 grandChild1Replica->setAnchorPoint(gfx::PointF()); |
| 989 WebTransformationMatrix reflection; | 991 Transform reflection; |
| 990 reflection.scale3d(-1, 1, 1); | 992 reflection.PreconcatScale3d(-1, 1, 1); |
| 991 grandChild1Replica->setTransform(reflection); | 993 grandChild1Replica->setTransform(reflection); |
| 992 grandChild1->setReplicaLayer(grandChild1Replica.Pass()); | 994 grandChild1->setReplicaLayer(grandChild1Replica.Pass()); |
| 993 } | 995 } |
| 994 LayerImpl* grandChild1Replica = grandChild1->replicaLayer(); | 996 LayerImpl* grandChild1Replica = grandChild1->replicaLayer(); |
| 995 | 997 |
| 996 // Set up the mask layer on the replica layer | 998 // Set up the mask layer on the replica layer |
| 997 { | 999 { |
| 998 scoped_ptr<LayerImpl> replicaMaskLayer = LayerImpl::create(7); | 1000 scoped_ptr<LayerImpl> replicaMaskLayer = LayerImpl::create(7); |
| 999 replicaMaskLayer->setPosition(gfx::PointF()); | 1001 replicaMaskLayer->setPosition(gfx::PointF()); |
| 1000 replicaMaskLayer->setAnchorPoint(gfx::PointF()); | 1002 replicaMaskLayer->setAnchorPoint(gfx::PointF()); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1041 | 1043 |
| 1042 // Verify that the correct replicaOriginTransform is used for the replicaMas
k; | 1044 // Verify that the correct replicaOriginTransform is used for the replicaMas
k; |
| 1043 clearDamageForAllSurfaces(root.get()); | 1045 clearDamageForAllSurfaces(root.get()); |
| 1044 | 1046 |
| 1045 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 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. |
| 1046 | 1048 |
| 1047 { | 1049 { |
| 1048 scoped_ptr<LayerImpl> grandChild1Replica = LayerImpl::create(6); | 1050 scoped_ptr<LayerImpl> grandChild1Replica = LayerImpl::create(6); |
| 1049 grandChild1Replica->setPosition(gfx::PointF()); | 1051 grandChild1Replica->setPosition(gfx::PointF()); |
| 1050 grandChild1Replica->setAnchorPoint(gfx::PointF(1, 0)); // This is the an
chor being tested. | 1052 grandChild1Replica->setAnchorPoint(gfx::PointF(1, 0)); // This is the an
chor being tested. |
| 1051 WebTransformationMatrix reflection; | 1053 Transform reflection; |
| 1052 reflection.scale3d(-1, 1, 1); | 1054 reflection.PreconcatScale3d(-1, 1, 1); |
| 1053 grandChild1Replica->setTransform(reflection); | 1055 grandChild1Replica->setTransform(reflection); |
| 1054 grandChild1->setReplicaLayer(grandChild1Replica.Pass()); | 1056 grandChild1->setReplicaLayer(grandChild1Replica.Pass()); |
| 1055 } | 1057 } |
| 1056 LayerImpl* grandChild1Replica = grandChild1->replicaLayer(); | 1058 LayerImpl* grandChild1Replica = grandChild1->replicaLayer(); |
| 1057 | 1059 |
| 1058 // Set up the mask layer on the replica layer | 1060 // Set up the mask layer on the replica layer |
| 1059 { | 1061 { |
| 1060 scoped_ptr<LayerImpl> replicaMaskLayer = LayerImpl::create(7); | 1062 scoped_ptr<LayerImpl> replicaMaskLayer = LayerImpl::create(7); |
| 1061 replicaMaskLayer->setPosition(gfx::PointF()); | 1063 replicaMaskLayer->setPosition(gfx::PointF()); |
| 1062 replicaMaskLayer->setAnchorPoint(gfx::PointF()); // note, this is not th
e anchor being tested. | 1064 replicaMaskLayer->setAnchorPoint(gfx::PointF()); // note, this is not th
e anchor being tested. |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1150 EXPECT_TRUE(rootDamageRect.IsEmpty()); | 1152 EXPECT_TRUE(rootDamageRect.IsEmpty()); |
| 1151 | 1153 |
| 1152 // Damage should remain empty even after one frame, since there's yet no new
damage | 1154 // Damage should remain empty even after one frame, since there's yet no new
damage |
| 1153 emulateDrawingOneFrame(root.get()); | 1155 emulateDrawingOneFrame(root.get()); |
| 1154 rootDamageRect = root->renderSurface()->damageTracker()->currentDamageRect()
; | 1156 rootDamageRect = root->renderSurface()->damageTracker()->currentDamageRect()
; |
| 1155 EXPECT_TRUE(rootDamageRect.IsEmpty()); | 1157 EXPECT_TRUE(rootDamageRect.IsEmpty()); |
| 1156 } | 1158 } |
| 1157 | 1159 |
| 1158 } // namespace | 1160 } // namespace |
| 1159 } // namespace cc | 1161 } // namespace cc |
| OLD | NEW |