| 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 "config.h" | 5 #include "config.h" |
| 6 | 6 |
| 7 #include "cc/layer_tree_host_common.h" | 7 #include "cc/layer_tree_host_common.h" |
| 8 | 8 |
| 9 #include "cc/content_layer.h" | 9 #include "cc/content_layer.h" |
| 10 #include "cc/content_layer_client.h" | 10 #include "cc/content_layer_client.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 23 #include <public/WebTransformationMatrix.h> | 23 #include <public/WebTransformationMatrix.h> |
| 24 | 24 |
| 25 using namespace cc; | 25 using namespace cc; |
| 26 using namespace WebKitTests; | 26 using namespace WebKitTests; |
| 27 using WebKit::WebTransformationMatrix; | 27 using WebKit::WebTransformationMatrix; |
| 28 | 28 |
| 29 namespace { | 29 namespace { |
| 30 | 30 |
| 31 template<typename LayerType> | 31 template<typename LayerType> |
| 32 void setLayerPropertiesForTestingInternal(LayerType* layer, const WebTransformat
ionMatrix& transform, const WebTransformationMatrix& sublayerTransform, const Fl
oatPoint& anchor, const FloatPoint& position, const IntSize& bounds, bool preser
ves3D) | 32 void setLayerPropertiesForTestingInternal(LayerType* layer, const WebTransformat
ionMatrix& transform, const WebTransformationMatrix& sublayerTransform, const gf
x::PointF& anchor, const gfx::PointF& position, const gfx::Size& bounds, bool pr
eserves3D) |
| 33 { | 33 { |
| 34 layer->setTransform(transform); | 34 layer->setTransform(transform); |
| 35 layer->setSublayerTransform(sublayerTransform); | 35 layer->setSublayerTransform(sublayerTransform); |
| 36 layer->setAnchorPoint(anchor); | 36 layer->setAnchorPoint(anchor); |
| 37 layer->setPosition(position); | 37 layer->setPosition(position); |
| 38 layer->setBounds(bounds); | 38 layer->setBounds(bounds); |
| 39 layer->setPreserves3D(preserves3D); | 39 layer->setPreserves3D(preserves3D); |
| 40 } | 40 } |
| 41 | 41 |
| 42 void setLayerPropertiesForTesting(Layer* layer, const WebTransformationMatrix& t
ransform, const WebTransformationMatrix& sublayerTransform, const FloatPoint& an
chor, const FloatPoint& position, const IntSize& bounds, bool preserves3D) | 42 void setLayerPropertiesForTesting(Layer* layer, const WebTransformationMatrix& t
ransform, const WebTransformationMatrix& sublayerTransform, const gfx::PointF& a
nchor, const gfx::PointF& position, const gfx::Size& bounds, bool preserves3D) |
| 43 { | 43 { |
| 44 setLayerPropertiesForTestingInternal<Layer>(layer, transform, sublayerTransf
orm, anchor, position, bounds, preserves3D); | 44 setLayerPropertiesForTestingInternal<Layer>(layer, transform, sublayerTransf
orm, anchor, position, bounds, preserves3D); |
| 45 layer->setAutomaticallyComputeRasterScale(true); | 45 layer->setAutomaticallyComputeRasterScale(true); |
| 46 } | 46 } |
| 47 | 47 |
| 48 void setLayerPropertiesForTesting(LayerImpl* layer, const WebTransformationMatri
x& transform, const WebTransformationMatrix& sublayerTransform, const FloatPoint
& anchor, const FloatPoint& position, const IntSize& bounds, bool preserves3D) | 48 void setLayerPropertiesForTesting(LayerImpl* layer, const WebTransformationMatri
x& transform, const WebTransformationMatrix& sublayerTransform, const gfx::Point
F& anchor, const gfx::PointF& position, const gfx::Size& bounds, bool preserves3
D) |
| 49 { | 49 { |
| 50 setLayerPropertiesForTestingInternal<LayerImpl>(layer, transform, sublayerTr
ansform, anchor, position, bounds, preserves3D); | 50 setLayerPropertiesForTestingInternal<LayerImpl>(layer, transform, sublayerTr
ansform, anchor, position, bounds, preserves3D); |
| 51 layer->setContentBounds(bounds); | 51 layer->setContentBounds(bounds); |
| 52 } | 52 } |
| 53 | 53 |
| 54 void executeCalculateDrawTransformsAndVisibility(Layer* rootLayer, float deviceS
caleFactor = 1, float pageScaleFactor = 1) | 54 void executeCalculateDrawTransformsAndVisibility(Layer* rootLayer, float deviceS
caleFactor = 1, float pageScaleFactor = 1) |
| 55 { | 55 { |
| 56 WebTransformationMatrix identityMatrix; | 56 WebTransformationMatrix identityMatrix; |
| 57 std::vector<scoped_refptr<Layer> > dummyRenderSurfaceLayerList; | 57 std::vector<scoped_refptr<Layer> > dummyRenderSurfaceLayerList; |
| 58 int dummyMaxTextureSize = 512; | 58 int dummyMaxTextureSize = 512; |
| 59 IntSize deviceViewportSize = IntSize(rootLayer->bounds().width() * deviceSca
leFactor, rootLayer->bounds().height() * deviceScaleFactor); | 59 gfx::Size deviceViewportSize = gfx::Size(rootLayer->bounds().width() * devic
eScaleFactor, rootLayer->bounds().height() * deviceScaleFactor); |
| 60 | 60 |
| 61 // We are probably not testing what is intended if the rootLayer bounds are
empty. | 61 // We are probably not testing what is intended if the rootLayer bounds are
empty. |
| 62 DCHECK(!rootLayer->bounds().isEmpty()); | 62 DCHECK(!rootLayer->bounds().IsEmpty()); |
| 63 LayerTreeHostCommon::calculateDrawTransforms(rootLayer, deviceViewportSize,
deviceScaleFactor, pageScaleFactor, dummyMaxTextureSize, dummyRenderSurfaceLayer
List); | 63 LayerTreeHostCommon::calculateDrawTransforms(rootLayer, deviceViewportSize,
deviceScaleFactor, pageScaleFactor, dummyMaxTextureSize, dummyRenderSurfaceLayer
List); |
| 64 } | 64 } |
| 65 | 65 |
| 66 void executeCalculateDrawTransformsAndVisibility(LayerImpl* rootLayer, float dev
iceScaleFactor = 1, float pageScaleFactor = 1) | 66 void executeCalculateDrawTransformsAndVisibility(LayerImpl* rootLayer, float dev
iceScaleFactor = 1, float pageScaleFactor = 1) |
| 67 { | 67 { |
| 68 // Note: this version skips layer sorting. | 68 // Note: this version skips layer sorting. |
| 69 | 69 |
| 70 WebTransformationMatrix identityMatrix; | 70 WebTransformationMatrix identityMatrix; |
| 71 std::vector<LayerImpl*> dummyRenderSurfaceLayerList; | 71 std::vector<LayerImpl*> dummyRenderSurfaceLayerList; |
| 72 int dummyMaxTextureSize = 512; | 72 int dummyMaxTextureSize = 512; |
| 73 IntSize deviceViewportSize = IntSize(rootLayer->bounds().width() * deviceSca
leFactor, rootLayer->bounds().height() * deviceScaleFactor); | 73 gfx::Size deviceViewportSize = gfx::Size(rootLayer->bounds().width() * devic
eScaleFactor, rootLayer->bounds().height() * deviceScaleFactor); |
| 74 | 74 |
| 75 // We are probably not testing what is intended if the rootLayer bounds are
empty. | 75 // We are probably not testing what is intended if the rootLayer bounds are
empty. |
| 76 DCHECK(!rootLayer->bounds().isEmpty()); | 76 DCHECK(!rootLayer->bounds().IsEmpty()); |
| 77 LayerTreeHostCommon::calculateDrawTransforms(rootLayer, deviceViewportSize,
deviceScaleFactor, pageScaleFactor, 0, dummyMaxTextureSize, dummyRenderSurfaceLa
yerList); | 77 LayerTreeHostCommon::calculateDrawTransforms(rootLayer, deviceViewportSize,
deviceScaleFactor, pageScaleFactor, 0, dummyMaxTextureSize, dummyRenderSurfaceLa
yerList); |
| 78 } | 78 } |
| 79 | 79 |
| 80 WebTransformationMatrix remove3DComponentOfMatrix(const WebTransformationMatrix&
mat) | 80 WebTransformationMatrix remove3DComponentOfMatrix(const WebTransformationMatrix&
mat) |
| 81 { | 81 { |
| 82 WebTransformationMatrix ret = mat; | 82 WebTransformationMatrix ret = mat; |
| 83 ret.setM13(0); | 83 ret.setM13(0); |
| 84 ret.setM23(0); | 84 ret.setM23(0); |
| 85 ret.setM31(0); | 85 ret.setM31(0); |
| 86 ret.setM32(0); | 86 ret.setM32(0); |
| 87 ret.setM33(1); | 87 ret.setM33(1); |
| 88 ret.setM34(0); | 88 ret.setM34(0); |
| 89 ret.setM43(0); | 89 ret.setM43(0); |
| 90 return ret; | 90 return ret; |
| 91 } | 91 } |
| 92 | 92 |
| 93 scoped_ptr<LayerImpl> createTreeForFixedPositionTests() | 93 scoped_ptr<LayerImpl> createTreeForFixedPositionTests() |
| 94 { | 94 { |
| 95 scoped_ptr<LayerImpl> root = LayerImpl::create(1); | 95 scoped_ptr<LayerImpl> root = LayerImpl::create(1); |
| 96 scoped_ptr<LayerImpl> child = LayerImpl::create(2); | 96 scoped_ptr<LayerImpl> child = LayerImpl::create(2); |
| 97 scoped_ptr<LayerImpl> grandChild = LayerImpl::create(3); | 97 scoped_ptr<LayerImpl> grandChild = LayerImpl::create(3); |
| 98 scoped_ptr<LayerImpl> greatGrandChild = LayerImpl::create(4); | 98 scoped_ptr<LayerImpl> greatGrandChild = LayerImpl::create(4); |
| 99 | 99 |
| 100 WebTransformationMatrix IdentityMatrix; | 100 WebTransformationMatrix IdentityMatrix; |
| 101 FloatPoint anchor(0, 0); | 101 gfx::PointF anchor(0, 0); |
| 102 FloatPoint position(0, 0); | 102 gfx::PointF position(0, 0); |
| 103 IntSize bounds(100, 100); | 103 gfx::Size bounds(100, 100); |
| 104 setLayerPropertiesForTesting(root.get(), IdentityMatrix, IdentityMatrix, anc
hor, position, bounds, false); | 104 setLayerPropertiesForTesting(root.get(), IdentityMatrix, IdentityMatrix, anc
hor, position, bounds, false); |
| 105 setLayerPropertiesForTesting(child.get(), IdentityMatrix, IdentityMatrix, an
chor, position, bounds, false); | 105 setLayerPropertiesForTesting(child.get(), IdentityMatrix, IdentityMatrix, an
chor, position, bounds, false); |
| 106 setLayerPropertiesForTesting(grandChild.get(), IdentityMatrix, IdentityMatri
x, anchor, position, bounds, false); | 106 setLayerPropertiesForTesting(grandChild.get(), IdentityMatrix, IdentityMatri
x, anchor, position, bounds, false); |
| 107 setLayerPropertiesForTesting(greatGrandChild.get(), IdentityMatrix, Identity
Matrix, anchor, position, bounds, false); | 107 setLayerPropertiesForTesting(greatGrandChild.get(), IdentityMatrix, Identity
Matrix, anchor, position, bounds, false); |
| 108 | 108 |
| 109 grandChild->addChild(greatGrandChild.Pass()); | 109 grandChild->addChild(greatGrandChild.Pass()); |
| 110 child->addChild(grandChild.Pass()); | 110 child->addChild(grandChild.Pass()); |
| 111 root->addChild(child.Pass()); | 111 root->addChild(child.Pass()); |
| 112 | 112 |
| 113 return root.Pass(); | 113 return root.Pass(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 // screenSpaceTransform, and the hierarchy passed on to children | 149 // screenSpaceTransform, and the hierarchy passed on to children |
| 150 // layers should also be identity transforms. | 150 // layers should also be identity transforms. |
| 151 | 151 |
| 152 scoped_refptr<Layer> parent = Layer::create(); | 152 scoped_refptr<Layer> parent = Layer::create(); |
| 153 scoped_refptr<Layer> child = Layer::create(); | 153 scoped_refptr<Layer> child = Layer::create(); |
| 154 scoped_refptr<Layer> grandChild = Layer::create(); | 154 scoped_refptr<Layer> grandChild = Layer::create(); |
| 155 parent->addChild(child); | 155 parent->addChild(child); |
| 156 child->addChild(grandChild); | 156 child->addChild(grandChild); |
| 157 | 157 |
| 158 WebTransformationMatrix identityMatrix; | 158 WebTransformationMatrix identityMatrix; |
| 159 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 159 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 160 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(0, 0), false); | 160 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(0, 0), false); |
| 161 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(0, 0), false); | 161 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(0, 0), false); |
| 162 | 162 |
| 163 executeCalculateDrawTransformsAndVisibility(parent.get()); | 163 executeCalculateDrawTransformsAndVisibility(parent.get()); |
| 164 | 164 |
| 165 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->drawTransform()); | 165 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->drawTransform()); |
| 166 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->screenSpaceTransform(
)); | 166 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->screenSpaceTransform(
)); |
| 167 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, grandChild->drawTransform())
; | 167 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, grandChild->drawTransform())
; |
| 168 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, grandChild->screenSpaceTrans
form()); | 168 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, grandChild->screenSpaceTrans
form()); |
| 169 } | 169 } |
| 170 | 170 |
| 171 TEST(LayerTreeHostCommonTest, verifyTransformsForSingleLayer) | 171 TEST(LayerTreeHostCommonTest, verifyTransformsForSingleLayer) |
| 172 { | 172 { |
| 173 WebTransformationMatrix identityMatrix; | 173 WebTransformationMatrix identityMatrix; |
| 174 scoped_refptr<Layer> layer = Layer::create(); | 174 scoped_refptr<Layer> layer = Layer::create(); |
| 175 | 175 |
| 176 // Case 1: setting the sublayer transform should not affect this layer's dra
w transform or screen-space transform. | 176 // Case 1: setting the sublayer transform should not affect this layer's dra
w transform or screen-space transform. |
| 177 WebTransformationMatrix arbitraryTranslation; | 177 WebTransformationMatrix arbitraryTranslation; |
| 178 arbitraryTranslation.translate(10, 20); | 178 arbitraryTranslation.translate(10, 20); |
| 179 setLayerPropertiesForTesting(layer.get(), identityMatrix, arbitraryTranslati
on, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 179 setLayerPropertiesForTesting(layer.get(), identityMatrix, arbitraryTranslati
on, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 180 executeCalculateDrawTransformsAndVisibility(layer.get()); | 180 executeCalculateDrawTransformsAndVisibility(layer.get()); |
| 181 WebTransformationMatrix expectedDrawTransform = identityMatrix; | 181 WebTransformationMatrix expectedDrawTransform = identityMatrix; |
| 182 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedDrawTransform, layer->drawTransform(
)); | 182 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedDrawTransform, layer->drawTransform(
)); |
| 183 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, layer->screenSpaceTransform(
)); | 183 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, layer->screenSpaceTransform(
)); |
| 184 | 184 |
| 185 // Case 2: Setting the bounds of the layer should not affect either the draw
transform or the screenspace transform. | 185 // Case 2: Setting the bounds of the layer should not affect either the draw
transform or the screenspace transform. |
| 186 WebTransformationMatrix translationToCenter; | 186 WebTransformationMatrix translationToCenter; |
| 187 translationToCenter.translate(5, 6); | 187 translationToCenter.translate(5, 6); |
| 188 setLayerPropertiesForTesting(layer.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 12), false); | 188 setLayerPropertiesForTesting(layer.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 12), false); |
| 189 executeCalculateDrawTransformsAndVisibility(layer.get()); | 189 executeCalculateDrawTransformsAndVisibility(layer.get()); |
| 190 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, layer->drawTransform()); | 190 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, layer->drawTransform()); |
| 191 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, layer->screenSpaceTransform(
)); | 191 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, layer->screenSpaceTransform(
)); |
| 192 | 192 |
| 193 // Case 3: The anchor point by itself (without a layer transform) should hav
e no effect on the transforms. | 193 // Case 3: The anchor point by itself (without a layer transform) should hav
e no effect on the transforms. |
| 194 setLayerPropertiesForTesting(layer.get(), identityMatrix, identityMatrix, Fl
oatPoint(0.25, 0.25), FloatPoint(0, 0), IntSize(10, 12), false); | 194 setLayerPropertiesForTesting(layer.get(), identityMatrix, identityMatrix, gf
x::PointF(0.25, 0.25), gfx::PointF(0, 0), gfx::Size(10, 12), false); |
| 195 executeCalculateDrawTransformsAndVisibility(layer.get()); | 195 executeCalculateDrawTransformsAndVisibility(layer.get()); |
| 196 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, layer->drawTransform()); | 196 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, layer->drawTransform()); |
| 197 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, layer->screenSpaceTransform(
)); | 197 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, layer->screenSpaceTransform(
)); |
| 198 | 198 |
| 199 // Case 4: A change in actual position affects both the draw transform and s
creen space transform. | 199 // Case 4: A change in actual position affects both the draw transform and s
creen space transform. |
| 200 WebTransformationMatrix positionTransform; | 200 WebTransformationMatrix positionTransform; |
| 201 positionTransform.translate(0, 1.2); | 201 positionTransform.translate(0, 1.2); |
| 202 setLayerPropertiesForTesting(layer.get(), identityMatrix, identityMatrix, Fl
oatPoint(0.25, 0.25), FloatPoint(0, 1.2f), IntSize(10, 12), false); | 202 setLayerPropertiesForTesting(layer.get(), identityMatrix, identityMatrix, gf
x::PointF(0.25, 0.25), gfx::PointF(0, 1.2f), gfx::Size(10, 12), false); |
| 203 executeCalculateDrawTransformsAndVisibility(layer.get()); | 203 executeCalculateDrawTransformsAndVisibility(layer.get()); |
| 204 EXPECT_TRANSFORMATION_MATRIX_EQ(positionTransform, layer->drawTransform()); | 204 EXPECT_TRANSFORMATION_MATRIX_EQ(positionTransform, layer->drawTransform()); |
| 205 EXPECT_TRANSFORMATION_MATRIX_EQ(positionTransform, layer->screenSpaceTransfo
rm()); | 205 EXPECT_TRANSFORMATION_MATRIX_EQ(positionTransform, layer->screenSpaceTransfo
rm()); |
| 206 | 206 |
| 207 // Case 5: In the correct sequence of transforms, the layer transform should
pre-multiply the translationToCenter. This is easily tested by | 207 // Case 5: In the correct sequence of transforms, the layer transform should
pre-multiply the translationToCenter. This is easily tested by |
| 208 // using a scale transform, because scale and translation are not co
mmutative. | 208 // using a scale transform, because scale and translation are not co
mmutative. |
| 209 WebTransformationMatrix layerTransform; | 209 WebTransformationMatrix layerTransform; |
| 210 layerTransform.scale3d(2, 2, 1); | 210 layerTransform.scale3d(2, 2, 1); |
| 211 setLayerPropertiesForTesting(layer.get(), layerTransform, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 12), false); | 211 setLayerPropertiesForTesting(layer.get(), layerTransform, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 12), false); |
| 212 executeCalculateDrawTransformsAndVisibility(layer.get()); | 212 executeCalculateDrawTransformsAndVisibility(layer.get()); |
| 213 EXPECT_TRANSFORMATION_MATRIX_EQ(layerTransform, layer->drawTransform()); | 213 EXPECT_TRANSFORMATION_MATRIX_EQ(layerTransform, layer->drawTransform()); |
| 214 EXPECT_TRANSFORMATION_MATRIX_EQ(layerTransform, layer->screenSpaceTransform(
)); | 214 EXPECT_TRANSFORMATION_MATRIX_EQ(layerTransform, layer->screenSpaceTransform(
)); |
| 215 | 215 |
| 216 // Case 6: The layer transform should occur with respect to the anchor point
. | 216 // Case 6: The layer transform should occur with respect to the anchor point
. |
| 217 WebTransformationMatrix translationToAnchor; | 217 WebTransformationMatrix translationToAnchor; |
| 218 translationToAnchor.translate(5, 0); | 218 translationToAnchor.translate(5, 0); |
| 219 WebTransformationMatrix expectedResult = translationToAnchor * layerTransfor
m * translationToAnchor.inverse(); | 219 WebTransformationMatrix expectedResult = translationToAnchor * layerTransfor
m * translationToAnchor.inverse(); |
| 220 setLayerPropertiesForTesting(layer.get(), layerTransform, identityMatrix, Fl
oatPoint(0.5, 0), FloatPoint(0, 0), IntSize(10, 12), false); | 220 setLayerPropertiesForTesting(layer.get(), layerTransform, identityMatrix, gf
x::PointF(0.5, 0), gfx::PointF(0, 0), gfx::Size(10, 12), false); |
| 221 executeCalculateDrawTransformsAndVisibility(layer.get()); | 221 executeCalculateDrawTransformsAndVisibility(layer.get()); |
| 222 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedResult, layer->drawTransform()); | 222 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedResult, layer->drawTransform()); |
| 223 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedResult, layer->screenSpaceTransform(
)); | 223 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedResult, layer->screenSpaceTransform(
)); |
| 224 | 224 |
| 225 // Case 7: Verify that position pre-multiplies the layer transform. | 225 // Case 7: Verify that position pre-multiplies the layer transform. |
| 226 // The current implementation of calculateDrawTransforms does this i
mplicitly, but it is | 226 // The current implementation of calculateDrawTransforms does this i
mplicitly, but it is |
| 227 // still worth testing to detect accidental regressions. | 227 // still worth testing to detect accidental regressions. |
| 228 expectedResult = positionTransform * translationToAnchor * layerTransform *
translationToAnchor.inverse(); | 228 expectedResult = positionTransform * translationToAnchor * layerTransform *
translationToAnchor.inverse(); |
| 229 setLayerPropertiesForTesting(layer.get(), layerTransform, identityMatrix, Fl
oatPoint(0.5, 0), FloatPoint(0, 1.2f), IntSize(10, 12), false); | 229 setLayerPropertiesForTesting(layer.get(), layerTransform, identityMatrix, gf
x::PointF(0.5, 0), gfx::PointF(0, 1.2f), gfx::Size(10, 12), false); |
| 230 executeCalculateDrawTransformsAndVisibility(layer.get()); | 230 executeCalculateDrawTransformsAndVisibility(layer.get()); |
| 231 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedResult, layer->drawTransform()); | 231 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedResult, layer->drawTransform()); |
| 232 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedResult, layer->screenSpaceTransform(
)); | 232 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedResult, layer->screenSpaceTransform(
)); |
| 233 } | 233 } |
| 234 | 234 |
| 235 TEST(LayerTreeHostCommonTest, verifyTransformsForSimpleHierarchy) | 235 TEST(LayerTreeHostCommonTest, verifyTransformsForSimpleHierarchy) |
| 236 { | 236 { |
| 237 WebTransformationMatrix identityMatrix; | 237 WebTransformationMatrix identityMatrix; |
| 238 scoped_refptr<Layer> parent = Layer::create(); | 238 scoped_refptr<Layer> parent = Layer::create(); |
| 239 scoped_refptr<Layer> child = Layer::create(); | 239 scoped_refptr<Layer> child = Layer::create(); |
| 240 scoped_refptr<Layer> grandChild = Layer::create(); | 240 scoped_refptr<Layer> grandChild = Layer::create(); |
| 241 parent->addChild(child); | 241 parent->addChild(child); |
| 242 child->addChild(grandChild); | 242 child->addChild(grandChild); |
| 243 | 243 |
| 244 // Case 1: parent's anchorPoint should not affect child or grandChild. | 244 // Case 1: parent's anchorPoint should not affect child or grandChild. |
| 245 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint(0.25, 0.25), FloatPoint(0, 0), IntSize(10, 12), false); | 245 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(0.25, 0.25), gfx::PointF(0, 0), gfx::Size(10, 12), false); |
| 246 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(16, 18), false); | 246 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(16, 18), false); |
| 247 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(76, 78), false); | 247 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(76, 78), false); |
| 248 executeCalculateDrawTransformsAndVisibility(parent.get()); | 248 executeCalculateDrawTransformsAndVisibility(parent.get()); |
| 249 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->drawTransform()); | 249 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->drawTransform()); |
| 250 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->screenSpaceTransform(
)); | 250 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->screenSpaceTransform(
)); |
| 251 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, grandChild->drawTransform())
; | 251 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, grandChild->drawTransform())
; |
| 252 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, grandChild->screenSpaceTrans
form()); | 252 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, grandChild->screenSpaceTrans
form()); |
| 253 | 253 |
| 254 // Case 2: parent's position affects child and grandChild. | 254 // Case 2: parent's position affects child and grandChild. |
| 255 WebTransformationMatrix parentPositionTransform; | 255 WebTransformationMatrix parentPositionTransform; |
| 256 parentPositionTransform.translate(0, 1.2); | 256 parentPositionTransform.translate(0, 1.2); |
| 257 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint(0.25, 0.25), FloatPoint(0, 1.2f), IntSize(10, 12), false); | 257 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(0.25, 0.25), gfx::PointF(0, 1.2f), gfx::Size(10, 12), false); |
| 258 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(16, 18), false); | 258 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(16, 18), false); |
| 259 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(76, 78), false); | 259 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(76, 78), false); |
| 260 executeCalculateDrawTransformsAndVisibility(parent.get()); | 260 executeCalculateDrawTransformsAndVisibility(parent.get()); |
| 261 EXPECT_TRANSFORMATION_MATRIX_EQ(parentPositionTransform, child->drawTransfor
m()); | 261 EXPECT_TRANSFORMATION_MATRIX_EQ(parentPositionTransform, child->drawTransfor
m()); |
| 262 EXPECT_TRANSFORMATION_MATRIX_EQ(parentPositionTransform, child->screenSpaceT
ransform()); | 262 EXPECT_TRANSFORMATION_MATRIX_EQ(parentPositionTransform, child->screenSpaceT
ransform()); |
| 263 EXPECT_TRANSFORMATION_MATRIX_EQ(parentPositionTransform, grandChild->drawTra
nsform()); | 263 EXPECT_TRANSFORMATION_MATRIX_EQ(parentPositionTransform, grandChild->drawTra
nsform()); |
| 264 EXPECT_TRANSFORMATION_MATRIX_EQ(parentPositionTransform, grandChild->screenS
paceTransform()); | 264 EXPECT_TRANSFORMATION_MATRIX_EQ(parentPositionTransform, grandChild->screenS
paceTransform()); |
| 265 | 265 |
| 266 // Case 3: parent's local transform affects child and grandchild | 266 // Case 3: parent's local transform affects child and grandchild |
| 267 WebTransformationMatrix parentLayerTransform; | 267 WebTransformationMatrix parentLayerTransform; |
| 268 parentLayerTransform.scale3d(2, 2, 1); | 268 parentLayerTransform.scale3d(2, 2, 1); |
| 269 WebTransformationMatrix parentTranslationToAnchor; | 269 WebTransformationMatrix parentTranslationToAnchor; |
| 270 parentTranslationToAnchor.translate(2.5, 3); | 270 parentTranslationToAnchor.translate(2.5, 3); |
| 271 WebTransformationMatrix parentCompositeTransform = parentTranslationToAnchor
* parentLayerTransform * parentTranslationToAnchor.inverse(); | 271 WebTransformationMatrix parentCompositeTransform = parentTranslationToAnchor
* parentLayerTransform * parentTranslationToAnchor.inverse(); |
| 272 setLayerPropertiesForTesting(parent.get(), parentLayerTransform, identityMat
rix, FloatPoint(0.25, 0.25), FloatPoint(0, 0), IntSize(10, 12), false); | 272 setLayerPropertiesForTesting(parent.get(), parentLayerTransform, identityMat
rix, gfx::PointF(0.25, 0.25), gfx::PointF(0, 0), gfx::Size(10, 12), false); |
| 273 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(16, 18), false); | 273 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(16, 18), false); |
| 274 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(76, 78), false); | 274 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(76, 78), false); |
| 275 executeCalculateDrawTransformsAndVisibility(parent.get()); | 275 executeCalculateDrawTransformsAndVisibility(parent.get()); |
| 276 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->drawTransfo
rm()); | 276 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->drawTransfo
rm()); |
| 277 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->screenSpace
Transform()); | 277 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->screenSpace
Transform()); |
| 278 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, grandChild->drawTr
ansform()); | 278 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, grandChild->drawTr
ansform()); |
| 279 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, grandChild->screen
SpaceTransform()); | 279 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, grandChild->screen
SpaceTransform()); |
| 280 | 280 |
| 281 // Case 4: parent's sublayerMatrix affects child and grandchild | 281 // Case 4: parent's sublayerMatrix affects child and grandchild |
| 282 // scaling is used here again so that the correct sequence of transf
orms is properly tested. | 282 // scaling is used here again so that the correct sequence of transf
orms is properly tested. |
| 283 // Note that preserves3D is false, but the sublayer matrix should re
tain its 3D properties when given to child. | 283 // Note that preserves3D is false, but the sublayer matrix should re
tain its 3D properties when given to child. |
| 284 // But then, the child also does not preserve3D. When it gives its h
ierarchy to the grandChild, it should be flattened to 2D. | 284 // But then, the child also does not preserve3D. When it gives its h
ierarchy to the grandChild, it should be flattened to 2D. |
| 285 WebTransformationMatrix parentSublayerMatrix; | 285 WebTransformationMatrix parentSublayerMatrix; |
| 286 parentSublayerMatrix.scale3d(10, 10, 3.3); | 286 parentSublayerMatrix.scale3d(10, 10, 3.3); |
| 287 WebTransformationMatrix parentTranslationToCenter; | 287 WebTransformationMatrix parentTranslationToCenter; |
| 288 parentTranslationToCenter.translate(5, 6); | 288 parentTranslationToCenter.translate(5, 6); |
| 289 // Sublayer matrix is applied to the center of the parent layer. | 289 // Sublayer matrix is applied to the center of the parent layer. |
| 290 parentCompositeTransform = parentTranslationToAnchor * parentLayerTransform
* parentTranslationToAnchor.inverse() | 290 parentCompositeTransform = parentTranslationToAnchor * parentLayerTransform
* parentTranslationToAnchor.inverse() |
| 291 * parentTranslationToCenter * parentSublayerMatrix * parentTranslati
onToCenter.inverse(); | 291 * parentTranslationToCenter * parentSublayerMatrix * parentTranslati
onToCenter.inverse(); |
| 292 WebTransformationMatrix flattenedCompositeTransform = remove3DComponentOfMat
rix(parentCompositeTransform); | 292 WebTransformationMatrix flattenedCompositeTransform = remove3DComponentOfMat
rix(parentCompositeTransform); |
| 293 setLayerPropertiesForTesting(parent.get(), parentLayerTransform, parentSubla
yerMatrix, FloatPoint(0.25, 0.25), FloatPoint(0, 0), IntSize(10, 12), false); | 293 setLayerPropertiesForTesting(parent.get(), parentLayerTransform, parentSubla
yerMatrix, gfx::PointF(0.25, 0.25), gfx::PointF(0, 0), gfx::Size(10, 12), false)
; |
| 294 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(16, 18), false); | 294 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(16, 18), false); |
| 295 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(76, 78), false); | 295 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(76, 78), false); |
| 296 executeCalculateDrawTransformsAndVisibility(parent.get()); | 296 executeCalculateDrawTransformsAndVisibility(parent.get()); |
| 297 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->drawTransfo
rm()); | 297 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->drawTransfo
rm()); |
| 298 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->screenSpace
Transform()); | 298 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->screenSpace
Transform()); |
| 299 EXPECT_TRANSFORMATION_MATRIX_EQ(flattenedCompositeTransform, grandChild->dra
wTransform()); | 299 EXPECT_TRANSFORMATION_MATRIX_EQ(flattenedCompositeTransform, grandChild->dra
wTransform()); |
| 300 EXPECT_TRANSFORMATION_MATRIX_EQ(flattenedCompositeTransform, grandChild->scr
eenSpaceTransform()); | 300 EXPECT_TRANSFORMATION_MATRIX_EQ(flattenedCompositeTransform, grandChild->scr
eenSpaceTransform()); |
| 301 | 301 |
| 302 // Case 5: same as Case 4, except that child does preserve 3D, so the grandC
hild should receive the non-flattened composite transform. | 302 // Case 5: same as Case 4, except that child does preserve 3D, so the grandC
hild should receive the non-flattened composite transform. |
| 303 // | 303 // |
| 304 setLayerPropertiesForTesting(parent.get(), parentLayerTransform, parentSubla
yerMatrix, FloatPoint(0.25, 0.25), FloatPoint(0, 0), IntSize(10, 12), false); | 304 setLayerPropertiesForTesting(parent.get(), parentLayerTransform, parentSubla
yerMatrix, gfx::PointF(0.25, 0.25), gfx::PointF(0, 0), gfx::Size(10, 12), false)
; |
| 305 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(16, 18), true); | 305 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(16, 18), true); |
| 306 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(76, 78), false); | 306 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(76, 78), false); |
| 307 executeCalculateDrawTransformsAndVisibility(parent.get()); | 307 executeCalculateDrawTransformsAndVisibility(parent.get()); |
| 308 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->drawTransfo
rm()); | 308 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->drawTransfo
rm()); |
| 309 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->screenSpace
Transform()); | 309 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->screenSpace
Transform()); |
| 310 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, grandChild->drawTr
ansform()); | 310 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, grandChild->drawTr
ansform()); |
| 311 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, grandChild->screen
SpaceTransform()); | 311 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, grandChild->screen
SpaceTransform()); |
| 312 } | 312 } |
| 313 | 313 |
| 314 TEST(LayerTreeHostCommonTest, verifyTransformsForSingleRenderSurface) | 314 TEST(LayerTreeHostCommonTest, verifyTransformsForSingleRenderSurface) |
| 315 { | 315 { |
| 316 scoped_refptr<Layer> parent = Layer::create(); | 316 scoped_refptr<Layer> parent = Layer::create(); |
| 317 scoped_refptr<Layer> child = Layer::create(); | 317 scoped_refptr<Layer> child = Layer::create(); |
| 318 scoped_refptr<LayerWithForcedDrawsContent> grandChild = make_scoped_refptr(n
ew LayerWithForcedDrawsContent()); | 318 scoped_refptr<LayerWithForcedDrawsContent> grandChild = make_scoped_refptr(n
ew LayerWithForcedDrawsContent()); |
| 319 parent->addChild(child); | 319 parent->addChild(child); |
| 320 child->addChild(grandChild); | 320 child->addChild(grandChild); |
| 321 | 321 |
| 322 // Child is set up so that a new render surface should be created. | 322 // Child is set up so that a new render surface should be created. |
| 323 child->setOpacity(0.5); | 323 child->setOpacity(0.5); |
| 324 | 324 |
| 325 WebTransformationMatrix identityMatrix; | 325 WebTransformationMatrix identityMatrix; |
| 326 WebTransformationMatrix parentLayerTransform; | 326 WebTransformationMatrix parentLayerTransform; |
| 327 parentLayerTransform.scale3d(1, 0.9, 1); | 327 parentLayerTransform.scale3d(1, 0.9, 1); |
| 328 WebTransformationMatrix parentTranslationToAnchor; | 328 WebTransformationMatrix parentTranslationToAnchor; |
| 329 parentTranslationToAnchor.translate(25, 30); | 329 parentTranslationToAnchor.translate(25, 30); |
| 330 WebTransformationMatrix parentSublayerMatrix; | 330 WebTransformationMatrix parentSublayerMatrix; |
| 331 parentSublayerMatrix.scale3d(0.9, 1, 3.3); | 331 parentSublayerMatrix.scale3d(0.9, 1, 3.3); |
| 332 WebTransformationMatrix parentTranslationToCenter; | 332 WebTransformationMatrix parentTranslationToCenter; |
| 333 parentTranslationToCenter.translate(50, 60); | 333 parentTranslationToCenter.translate(50, 60); |
| 334 WebTransformationMatrix parentCompositeTransform = parentTranslationToAnchor
* parentLayerTransform * parentTranslationToAnchor.inverse() | 334 WebTransformationMatrix parentCompositeTransform = parentTranslationToAnchor
* parentLayerTransform * parentTranslationToAnchor.inverse() |
| 335 * parentTranslationToCenter * parentSublayerMatrix * parentTranslati
onToCenter.inverse(); | 335 * parentTranslationToCenter * parentSublayerMatrix * parentTranslati
onToCenter.inverse(); |
| 336 FloatPoint parentCompositeScale = MathUtil::computeTransform2dScaleComponent
s(parentCompositeTransform); | 336 gfx::PointF parentCompositeScale = MathUtil::computeTransform2dScaleComponen
ts(parentCompositeTransform); |
| 337 WebTransformationMatrix surfaceSublayerTransform; | 337 WebTransformationMatrix surfaceSublayerTransform; |
| 338 surfaceSublayerTransform.scaleNonUniform(parentCompositeScale.x(), parentCom
positeScale.y()); | 338 surfaceSublayerTransform.scaleNonUniform(parentCompositeScale.x(), parentCom
positeScale.y()); |
| 339 WebTransformationMatrix surfaceSublayerCompositeTransform = parentCompositeT
ransform * surfaceSublayerTransform.inverse(); | 339 WebTransformationMatrix surfaceSublayerCompositeTransform = parentCompositeT
ransform * surfaceSublayerTransform.inverse(); |
| 340 | 340 |
| 341 // Child's render surface should not exist yet. | 341 // Child's render surface should not exist yet. |
| 342 ASSERT_FALSE(child->renderSurface()); | 342 ASSERT_FALSE(child->renderSurface()); |
| 343 | 343 |
| 344 setLayerPropertiesForTesting(parent.get(), parentLayerTransform, parentSubla
yerMatrix, FloatPoint(0.25, 0.25), FloatPoint(0, 0), IntSize(100, 120), false); | 344 setLayerPropertiesForTesting(parent.get(), parentLayerTransform, parentSubla
yerMatrix, gfx::PointF(0.25, 0.25), gfx::PointF(0, 0), gfx::Size(100, 120), fals
e); |
| 345 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(16, 18), false); | 345 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(16, 18), false); |
| 346 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(8, 10), false); | 346 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(8, 10), false); |
| 347 executeCalculateDrawTransformsAndVisibility(parent.get()); | 347 executeCalculateDrawTransformsAndVisibility(parent.get()); |
| 348 | 348 |
| 349 // Render surface should have been created now. | 349 // Render surface should have been created now. |
| 350 ASSERT_TRUE(child->renderSurface()); | 350 ASSERT_TRUE(child->renderSurface()); |
| 351 ASSERT_EQ(child, child->renderTarget()); | 351 ASSERT_EQ(child, child->renderTarget()); |
| 352 | 352 |
| 353 // The child layer's draw transform should refer to its new render surface. | 353 // The child layer's draw transform should refer to its new render surface. |
| 354 // The screen-space transform, however, should still refer to the root. | 354 // The screen-space transform, however, should still refer to the root. |
| 355 EXPECT_TRANSFORMATION_MATRIX_EQ(surfaceSublayerTransform, child->drawTransfo
rm()); | 355 EXPECT_TRANSFORMATION_MATRIX_EQ(surfaceSublayerTransform, child->drawTransfo
rm()); |
| 356 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->screenSpace
Transform()); | 356 EXPECT_TRANSFORMATION_MATRIX_EQ(parentCompositeTransform, child->screenSpace
Transform()); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 384 WebTransformationMatrix parentSublayerMatrix; | 384 WebTransformationMatrix parentSublayerMatrix; |
| 385 parentSublayerMatrix.scale3d(10, 10, 3.3); | 385 parentSublayerMatrix.scale3d(10, 10, 3.3); |
| 386 WebTransformationMatrix parentTranslationToCenter; | 386 WebTransformationMatrix parentTranslationToCenter; |
| 387 parentTranslationToCenter.translate(5, 6); | 387 parentTranslationToCenter.translate(5, 6); |
| 388 WebTransformationMatrix parentCompositeTransform = parentTranslationToAnchor
* parentLayerTransform * parentTranslationToAnchor.inverse() | 388 WebTransformationMatrix parentCompositeTransform = parentTranslationToAnchor
* parentLayerTransform * parentTranslationToAnchor.inverse() |
| 389 * parentTranslationToCenter * parentSublayerMatrix * parentTranslati
onToCenter.inverse(); | 389 * parentTranslationToCenter * parentSublayerMatrix * parentTranslati
onToCenter.inverse(); |
| 390 WebTransformationMatrix childTranslationToCenter; | 390 WebTransformationMatrix childTranslationToCenter; |
| 391 childTranslationToCenter.translate(8, 9); | 391 childTranslationToCenter.translate(8, 9); |
| 392 WebTransformationMatrix replicaLayerTransform; | 392 WebTransformationMatrix replicaLayerTransform; |
| 393 replicaLayerTransform.scale3d(3, 3, 1); | 393 replicaLayerTransform.scale3d(3, 3, 1); |
| 394 FloatPoint parentCompositeScale = MathUtil::computeTransform2dScaleComponent
s(parentCompositeTransform); | 394 gfx::PointF parentCompositeScale = MathUtil::computeTransform2dScaleComponen
ts(parentCompositeTransform); |
| 395 WebTransformationMatrix surfaceSublayerTransform; | 395 WebTransformationMatrix surfaceSublayerTransform; |
| 396 surfaceSublayerTransform.scaleNonUniform(parentCompositeScale.x(), parentCom
positeScale.y()); | 396 surfaceSublayerTransform.scaleNonUniform(parentCompositeScale.x(), parentCom
positeScale.y()); |
| 397 WebTransformationMatrix replicaCompositeTransform = parentCompositeTransform
* replicaLayerTransform * surfaceSublayerTransform.inverse(); | 397 WebTransformationMatrix replicaCompositeTransform = parentCompositeTransform
* replicaLayerTransform * surfaceSublayerTransform.inverse(); |
| 398 | 398 |
| 399 // Child's render surface should not exist yet. | 399 // Child's render surface should not exist yet. |
| 400 ASSERT_FALSE(child->renderSurface()); | 400 ASSERT_FALSE(child->renderSurface()); |
| 401 | 401 |
| 402 setLayerPropertiesForTesting(parent.get(), parentLayerTransform, parentSubla
yerMatrix, FloatPoint(0.25, 0.25), FloatPoint(0, 0), IntSize(10, 12), false); | 402 setLayerPropertiesForTesting(parent.get(), parentLayerTransform, parentSubla
yerMatrix, gfx::PointF(0.25, 0.25), gfx::PointF(0, 0), gfx::Size(10, 12), false)
; |
| 403 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(16, 18), false); | 403 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(16, 18), false); |
| 404 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, FloatPoint(0, 0), FloatPoint(-0.5, -0.5), IntSize(1, 1), false); | 404 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, gfx::PointF(0, 0), gfx::PointF(-0.5, -0.5), gfx::Size(1, 1), false); |
| 405 setLayerPropertiesForTesting(childReplica.get(), replicaLayerTransform, iden
tityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(0, 0), false); | 405 setLayerPropertiesForTesting(childReplica.get(), replicaLayerTransform, iden
tityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(0, 0), false); |
| 406 executeCalculateDrawTransformsAndVisibility(parent.get()); | 406 executeCalculateDrawTransformsAndVisibility(parent.get()); |
| 407 | 407 |
| 408 // Render surface should have been created now. | 408 // Render surface should have been created now. |
| 409 ASSERT_TRUE(child->renderSurface()); | 409 ASSERT_TRUE(child->renderSurface()); |
| 410 ASSERT_EQ(child, child->renderTarget()); | 410 ASSERT_EQ(child, child->renderTarget()); |
| 411 | 411 |
| 412 EXPECT_TRANSFORMATION_MATRIX_EQ(replicaCompositeTransform, child->renderTarg
et()->renderSurface()->replicaDrawTransform()); | 412 EXPECT_TRANSFORMATION_MATRIX_EQ(replicaCompositeTransform, child->renderTarg
et()->renderSurface()->replicaDrawTransform()); |
| 413 EXPECT_TRANSFORMATION_MATRIX_EQ(replicaCompositeTransform, child->renderTarg
et()->renderSurface()->replicaScreenSpaceTransform()); | 413 EXPECT_TRANSFORMATION_MATRIX_EQ(replicaCompositeTransform, child->renderTarg
et()->renderSurface()->replicaScreenSpaceTransform()); |
| 414 } | 414 } |
| 415 | 415 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 WebTransformationMatrix sublayerTransform; | 464 WebTransformationMatrix sublayerTransform; |
| 465 sublayerTransform.scale3d(10, 1, 1); | 465 sublayerTransform.scale3d(10, 1, 1); |
| 466 WebTransformationMatrix replicaLayerTransform; | 466 WebTransformationMatrix replicaLayerTransform; |
| 467 replicaLayerTransform.scale3d(-2, 5, 1); | 467 replicaLayerTransform.scale3d(-2, 5, 1); |
| 468 | 468 |
| 469 WebTransformationMatrix A = translationToAnchor * layerTransform * translati
onToAnchor.inverse(); | 469 WebTransformationMatrix A = translationToAnchor * layerTransform * translati
onToAnchor.inverse(); |
| 470 WebTransformationMatrix B = translationToCenter * sublayerTransform * transl
ationToCenter.inverse(); | 470 WebTransformationMatrix B = translationToCenter * sublayerTransform * transl
ationToCenter.inverse(); |
| 471 WebTransformationMatrix R = A * translationToAnchor * replicaLayerTransform
* translationToAnchor.inverse(); | 471 WebTransformationMatrix R = A * translationToAnchor * replicaLayerTransform
* translationToAnchor.inverse(); |
| 472 WebTransformationMatrix identityMatrix; | 472 WebTransformationMatrix identityMatrix; |
| 473 | 473 |
| 474 FloatPoint surface1ParentTransformScale = MathUtil::computeTransform2dScaleC
omponents(A * B); | 474 gfx::PointF surface1ParentTransformScale = MathUtil::computeTransform2dScale
Components(A * B); |
| 475 WebTransformationMatrix surface1SublayerTransform; | 475 WebTransformationMatrix surface1SublayerTransform; |
| 476 surface1SublayerTransform.scaleNonUniform(surface1ParentTransformScale.x(),
surface1ParentTransformScale.y()); | 476 surface1SublayerTransform.scaleNonUniform(surface1ParentTransformScale.x(),
surface1ParentTransformScale.y()); |
| 477 | 477 |
| 478 // SS1 = transform given to the subtree of renderSurface1 | 478 // SS1 = transform given to the subtree of renderSurface1 |
| 479 WebTransformationMatrix SS1 = surface1SublayerTransform; | 479 WebTransformationMatrix SS1 = surface1SublayerTransform; |
| 480 // S1 = transform to move from renderSurface1 pixels to the layer space of t
he owning layer | 480 // S1 = transform to move from renderSurface1 pixels to the layer space of t
he owning layer |
| 481 WebTransformationMatrix S1 = surface1SublayerTransform.inverse(); | 481 WebTransformationMatrix S1 = surface1SublayerTransform.inverse(); |
| 482 | 482 |
| 483 FloatPoint surface2ParentTransformScale = MathUtil::computeTransform2dScaleC
omponents(SS1 * A * B); | 483 gfx::PointF surface2ParentTransformScale = MathUtil::computeTransform2dScale
Components(SS1 * A * B); |
| 484 WebTransformationMatrix surface2SublayerTransform; | 484 WebTransformationMatrix surface2SublayerTransform; |
| 485 surface2SublayerTransform.scaleNonUniform(surface2ParentTransformScale.x(),
surface2ParentTransformScale.y()); | 485 surface2SublayerTransform.scaleNonUniform(surface2ParentTransformScale.x(),
surface2ParentTransformScale.y()); |
| 486 | 486 |
| 487 // SS2 = transform given to the subtree of renderSurface2 | 487 // SS2 = transform given to the subtree of renderSurface2 |
| 488 WebTransformationMatrix SS2 = surface2SublayerTransform; | 488 WebTransformationMatrix SS2 = surface2SublayerTransform; |
| 489 // S2 = transform to move from renderSurface2 pixels to the layer space of t
he owning layer | 489 // S2 = transform to move from renderSurface2 pixels to the layer space of t
he owning layer |
| 490 WebTransformationMatrix S2 = surface2SublayerTransform.inverse(); | 490 WebTransformationMatrix S2 = surface2SublayerTransform.inverse(); |
| 491 | 491 |
| 492 setLayerPropertiesForTesting(parent.get(), layerTransform, sublayerTransform
, FloatPoint(0.25, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 492 setLayerPropertiesForTesting(parent.get(), layerTransform, sublayerTransform
, gfx::PointF(0.25, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 493 setLayerPropertiesForTesting(renderSurface1.get(), layerTransform, sublayerT
ransform, FloatPoint(0.25, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 493 setLayerPropertiesForTesting(renderSurface1.get(), layerTransform, sublayerT
ransform, gfx::PointF(0.25, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 494 setLayerPropertiesForTesting(renderSurface2.get(), layerTransform, sublayerT
ransform, FloatPoint(0.25, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 494 setLayerPropertiesForTesting(renderSurface2.get(), layerTransform, sublayerT
ransform, gfx::PointF(0.25, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 495 setLayerPropertiesForTesting(childOfRoot.get(), layerTransform, sublayerTran
sform, FloatPoint(0.25, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 495 setLayerPropertiesForTesting(childOfRoot.get(), layerTransform, sublayerTran
sform, gfx::PointF(0.25, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 496 setLayerPropertiesForTesting(childOfRS1.get(), layerTransform, sublayerTrans
form, FloatPoint(0.25, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 496 setLayerPropertiesForTesting(childOfRS1.get(), layerTransform, sublayerTrans
form, gfx::PointF(0.25, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 497 setLayerPropertiesForTesting(childOfRS2.get(), layerTransform, sublayerTrans
form, FloatPoint(0.25, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 497 setLayerPropertiesForTesting(childOfRS2.get(), layerTransform, sublayerTrans
form, gfx::PointF(0.25, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 498 setLayerPropertiesForTesting(grandChildOfRoot.get(), layerTransform, sublaye
rTransform, FloatPoint(0.25, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 498 setLayerPropertiesForTesting(grandChildOfRoot.get(), layerTransform, sublaye
rTransform, gfx::PointF(0.25, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 499 setLayerPropertiesForTesting(grandChildOfRS1.get(), layerTransform, sublayer
Transform, FloatPoint(0.25, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 499 setLayerPropertiesForTesting(grandChildOfRS1.get(), layerTransform, sublayer
Transform, gfx::PointF(0.25, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 500 setLayerPropertiesForTesting(grandChildOfRS2.get(), layerTransform, sublayer
Transform, FloatPoint(0.25, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 500 setLayerPropertiesForTesting(grandChildOfRS2.get(), layerTransform, sublayer
Transform, gfx::PointF(0.25, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 501 setLayerPropertiesForTesting(replicaOfRS1.get(), replicaLayerTransform, subl
ayerTransform, FloatPoint(0.25, 0), FloatPoint(0, 0), IntSize(), false); | 501 setLayerPropertiesForTesting(replicaOfRS1.get(), replicaLayerTransform, subl
ayerTransform, gfx::PointF(0.25, 0), gfx::PointF(0, 0), gfx::Size(), false); |
| 502 setLayerPropertiesForTesting(replicaOfRS2.get(), replicaLayerTransform, subl
ayerTransform, FloatPoint(0.25, 0), FloatPoint(0, 0), IntSize(), false); | 502 setLayerPropertiesForTesting(replicaOfRS2.get(), replicaLayerTransform, subl
ayerTransform, gfx::PointF(0.25, 0), gfx::PointF(0, 0), gfx::Size(), false); |
| 503 | 503 |
| 504 executeCalculateDrawTransformsAndVisibility(parent.get()); | 504 executeCalculateDrawTransformsAndVisibility(parent.get()); |
| 505 | 505 |
| 506 // Only layers that are associated with render surfaces should have an actua
l renderSurface() value. | 506 // Only layers that are associated with render surfaces should have an actua
l renderSurface() value. |
| 507 // | 507 // |
| 508 ASSERT_TRUE(parent->renderSurface()); | 508 ASSERT_TRUE(parent->renderSurface()); |
| 509 ASSERT_FALSE(childOfRoot->renderSurface()); | 509 ASSERT_FALSE(childOfRoot->renderSurface()); |
| 510 ASSERT_FALSE(grandChildOfRoot->renderSurface()); | 510 ASSERT_FALSE(grandChildOfRoot->renderSurface()); |
| 511 | 511 |
| 512 ASSERT_TRUE(renderSurface1->renderSurface()); | 512 ASSERT_TRUE(renderSurface1->renderSurface()); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 // projection. | 598 // projection. |
| 599 | 599 |
| 600 scoped_refptr<Layer> root = Layer::create(); | 600 scoped_refptr<Layer> root = Layer::create(); |
| 601 scoped_refptr<Layer> child = Layer::create(); | 601 scoped_refptr<Layer> child = Layer::create(); |
| 602 scoped_refptr<LayerWithForcedDrawsContent> grandChild = make_scoped_refptr(n
ew LayerWithForcedDrawsContent()); | 602 scoped_refptr<LayerWithForcedDrawsContent> grandChild = make_scoped_refptr(n
ew LayerWithForcedDrawsContent()); |
| 603 | 603 |
| 604 WebTransformationMatrix rotationAboutYAxis; | 604 WebTransformationMatrix rotationAboutYAxis; |
| 605 rotationAboutYAxis.rotate3d(0, 30, 0); | 605 rotationAboutYAxis.rotate3d(0, 30, 0); |
| 606 | 606 |
| 607 const WebTransformationMatrix identityMatrix; | 607 const WebTransformationMatrix identityMatrix; |
| 608 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, Flo
atPoint::zero(), FloatPoint::zero(), IntSize(100, 100), false); | 608 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, gfx
::PointF(), gfx::PointF(), gfx::Size(100, 100), false); |
| 609 setLayerPropertiesForTesting(child.get(), rotationAboutYAxis, identityMatrix
, FloatPoint::zero(), FloatPoint::zero(), IntSize(10, 10), false); | 609 setLayerPropertiesForTesting(child.get(), rotationAboutYAxis, identityMatrix
, gfx::PointF(), gfx::PointF(), gfx::Size(10, 10), false); |
| 610 setLayerPropertiesForTesting(grandChild.get(), rotationAboutYAxis, identityM
atrix, FloatPoint::zero(), FloatPoint::zero(), IntSize(10, 10), false); | 610 setLayerPropertiesForTesting(grandChild.get(), rotationAboutYAxis, identityM
atrix, gfx::PointF(), gfx::PointF(), gfx::Size(10, 10), false); |
| 611 | 611 |
| 612 root->addChild(child); | 612 root->addChild(child); |
| 613 child->addChild(grandChild); | 613 child->addChild(grandChild); |
| 614 child->setForceRenderSurface(true); | 614 child->setForceRenderSurface(true); |
| 615 | 615 |
| 616 // No layers in this test should preserve 3d. | 616 // No layers in this test should preserve 3d. |
| 617 ASSERT_FALSE(root->preserves3D()); | 617 ASSERT_FALSE(root->preserves3D()); |
| 618 ASSERT_FALSE(child->preserves3D()); | 618 ASSERT_FALSE(child->preserves3D()); |
| 619 ASSERT_FALSE(grandChild->preserves3D()); | 619 ASSERT_FALSE(grandChild->preserves3D()); |
| 620 | 620 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 642 // | 642 // |
| 643 // Normally this isn't a problem, because the layer wouldn't be drawn anyway
, but if that layer becomes a renderSurface, then | 643 // Normally this isn't a problem, because the layer wouldn't be drawn anyway
, but if that layer becomes a renderSurface, then |
| 644 // its drawTransform is implicitly inherited by the rest of the subtree, whi
ch then is positioned incorrectly as a result. | 644 // its drawTransform is implicitly inherited by the rest of the subtree, whi
ch then is positioned incorrectly as a result. |
| 645 | 645 |
| 646 scoped_refptr<Layer> root = Layer::create(); | 646 scoped_refptr<Layer> root = Layer::create(); |
| 647 scoped_refptr<Layer> child = Layer::create(); | 647 scoped_refptr<Layer> child = Layer::create(); |
| 648 scoped_refptr<LayerWithForcedDrawsContent> grandChild = make_scoped_refptr(n
ew LayerWithForcedDrawsContent()); | 648 scoped_refptr<LayerWithForcedDrawsContent> grandChild = make_scoped_refptr(n
ew LayerWithForcedDrawsContent()); |
| 649 | 649 |
| 650 // The child height is zero, but has non-zero width that should be accounted
for while computing drawTransforms. | 650 // The child height is zero, but has non-zero width that should be accounted
for while computing drawTransforms. |
| 651 const WebTransformationMatrix identityMatrix; | 651 const WebTransformationMatrix identityMatrix; |
| 652 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, Flo
atPoint::zero(), FloatPoint::zero(), IntSize(100, 100), false); | 652 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, gfx
::PointF(), gfx::PointF(), gfx::Size(100, 100), false); |
| 653 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint::zero(), FloatPoint::zero(), IntSize(10, 0), false); | 653 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(), gfx::PointF(), gfx::Size(10, 0), false); |
| 654 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, FloatPoint::zero(), FloatPoint::zero(), IntSize(10, 10), false); | 654 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, gfx::PointF(), gfx::PointF(), gfx::Size(10, 10), false); |
| 655 | 655 |
| 656 root->addChild(child); | 656 root->addChild(child); |
| 657 child->addChild(grandChild); | 657 child->addChild(grandChild); |
| 658 child->setForceRenderSurface(true); | 658 child->setForceRenderSurface(true); |
| 659 | 659 |
| 660 executeCalculateDrawTransformsAndVisibility(root.get()); | 660 executeCalculateDrawTransformsAndVisibility(root.get()); |
| 661 | 661 |
| 662 ASSERT_TRUE(child->renderSurface()); | 662 ASSERT_TRUE(child->renderSurface()); |
| 663 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->renderSurface()->draw
Transform()); // This is the real test, the rest are sanity checks. | 663 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->renderSurface()->draw
Transform()); // This is the real test, the rest are sanity checks. |
| 664 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->drawTransform()); | 664 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, child->drawTransform()); |
| 665 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, grandChild->drawTransform())
; | 665 EXPECT_TRANSFORMATION_MATRIX_EQ(identityMatrix, grandChild->drawTransform())
; |
| 666 } | 666 } |
| 667 | 667 |
| 668 TEST(LayerTreeHostCommonTest, verifyRenderSurfaceListForRenderSurfaceWithClipped
Layer) | 668 TEST(LayerTreeHostCommonTest, verifyRenderSurfaceListForRenderSurfaceWithClipped
Layer) |
| 669 { | 669 { |
| 670 scoped_refptr<Layer> parent = Layer::create(); | 670 scoped_refptr<Layer> parent = Layer::create(); |
| 671 scoped_refptr<Layer> renderSurface1 = Layer::create(); | 671 scoped_refptr<Layer> renderSurface1 = Layer::create(); |
| 672 scoped_refptr<LayerWithForcedDrawsContent> child = make_scoped_refptr(new La
yerWithForcedDrawsContent()); | 672 scoped_refptr<LayerWithForcedDrawsContent> child = make_scoped_refptr(new La
yerWithForcedDrawsContent()); |
| 673 | 673 |
| 674 const WebTransformationMatrix identityMatrix; | 674 const WebTransformationMatrix identityMatrix; |
| 675 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint::zero(), FloatPoint::zero(), IntSize(10, 10), false); | 675 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(), gfx::PointF(), gfx::Size(10, 10), false); |
| 676 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, FloatPoint::zero(), FloatPoint::zero(), IntSize(10, 10), false); | 676 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, gfx::PointF(), gfx::PointF(), gfx::Size(10, 10), false); |
| 677 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint::zero(), FloatPoint(30, 30), IntSize(10, 10), false); | 677 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(), gfx::PointF(30, 30), gfx::Size(10, 10), false); |
| 678 | 678 |
| 679 parent->addChild(renderSurface1); | 679 parent->addChild(renderSurface1); |
| 680 parent->setMasksToBounds(true); | 680 parent->setMasksToBounds(true); |
| 681 renderSurface1->addChild(child); | 681 renderSurface1->addChild(child); |
| 682 renderSurface1->setForceRenderSurface(true); | 682 renderSurface1->setForceRenderSurface(true); |
| 683 | 683 |
| 684 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; | 684 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 685 int dummyMaxTextureSize = 512; | 685 int dummyMaxTextureSize = 512; |
| 686 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); | 686 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); |
| 687 | 687 |
| 688 // The child layer's content is entirely outside the parent's clip rect, so
the intermediate | 688 // The child layer's content is entirely outside the parent's clip rect, so
the intermediate |
| 689 // render surface should not be listed here, even if it was forced to be cre
ated. Render surfaces without children or visible | 689 // render surface should not be listed here, even if it was forced to be cre
ated. Render surfaces without children or visible |
| 690 // content are unexpected at draw time (e.g. we might try to create a conten
t texture of size 0). | 690 // content are unexpected at draw time (e.g. we might try to create a conten
t texture of size 0). |
| 691 ASSERT_TRUE(parent->renderSurface()); | 691 ASSERT_TRUE(parent->renderSurface()); |
| 692 ASSERT_FALSE(renderSurface1->renderSurface()); | 692 ASSERT_FALSE(renderSurface1->renderSurface()); |
| 693 EXPECT_EQ(1U, renderSurfaceLayerList.size()); | 693 EXPECT_EQ(1U, renderSurfaceLayerList.size()); |
| 694 } | 694 } |
| 695 | 695 |
| 696 TEST(LayerTreeHostCommonTest, verifyRenderSurfaceListForTransparentChild) | 696 TEST(LayerTreeHostCommonTest, verifyRenderSurfaceListForTransparentChild) |
| 697 { | 697 { |
| 698 scoped_refptr<Layer> parent = Layer::create(); | 698 scoped_refptr<Layer> parent = Layer::create(); |
| 699 scoped_refptr<Layer> renderSurface1 = Layer::create(); | 699 scoped_refptr<Layer> renderSurface1 = Layer::create(); |
| 700 scoped_refptr<LayerWithForcedDrawsContent> child = make_scoped_refptr(new La
yerWithForcedDrawsContent()); | 700 scoped_refptr<LayerWithForcedDrawsContent> child = make_scoped_refptr(new La
yerWithForcedDrawsContent()); |
| 701 | 701 |
| 702 const WebTransformationMatrix identityMatrix; | 702 const WebTransformationMatrix identityMatrix; |
| 703 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, FloatPoint::zero(), FloatPoint::zero(), IntSize(10, 10), false); | 703 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, gfx::PointF(), gfx::PointF(), gfx::Size(10, 10), false); |
| 704 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint::zero(), FloatPoint::zero(), IntSize(10, 10), false); | 704 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(), gfx::PointF(), gfx::Size(10, 10), false); |
| 705 | 705 |
| 706 parent->addChild(renderSurface1); | 706 parent->addChild(renderSurface1); |
| 707 renderSurface1->addChild(child); | 707 renderSurface1->addChild(child); |
| 708 renderSurface1->setForceRenderSurface(true); | 708 renderSurface1->setForceRenderSurface(true); |
| 709 renderSurface1->setOpacity(0); | 709 renderSurface1->setOpacity(0); |
| 710 | 710 |
| 711 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; | 711 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 712 int dummyMaxTextureSize = 512; | 712 int dummyMaxTextureSize = 512; |
| 713 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); | 713 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); |
| 714 | 714 |
| 715 // Since the layer is transparent, renderSurface1->renderSurface() should no
t have gotten added anywhere. | 715 // Since the layer is transparent, renderSurface1->renderSurface() should no
t have gotten added anywhere. |
| 716 // Also, the drawable content rect should not have been extended by the chil
dren. | 716 // Also, the drawable content rect should not have been extended by the chil
dren. |
| 717 ASSERT_TRUE(parent->renderSurface()); | 717 ASSERT_TRUE(parent->renderSurface()); |
| 718 EXPECT_EQ(0U, parent->renderSurface()->layerList().size()); | 718 EXPECT_EQ(0U, parent->renderSurface()->layerList().size()); |
| 719 EXPECT_EQ(1U, renderSurfaceLayerList.size()); | 719 EXPECT_EQ(1U, renderSurfaceLayerList.size()); |
| 720 EXPECT_EQ(parent->id(), renderSurfaceLayerList[0]->id()); | 720 EXPECT_EQ(parent->id(), renderSurfaceLayerList[0]->id()); |
| 721 EXPECT_EQ(IntRect(), parent->drawableContentRect()); | 721 EXPECT_EQ(gfx::Rect(), parent->drawableContentRect()); |
| 722 } | 722 } |
| 723 | 723 |
| 724 TEST(LayerTreeHostCommonTest, verifyForceRenderSurface) | 724 TEST(LayerTreeHostCommonTest, verifyForceRenderSurface) |
| 725 { | 725 { |
| 726 scoped_refptr<Layer> parent = Layer::create(); | 726 scoped_refptr<Layer> parent = Layer::create(); |
| 727 scoped_refptr<Layer> renderSurface1 = Layer::create(); | 727 scoped_refptr<Layer> renderSurface1 = Layer::create(); |
| 728 scoped_refptr<LayerWithForcedDrawsContent> child = make_scoped_refptr(new La
yerWithForcedDrawsContent()); | 728 scoped_refptr<LayerWithForcedDrawsContent> child = make_scoped_refptr(new La
yerWithForcedDrawsContent()); |
| 729 renderSurface1->setForceRenderSurface(true); | 729 renderSurface1->setForceRenderSurface(true); |
| 730 | 730 |
| 731 const WebTransformationMatrix identityMatrix; | 731 const WebTransformationMatrix identityMatrix; |
| 732 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint::zero(), FloatPoint::zero(), IntSize(10, 10), false); | 732 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(), gfx::PointF(), gfx::Size(10, 10), false); |
| 733 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, FloatPoint::zero(), FloatPoint::zero(), IntSize(10, 10), false); | 733 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, gfx::PointF(), gfx::PointF(), gfx::Size(10, 10), false); |
| 734 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint::zero(), FloatPoint::zero(), IntSize(10, 10), false); | 734 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(), gfx::PointF(), gfx::Size(10, 10), false); |
| 735 | 735 |
| 736 parent->addChild(renderSurface1); | 736 parent->addChild(renderSurface1); |
| 737 renderSurface1->addChild(child); | 737 renderSurface1->addChild(child); |
| 738 | 738 |
| 739 // Sanity check before the actual test | 739 // Sanity check before the actual test |
| 740 EXPECT_FALSE(parent->renderSurface()); | 740 EXPECT_FALSE(parent->renderSurface()); |
| 741 EXPECT_FALSE(renderSurface1->renderSurface()); | 741 EXPECT_FALSE(renderSurface1->renderSurface()); |
| 742 | 742 |
| 743 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; | 743 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 744 int dummyMaxTextureSize = 512; | 744 int dummyMaxTextureSize = 512; |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 // This test checks for correct scroll compensation when the fixed-position
container | 846 // This test checks for correct scroll compensation when the fixed-position
container |
| 847 // is NOT the direct parent of the fixed-position layer. | 847 // is NOT the direct parent of the fixed-position layer. |
| 848 DebugScopedSetImplThread scopedImplThread; | 848 DebugScopedSetImplThread scopedImplThread; |
| 849 | 849 |
| 850 scoped_ptr<LayerImpl> root = createTreeForFixedPositionTests(); | 850 scoped_ptr<LayerImpl> root = createTreeForFixedPositionTests(); |
| 851 LayerImpl* child = root->children()[0]; | 851 LayerImpl* child = root->children()[0]; |
| 852 LayerImpl* grandChild = child->children()[0]; | 852 LayerImpl* grandChild = child->children()[0]; |
| 853 LayerImpl* greatGrandChild = grandChild->children()[0]; | 853 LayerImpl* greatGrandChild = grandChild->children()[0]; |
| 854 | 854 |
| 855 child->setIsContainerForFixedPositionLayers(true); | 855 child->setIsContainerForFixedPositionLayers(true); |
| 856 grandChild->setPosition(FloatPoint(8, 6)); | 856 grandChild->setPosition(gfx::PointF(8, 6)); |
| 857 greatGrandChild->setFixedToContainerLayer(true); | 857 greatGrandChild->setFixedToContainerLayer(true); |
| 858 | 858 |
| 859 // Case 1: scrollDelta of 0, 0 | 859 // Case 1: scrollDelta of 0, 0 |
| 860 child->setScrollDelta(IntSize(0, 0)); | 860 child->setScrollDelta(IntSize(0, 0)); |
| 861 executeCalculateDrawTransformsAndVisibility(root.get()); | 861 executeCalculateDrawTransformsAndVisibility(root.get()); |
| 862 | 862 |
| 863 WebTransformationMatrix expectedChildTransform; | 863 WebTransformationMatrix expectedChildTransform; |
| 864 WebTransformationMatrix expectedGrandChildTransform; | 864 WebTransformationMatrix expectedGrandChildTransform; |
| 865 expectedGrandChildTransform.translate(8, 6); | 865 expectedGrandChildTransform.translate(8, 6); |
| 866 | 866 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 894 scoped_ptr<LayerImpl> root = createTreeForFixedPositionTests(); | 894 scoped_ptr<LayerImpl> root = createTreeForFixedPositionTests(); |
| 895 LayerImpl* child = root->children()[0]; | 895 LayerImpl* child = root->children()[0]; |
| 896 LayerImpl* grandChild = child->children()[0]; | 896 LayerImpl* grandChild = child->children()[0]; |
| 897 LayerImpl* greatGrandChild = grandChild->children()[0]; | 897 LayerImpl* greatGrandChild = grandChild->children()[0]; |
| 898 | 898 |
| 899 WebTransformationMatrix rotationAboutZ; | 899 WebTransformationMatrix rotationAboutZ; |
| 900 rotationAboutZ.rotate3d(0, 0, 90); | 900 rotationAboutZ.rotate3d(0, 0, 90); |
| 901 | 901 |
| 902 child->setIsContainerForFixedPositionLayers(true); | 902 child->setIsContainerForFixedPositionLayers(true); |
| 903 child->setTransform(rotationAboutZ); | 903 child->setTransform(rotationAboutZ); |
| 904 grandChild->setPosition(FloatPoint(8, 6)); | 904 grandChild->setPosition(gfx::PointF(8, 6)); |
| 905 grandChild->setTransform(rotationAboutZ); | 905 grandChild->setTransform(rotationAboutZ); |
| 906 greatGrandChild->setFixedToContainerLayer(true); // greatGrandChild is posit
ioned upside-down with respect to the renderTarget. | 906 greatGrandChild->setFixedToContainerLayer(true); // greatGrandChild is posit
ioned upside-down with respect to the renderTarget. |
| 907 | 907 |
| 908 // Case 1: scrollDelta of 0, 0 | 908 // Case 1: scrollDelta of 0, 0 |
| 909 child->setScrollDelta(IntSize(0, 0)); | 909 child->setScrollDelta(IntSize(0, 0)); |
| 910 executeCalculateDrawTransformsAndVisibility(root.get()); | 910 executeCalculateDrawTransformsAndVisibility(root.get()); |
| 911 | 911 |
| 912 WebTransformationMatrix expectedChildTransform; | 912 WebTransformationMatrix expectedChildTransform; |
| 913 expectedChildTransform.multiply(rotationAboutZ); | 913 expectedChildTransform.multiply(rotationAboutZ); |
| 914 | 914 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 956 scoped_ptr<LayerImpl> root = createTreeForFixedPositionTests(); | 956 scoped_ptr<LayerImpl> root = createTreeForFixedPositionTests(); |
| 957 LayerImpl* child = root->children()[0]; | 957 LayerImpl* child = root->children()[0]; |
| 958 LayerImpl* grandChild = child->children()[0]; | 958 LayerImpl* grandChild = child->children()[0]; |
| 959 LayerImpl* greatGrandChild = grandChild->children()[0]; | 959 LayerImpl* greatGrandChild = grandChild->children()[0]; |
| 960 | 960 |
| 961 WebTransformationMatrix rotationAboutZ; | 961 WebTransformationMatrix rotationAboutZ; |
| 962 rotationAboutZ.rotate3d(0, 0, 90); | 962 rotationAboutZ.rotate3d(0, 0, 90); |
| 963 | 963 |
| 964 child->setIsContainerForFixedPositionLayers(true); | 964 child->setIsContainerForFixedPositionLayers(true); |
| 965 child->setTransform(rotationAboutZ); | 965 child->setTransform(rotationAboutZ); |
| 966 grandChild->setPosition(FloatPoint(8, 6)); | 966 grandChild->setPosition(gfx::PointF(8, 6)); |
| 967 grandChild->setTransform(rotationAboutZ); | 967 grandChild->setTransform(rotationAboutZ); |
| 968 greatGrandChild->setFixedToContainerLayer(true); // greatGrandChild is posit
ioned upside-down with respect to the renderTarget. | 968 greatGrandChild->setFixedToContainerLayer(true); // greatGrandChild is posit
ioned upside-down with respect to the renderTarget. |
| 969 | 969 |
| 970 // Case 1: scrollDelta of 0, 0 | 970 // Case 1: scrollDelta of 0, 0 |
| 971 child->setScrollDelta(IntSize(0, 0)); | 971 child->setScrollDelta(IntSize(0, 0)); |
| 972 executeCalculateDrawTransformsAndVisibility(root.get()); | 972 executeCalculateDrawTransformsAndVisibility(root.get()); |
| 973 | 973 |
| 974 WebTransformationMatrix expectedChildTransform; | 974 WebTransformationMatrix expectedChildTransform; |
| 975 expectedChildTransform.multiply(rotationAboutZ); | 975 expectedChildTransform.multiply(rotationAboutZ); |
| 976 | 976 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1014 // case, the surface drawTransforms also have to be accounted for when check
ing the | 1014 // case, the surface drawTransforms also have to be accounted for when check
ing the |
| 1015 // scrollDelta. | 1015 // scrollDelta. |
| 1016 DebugScopedSetImplThread scopedImplThread; | 1016 DebugScopedSetImplThread scopedImplThread; |
| 1017 | 1017 |
| 1018 scoped_ptr<LayerImpl> root = createTreeForFixedPositionTests(); | 1018 scoped_ptr<LayerImpl> root = createTreeForFixedPositionTests(); |
| 1019 LayerImpl* child = root->children()[0]; | 1019 LayerImpl* child = root->children()[0]; |
| 1020 LayerImpl* grandChild = child->children()[0]; | 1020 LayerImpl* grandChild = child->children()[0]; |
| 1021 LayerImpl* greatGrandChild = grandChild->children()[0]; | 1021 LayerImpl* greatGrandChild = grandChild->children()[0]; |
| 1022 | 1022 |
| 1023 child->setIsContainerForFixedPositionLayers(true); | 1023 child->setIsContainerForFixedPositionLayers(true); |
| 1024 grandChild->setPosition(FloatPoint(8, 6)); | 1024 grandChild->setPosition(gfx::PointF(8, 6)); |
| 1025 grandChild->setForceRenderSurface(true); | 1025 grandChild->setForceRenderSurface(true); |
| 1026 greatGrandChild->setFixedToContainerLayer(true); | 1026 greatGrandChild->setFixedToContainerLayer(true); |
| 1027 greatGrandChild->setDrawsContent(true); | 1027 greatGrandChild->setDrawsContent(true); |
| 1028 | 1028 |
| 1029 WebTransformationMatrix rotationAboutZ; | 1029 WebTransformationMatrix rotationAboutZ; |
| 1030 rotationAboutZ.rotate3d(0, 0, 90); | 1030 rotationAboutZ.rotate3d(0, 0, 90); |
| 1031 grandChild->setTransform(rotationAboutZ); | 1031 grandChild->setTransform(rotationAboutZ); |
| 1032 | 1032 |
| 1033 // Case 1: scrollDelta of 0, 0 | 1033 // Case 1: scrollDelta of 0, 0 |
| 1034 child->setScrollDelta(IntSize(0, 0)); | 1034 child->setScrollDelta(IntSize(0, 0)); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1090 | 1090 |
| 1091 scoped_ptr<LayerImpl> root = createTreeForFixedPositionTests(); | 1091 scoped_ptr<LayerImpl> root = createTreeForFixedPositionTests(); |
| 1092 LayerImpl* child = root->children()[0]; | 1092 LayerImpl* child = root->children()[0]; |
| 1093 LayerImpl* grandChild = child->children()[0]; | 1093 LayerImpl* grandChild = child->children()[0]; |
| 1094 LayerImpl* greatGrandChild = grandChild->children()[0]; | 1094 LayerImpl* greatGrandChild = grandChild->children()[0]; |
| 1095 | 1095 |
| 1096 // Add one more layer to the test tree for this scenario. | 1096 // Add one more layer to the test tree for this scenario. |
| 1097 { | 1097 { |
| 1098 WebTransformationMatrix identity; | 1098 WebTransformationMatrix identity; |
| 1099 scoped_ptr<LayerImpl> fixedPositionChild = LayerImpl::create(5); | 1099 scoped_ptr<LayerImpl> fixedPositionChild = LayerImpl::create(5); |
| 1100 setLayerPropertiesForTesting(fixedPositionChild.get(), identity, identit
y, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 1100 setLayerPropertiesForTesting(fixedPositionChild.get(), identity, identit
y, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 1101 greatGrandChild->addChild(fixedPositionChild.Pass()); | 1101 greatGrandChild->addChild(fixedPositionChild.Pass()); |
| 1102 } | 1102 } |
| 1103 LayerImpl* fixedPositionChild = greatGrandChild->children()[0]; | 1103 LayerImpl* fixedPositionChild = greatGrandChild->children()[0]; |
| 1104 | 1104 |
| 1105 // Actually set up the scenario here. | 1105 // Actually set up the scenario here. |
| 1106 child->setIsContainerForFixedPositionLayers(true); | 1106 child->setIsContainerForFixedPositionLayers(true); |
| 1107 grandChild->setPosition(FloatPoint(8, 6)); | 1107 grandChild->setPosition(gfx::PointF(8, 6)); |
| 1108 grandChild->setForceRenderSurface(true); | 1108 grandChild->setForceRenderSurface(true); |
| 1109 greatGrandChild->setPosition(FloatPoint(40, 60)); | 1109 greatGrandChild->setPosition(gfx::PointF(40, 60)); |
| 1110 greatGrandChild->setForceRenderSurface(true); | 1110 greatGrandChild->setForceRenderSurface(true); |
| 1111 fixedPositionChild->setFixedToContainerLayer(true); | 1111 fixedPositionChild->setFixedToContainerLayer(true); |
| 1112 fixedPositionChild->setDrawsContent(true); | 1112 fixedPositionChild->setDrawsContent(true); |
| 1113 | 1113 |
| 1114 // The additional rotations, which are non-commutative with translations, he
lp to | 1114 // The additional rotations, which are non-commutative with translations, he
lp to |
| 1115 // verify that we have correct order-of-operations in the final scroll compe
nsation. | 1115 // verify that we have correct order-of-operations in the final scroll compe
nsation. |
| 1116 // Note that rotating about the center of the layer ensures we do not accide
ntally | 1116 // Note that rotating about the center of the layer ensures we do not accide
ntally |
| 1117 // clip away layers that we want to test. | 1117 // clip away layers that we want to test. |
| 1118 WebTransformationMatrix rotationAboutZ; | 1118 WebTransformationMatrix rotationAboutZ; |
| 1119 rotationAboutZ.translate(50, 50); | 1119 rotationAboutZ.translate(50, 50); |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1344 scoped_refptr<LayerWithForcedDrawsContent> leafNode2 = make_scoped_refptr(ne
w LayerWithForcedDrawsContent()); | 1344 scoped_refptr<LayerWithForcedDrawsContent> leafNode2 = make_scoped_refptr(ne
w LayerWithForcedDrawsContent()); |
| 1345 parent->addChild(child); | 1345 parent->addChild(child); |
| 1346 child->addChild(grandChild); | 1346 child->addChild(grandChild); |
| 1347 grandChild->addChild(greatGrandChild); | 1347 grandChild->addChild(greatGrandChild); |
| 1348 | 1348 |
| 1349 // leafNode1 ensures that parent and child are kept on the renderSurfaceLaye
rList, | 1349 // leafNode1 ensures that parent and child are kept on the renderSurfaceLaye
rList, |
| 1350 // even though grandChild and greatGrandChild should be clipped. | 1350 // even though grandChild and greatGrandChild should be clipped. |
| 1351 child->addChild(leafNode1); | 1351 child->addChild(leafNode1); |
| 1352 greatGrandChild->addChild(leafNode2); | 1352 greatGrandChild->addChild(leafNode2); |
| 1353 | 1353 |
| 1354 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(500, 500), false); | 1354 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(500, 500), false); |
| 1355 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(20, 20), false); | 1355 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(20, 20), false); |
| 1356 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, FloatPoint(0, 0), FloatPoint(45, 45), IntSize(10, 10), false); | 1356 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, gfx::PointF(0, 0), gfx::PointF(45, 45), gfx::Size(10, 10), false); |
| 1357 setLayerPropertiesForTesting(greatGrandChild.get(), identityMatrix, identity
Matrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 1357 setLayerPropertiesForTesting(greatGrandChild.get(), identityMatrix, identity
Matrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 1358 setLayerPropertiesForTesting(leafNode1.get(), identityMatrix, identityMatrix
, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(500, 500), false); | 1358 setLayerPropertiesForTesting(leafNode1.get(), identityMatrix, identityMatrix
, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(500, 500), false); |
| 1359 setLayerPropertiesForTesting(leafNode2.get(), identityMatrix, identityMatrix
, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(20, 20), false); | 1359 setLayerPropertiesForTesting(leafNode2.get(), identityMatrix, identityMatrix
, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(20, 20), false); |
| 1360 | 1360 |
| 1361 child->setMasksToBounds(true); | 1361 child->setMasksToBounds(true); |
| 1362 child->setOpacity(0.4f); | 1362 child->setOpacity(0.4f); |
| 1363 grandChild->setOpacity(0.5); | 1363 grandChild->setOpacity(0.5); |
| 1364 greatGrandChild->setOpacity(0.4f); | 1364 greatGrandChild->setOpacity(0.4f); |
| 1365 | 1365 |
| 1366 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; | 1366 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 1367 int dummyMaxTextureSize = 512; | 1367 int dummyMaxTextureSize = 512; |
| 1368 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); | 1368 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); |
| 1369 | 1369 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1392 | 1392 |
| 1393 const WebTransformationMatrix identityMatrix; | 1393 const WebTransformationMatrix identityMatrix; |
| 1394 scoped_refptr<Layer> parent = Layer::create(); | 1394 scoped_refptr<Layer> parent = Layer::create(); |
| 1395 scoped_refptr<Layer> child = Layer::create(); | 1395 scoped_refptr<Layer> child = Layer::create(); |
| 1396 scoped_refptr<Layer> grandChild = Layer::create(); | 1396 scoped_refptr<Layer> grandChild = Layer::create(); |
| 1397 scoped_refptr<LayerWithForcedDrawsContent> leafNode = make_scoped_refptr(new
LayerWithForcedDrawsContent()); | 1397 scoped_refptr<LayerWithForcedDrawsContent> leafNode = make_scoped_refptr(new
LayerWithForcedDrawsContent()); |
| 1398 parent->addChild(child); | 1398 parent->addChild(child); |
| 1399 child->addChild(grandChild); | 1399 child->addChild(grandChild); |
| 1400 grandChild->addChild(leafNode); | 1400 grandChild->addChild(leafNode); |
| 1401 | 1401 |
| 1402 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 1402 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 1403 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(20, 20), false); | 1403 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(20, 20), false); |
| 1404 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, FloatPoint(0, 0), FloatPoint(200, 200), IntSize(10, 10), false); | 1404 setLayerPropertiesForTesting(grandChild.get(), identityMatrix, identityMatri
x, gfx::PointF(0, 0), gfx::PointF(200, 200), gfx::Size(10, 10), false); |
| 1405 setLayerPropertiesForTesting(leafNode.get(), identityMatrix, identityMatrix,
FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 1405 setLayerPropertiesForTesting(leafNode.get(), identityMatrix, identityMatrix,
gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 1406 | 1406 |
| 1407 parent->setMasksToBounds(true); | 1407 parent->setMasksToBounds(true); |
| 1408 child->setOpacity(0.4f); | 1408 child->setOpacity(0.4f); |
| 1409 grandChild->setOpacity(0.4f); | 1409 grandChild->setOpacity(0.4f); |
| 1410 | 1410 |
| 1411 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; | 1411 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 1412 int dummyMaxTextureSize = 512; | 1412 int dummyMaxTextureSize = 512; |
| 1413 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); | 1413 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); |
| 1414 | 1414 |
| 1415 // Without an animation, we should cull child and grandChild from the render
SurfaceLayerList. | 1415 // Without an animation, we should cull child and grandChild from the render
SurfaceLayerList. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1450 scoped_refptr<Layer> grandChild2 = Layer::create(); | 1450 scoped_refptr<Layer> grandChild2 = Layer::create(); |
| 1451 scoped_refptr<Layer> grandChild3 = Layer::create(); | 1451 scoped_refptr<Layer> grandChild3 = Layer::create(); |
| 1452 scoped_refptr<Layer> grandChild4 = Layer::create(); | 1452 scoped_refptr<Layer> grandChild4 = Layer::create(); |
| 1453 | 1453 |
| 1454 parent->addChild(child); | 1454 parent->addChild(child); |
| 1455 child->addChild(grandChild1); | 1455 child->addChild(grandChild1); |
| 1456 child->addChild(grandChild2); | 1456 child->addChild(grandChild2); |
| 1457 child->addChild(grandChild3); | 1457 child->addChild(grandChild3); |
| 1458 child->addChild(grandChild4); | 1458 child->addChild(grandChild4); |
| 1459 | 1459 |
| 1460 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(500, 500), false); | 1460 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(500, 500), false); |
| 1461 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(20, 20), false); | 1461 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(20, 20), false); |
| 1462 setLayerPropertiesForTesting(grandChild1.get(), identityMatrix, identityMatr
ix, FloatPoint(0, 0), FloatPoint(5, 5), IntSize(10, 10), false); | 1462 setLayerPropertiesForTesting(grandChild1.get(), identityMatrix, identityMatr
ix, gfx::PointF(0, 0), gfx::PointF(5, 5), gfx::Size(10, 10), false); |
| 1463 setLayerPropertiesForTesting(grandChild2.get(), identityMatrix, identityMatr
ix, FloatPoint(0, 0), FloatPoint(15, 15), IntSize(10, 10), false); | 1463 setLayerPropertiesForTesting(grandChild2.get(), identityMatrix, identityMatr
ix, gfx::PointF(0, 0), gfx::PointF(15, 15), gfx::Size(10, 10), false); |
| 1464 setLayerPropertiesForTesting(grandChild3.get(), identityMatrix, identityMatr
ix, FloatPoint(0, 0), FloatPoint(15, 15), IntSize(10, 10), false); | 1464 setLayerPropertiesForTesting(grandChild3.get(), identityMatrix, identityMatr
ix, gfx::PointF(0, 0), gfx::PointF(15, 15), gfx::Size(10, 10), false); |
| 1465 setLayerPropertiesForTesting(grandChild4.get(), identityMatrix, identityMatr
ix, FloatPoint(0, 0), FloatPoint(45, 45), IntSize(10, 10), false); | 1465 setLayerPropertiesForTesting(grandChild4.get(), identityMatrix, identityMatr
ix, gfx::PointF(0, 0), gfx::PointF(45, 45), gfx::Size(10, 10), false); |
| 1466 | 1466 |
| 1467 child->setMasksToBounds(true); | 1467 child->setMasksToBounds(true); |
| 1468 grandChild3->setMasksToBounds(true); | 1468 grandChild3->setMasksToBounds(true); |
| 1469 | 1469 |
| 1470 // Force everyone to be a render surface. | 1470 // Force everyone to be a render surface. |
| 1471 child->setOpacity(0.4f); | 1471 child->setOpacity(0.4f); |
| 1472 grandChild1->setOpacity(0.5); | 1472 grandChild1->setOpacity(0.5); |
| 1473 grandChild2->setOpacity(0.5); | 1473 grandChild2->setOpacity(0.5); |
| 1474 grandChild3->setOpacity(0.5); | 1474 grandChild3->setOpacity(0.5); |
| 1475 grandChild4->setOpacity(0.5); | 1475 grandChild4->setOpacity(0.5); |
| 1476 | 1476 |
| 1477 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; | 1477 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 1478 int dummyMaxTextureSize = 512; | 1478 int dummyMaxTextureSize = 512; |
| 1479 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); | 1479 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); |
| 1480 | 1480 |
| 1481 EXPECT_RECT_EQ(IntRect(IntPoint(5, 5), IntSize(10, 10)), grandChild1->drawab
leContentRect()); | 1481 EXPECT_RECT_EQ(gfx::Rect(gfx::Point(5, 5), gfx::Size(10, 10)), grandChild1->
drawableContentRect()); |
| 1482 EXPECT_RECT_EQ(IntRect(IntPoint(15, 15), IntSize(5, 5)), grandChild3->drawab
leContentRect()); | 1482 EXPECT_RECT_EQ(gfx::Rect(gfx::Point(15, 15), gfx::Size(5, 5)), grandChild3->
drawableContentRect()); |
| 1483 EXPECT_RECT_EQ(IntRect(IntPoint(15, 15), IntSize(5, 5)), grandChild3->drawab
leContentRect()); | 1483 EXPECT_RECT_EQ(gfx::Rect(gfx::Point(15, 15), gfx::Size(5, 5)), grandChild3->
drawableContentRect()); |
| 1484 EXPECT_TRUE(grandChild4->drawableContentRect().isEmpty()); | 1484 EXPECT_TRUE(grandChild4->drawableContentRect().IsEmpty()); |
| 1485 } | 1485 } |
| 1486 | 1486 |
| 1487 TEST(LayerTreeHostCommonTest, verifyClipRectIsPropagatedCorrectlyToSurfaces) | 1487 TEST(LayerTreeHostCommonTest, verifyClipRectIsPropagatedCorrectlyToSurfaces) |
| 1488 { | 1488 { |
| 1489 // Verify that renderSurfaces (and their layers) get the appropriate clipRec
ts when their parent masksToBounds is true. | 1489 // Verify that renderSurfaces (and their layers) get the appropriate clipRec
ts when their parent masksToBounds is true. |
| 1490 // | 1490 // |
| 1491 // Layers that own renderSurfaces (at least for now) do not inherit any clip
ping; | 1491 // Layers that own renderSurfaces (at least for now) do not inherit any clip
ping; |
| 1492 // instead the surface will enforce the clip for the entire subtree. They ma
y still | 1492 // instead the surface will enforce the clip for the entire subtree. They ma
y still |
| 1493 // have a clipRect of their own layer bounds, however, if masksToBounds was
true. | 1493 // have a clipRect of their own layer bounds, however, if masksToBounds was
true. |
| 1494 // | 1494 // |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1510 child->addChild(grandChild2); | 1510 child->addChild(grandChild2); |
| 1511 child->addChild(grandChild3); | 1511 child->addChild(grandChild3); |
| 1512 child->addChild(grandChild4); | 1512 child->addChild(grandChild4); |
| 1513 | 1513 |
| 1514 // the leaf nodes ensure that these grandChildren become renderSurfaces for
this test. | 1514 // the leaf nodes ensure that these grandChildren become renderSurfaces for
this test. |
| 1515 grandChild1->addChild(leafNode1); | 1515 grandChild1->addChild(leafNode1); |
| 1516 grandChild2->addChild(leafNode2); | 1516 grandChild2->addChild(leafNode2); |
| 1517 grandChild3->addChild(leafNode3); | 1517 grandChild3->addChild(leafNode3); |
| 1518 grandChild4->addChild(leafNode4); | 1518 grandChild4->addChild(leafNode4); |
| 1519 | 1519 |
| 1520 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(500, 500), false); | 1520 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(500, 500), false); |
| 1521 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(20, 20), false); | 1521 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(20, 20), false); |
| 1522 setLayerPropertiesForTesting(grandChild1.get(), identityMatrix, identityMatr
ix, FloatPoint(0, 0), FloatPoint(5, 5), IntSize(10, 10), false); | 1522 setLayerPropertiesForTesting(grandChild1.get(), identityMatrix, identityMatr
ix, gfx::PointF(0, 0), gfx::PointF(5, 5), gfx::Size(10, 10), false); |
| 1523 setLayerPropertiesForTesting(grandChild2.get(), identityMatrix, identityMatr
ix, FloatPoint(0, 0), FloatPoint(15, 15), IntSize(10, 10), false); | 1523 setLayerPropertiesForTesting(grandChild2.get(), identityMatrix, identityMatr
ix, gfx::PointF(0, 0), gfx::PointF(15, 15), gfx::Size(10, 10), false); |
| 1524 setLayerPropertiesForTesting(grandChild3.get(), identityMatrix, identityMatr
ix, FloatPoint(0, 0), FloatPoint(15, 15), IntSize(10, 10), false); | 1524 setLayerPropertiesForTesting(grandChild3.get(), identityMatrix, identityMatr
ix, gfx::PointF(0, 0), gfx::PointF(15, 15), gfx::Size(10, 10), false); |
| 1525 setLayerPropertiesForTesting(grandChild4.get(), identityMatrix, identityMatr
ix, FloatPoint(0, 0), FloatPoint(45, 45), IntSize(10, 10), false); | 1525 setLayerPropertiesForTesting(grandChild4.get(), identityMatrix, identityMatr
ix, gfx::PointF(0, 0), gfx::PointF(45, 45), gfx::Size(10, 10), false); |
| 1526 setLayerPropertiesForTesting(leafNode1.get(), identityMatrix, identityMatrix
, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 1526 setLayerPropertiesForTesting(leafNode1.get(), identityMatrix, identityMatrix
, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 1527 setLayerPropertiesForTesting(leafNode2.get(), identityMatrix, identityMatrix
, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 1527 setLayerPropertiesForTesting(leafNode2.get(), identityMatrix, identityMatrix
, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 1528 setLayerPropertiesForTesting(leafNode3.get(), identityMatrix, identityMatrix
, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 1528 setLayerPropertiesForTesting(leafNode3.get(), identityMatrix, identityMatrix
, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 1529 setLayerPropertiesForTesting(leafNode4.get(), identityMatrix, identityMatrix
, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 10), false); | 1529 setLayerPropertiesForTesting(leafNode4.get(), identityMatrix, identityMatrix
, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 10), false); |
| 1530 | 1530 |
| 1531 child->setMasksToBounds(true); | 1531 child->setMasksToBounds(true); |
| 1532 grandChild3->setMasksToBounds(true); | 1532 grandChild3->setMasksToBounds(true); |
| 1533 grandChild4->setMasksToBounds(true); | 1533 grandChild4->setMasksToBounds(true); |
| 1534 | 1534 |
| 1535 // Force everyone to be a render surface. | 1535 // Force everyone to be a render surface. |
| 1536 child->setOpacity(0.4f); | 1536 child->setOpacity(0.4f); |
| 1537 grandChild1->setOpacity(0.5); | 1537 grandChild1->setOpacity(0.5); |
| 1538 grandChild2->setOpacity(0.5); | 1538 grandChild2->setOpacity(0.5); |
| 1539 grandChild3->setOpacity(0.5); | 1539 grandChild3->setOpacity(0.5); |
| 1540 grandChild4->setOpacity(0.5); | 1540 grandChild4->setOpacity(0.5); |
| 1541 | 1541 |
| 1542 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; | 1542 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 1543 int dummyMaxTextureSize = 512; | 1543 int dummyMaxTextureSize = 512; |
| 1544 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); | 1544 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); |
| 1545 | 1545 |
| 1546 ASSERT_TRUE(grandChild1->renderSurface()); | 1546 ASSERT_TRUE(grandChild1->renderSurface()); |
| 1547 ASSERT_TRUE(grandChild2->renderSurface()); | 1547 ASSERT_TRUE(grandChild2->renderSurface()); |
| 1548 ASSERT_TRUE(grandChild3->renderSurface()); | 1548 ASSERT_TRUE(grandChild3->renderSurface()); |
| 1549 EXPECT_FALSE(grandChild4->renderSurface()); // Because grandChild4 is entire
ly clipped, it is expected to not have a renderSurface. | 1549 EXPECT_FALSE(grandChild4->renderSurface()); // Because grandChild4 is entire
ly clipped, it is expected to not have a renderSurface. |
| 1550 | 1550 |
| 1551 // Surfaces are clipped by their parent, but un-affected by the owning layer
's masksToBounds. | 1551 // Surfaces are clipped by their parent, but un-affected by the owning layer
's masksToBounds. |
| 1552 EXPECT_RECT_EQ(IntRect(IntPoint(0, 0), IntSize(20, 20)), grandChild1->render
Surface()->clipRect()); | 1552 EXPECT_RECT_EQ(gfx::Rect(gfx::Point(0, 0), gfx::Size(20, 20)), grandChild1->
renderSurface()->clipRect()); |
| 1553 EXPECT_RECT_EQ(IntRect(IntPoint(0, 0), IntSize(20, 20)), grandChild2->render
Surface()->clipRect()); | 1553 EXPECT_RECT_EQ(gfx::Rect(gfx::Point(0, 0), gfx::Size(20, 20)), grandChild2->
renderSurface()->clipRect()); |
| 1554 EXPECT_RECT_EQ(IntRect(IntPoint(0, 0), IntSize(20, 20)), grandChild3->render
Surface()->clipRect()); | 1554 EXPECT_RECT_EQ(gfx::Rect(gfx::Point(0, 0), gfx::Size(20, 20)), grandChild3->
renderSurface()->clipRect()); |
| 1555 } | 1555 } |
| 1556 | 1556 |
| 1557 TEST(LayerTreeHostCommonTest, verifyAnimationsForRenderSurfaceHierarchy) | 1557 TEST(LayerTreeHostCommonTest, verifyAnimationsForRenderSurfaceHierarchy) |
| 1558 { | 1558 { |
| 1559 scoped_refptr<Layer> parent = Layer::create(); | 1559 scoped_refptr<Layer> parent = Layer::create(); |
| 1560 scoped_refptr<Layer> renderSurface1 = Layer::create(); | 1560 scoped_refptr<Layer> renderSurface1 = Layer::create(); |
| 1561 scoped_refptr<Layer> renderSurface2 = Layer::create(); | 1561 scoped_refptr<Layer> renderSurface2 = Layer::create(); |
| 1562 scoped_refptr<Layer> childOfRoot = Layer::create(); | 1562 scoped_refptr<Layer> childOfRoot = Layer::create(); |
| 1563 scoped_refptr<Layer> childOfRS1 = Layer::create(); | 1563 scoped_refptr<Layer> childOfRS1 = Layer::create(); |
| 1564 scoped_refptr<Layer> childOfRS2 = Layer::create(); | 1564 scoped_refptr<Layer> childOfRS2 = Layer::create(); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1589 WebTransformationMatrix sublayerTransform; | 1589 WebTransformationMatrix sublayerTransform; |
| 1590 sublayerTransform.scale3d(10, 1, 1); | 1590 sublayerTransform.scale3d(10, 1, 1); |
| 1591 | 1591 |
| 1592 // Put a transform animation on the render surface. | 1592 // Put a transform animation on the render surface. |
| 1593 addAnimatedTransformToController(*renderSurface2->layerAnimationController()
, 10, 30, 0); | 1593 addAnimatedTransformToController(*renderSurface2->layerAnimationController()
, 10, 30, 0); |
| 1594 | 1594 |
| 1595 // Also put transform animations on grandChildOfRoot, and grandChildOfRS2 | 1595 // Also put transform animations on grandChildOfRoot, and grandChildOfRS2 |
| 1596 addAnimatedTransformToController(*grandChildOfRoot->layerAnimationController
(), 10, 30, 0); | 1596 addAnimatedTransformToController(*grandChildOfRoot->layerAnimationController
(), 10, 30, 0); |
| 1597 addAnimatedTransformToController(*grandChildOfRS2->layerAnimationController(
), 10, 30, 0); | 1597 addAnimatedTransformToController(*grandChildOfRS2->layerAnimationController(
), 10, 30, 0); |
| 1598 | 1598 |
| 1599 setLayerPropertiesForTesting(parent.get(), layerTransform, sublayerTransform
, FloatPoint(0.25, 0), FloatPoint(2.5, 0), IntSize(10, 10), false); | 1599 setLayerPropertiesForTesting(parent.get(), layerTransform, sublayerTransform
, gfx::PointF(0.25, 0), gfx::PointF(2.5, 0), gfx::Size(10, 10), false); |
| 1600 setLayerPropertiesForTesting(renderSurface1.get(), layerTransform, sublayerT
ransform, FloatPoint(0.25, 0), FloatPoint(2.5, 0), IntSize(10, 10), false); | 1600 setLayerPropertiesForTesting(renderSurface1.get(), layerTransform, sublayerT
ransform, gfx::PointF(0.25, 0), gfx::PointF(2.5, 0), gfx::Size(10, 10), false); |
| 1601 setLayerPropertiesForTesting(renderSurface2.get(), layerTransform, sublayerT
ransform, FloatPoint(0.25, 0), FloatPoint(2.5, 0), IntSize(10, 10), false); | 1601 setLayerPropertiesForTesting(renderSurface2.get(), layerTransform, sublayerT
ransform, gfx::PointF(0.25, 0), gfx::PointF(2.5, 0), gfx::Size(10, 10), false); |
| 1602 setLayerPropertiesForTesting(childOfRoot.get(), layerTransform, sublayerTran
sform, FloatPoint(0.25, 0), FloatPoint(2.5, 0), IntSize(10, 10), false); | 1602 setLayerPropertiesForTesting(childOfRoot.get(), layerTransform, sublayerTran
sform, gfx::PointF(0.25, 0), gfx::PointF(2.5, 0), gfx::Size(10, 10), false); |
| 1603 setLayerPropertiesForTesting(childOfRS1.get(), layerTransform, sublayerTrans
form, FloatPoint(0.25, 0), FloatPoint(2.5, 0), IntSize(10, 10), false); | 1603 setLayerPropertiesForTesting(childOfRS1.get(), layerTransform, sublayerTrans
form, gfx::PointF(0.25, 0), gfx::PointF(2.5, 0), gfx::Size(10, 10), false); |
| 1604 setLayerPropertiesForTesting(childOfRS2.get(), layerTransform, sublayerTrans
form, FloatPoint(0.25, 0), FloatPoint(2.5, 0), IntSize(10, 10), false); | 1604 setLayerPropertiesForTesting(childOfRS2.get(), layerTransform, sublayerTrans
form, gfx::PointF(0.25, 0), gfx::PointF(2.5, 0), gfx::Size(10, 10), false); |
| 1605 setLayerPropertiesForTesting(grandChildOfRoot.get(), layerTransform, sublaye
rTransform, FloatPoint(0.25, 0), FloatPoint(2.5, 0), IntSize(10, 10), false); | 1605 setLayerPropertiesForTesting(grandChildOfRoot.get(), layerTransform, sublaye
rTransform, gfx::PointF(0.25, 0), gfx::PointF(2.5, 0), gfx::Size(10, 10), false)
; |
| 1606 setLayerPropertiesForTesting(grandChildOfRS1.get(), layerTransform, sublayer
Transform, FloatPoint(0.25, 0), FloatPoint(2.5, 0), IntSize(10, 10), false); | 1606 setLayerPropertiesForTesting(grandChildOfRS1.get(), layerTransform, sublayer
Transform, gfx::PointF(0.25, 0), gfx::PointF(2.5, 0), gfx::Size(10, 10), false); |
| 1607 setLayerPropertiesForTesting(grandChildOfRS2.get(), layerTransform, sublayer
Transform, FloatPoint(0.25, 0), FloatPoint(2.5, 0), IntSize(10, 10), false); | 1607 setLayerPropertiesForTesting(grandChildOfRS2.get(), layerTransform, sublayer
Transform, gfx::PointF(0.25, 0), gfx::PointF(2.5, 0), gfx::Size(10, 10), false); |
| 1608 | 1608 |
| 1609 executeCalculateDrawTransformsAndVisibility(parent.get()); | 1609 executeCalculateDrawTransformsAndVisibility(parent.get()); |
| 1610 | 1610 |
| 1611 // Only layers that are associated with render surfaces should have an actua
l renderSurface() value. | 1611 // Only layers that are associated with render surfaces should have an actua
l renderSurface() value. |
| 1612 // | 1612 // |
| 1613 ASSERT_TRUE(parent->renderSurface()); | 1613 ASSERT_TRUE(parent->renderSurface()); |
| 1614 ASSERT_FALSE(childOfRoot->renderSurface()); | 1614 ASSERT_FALSE(childOfRoot->renderSurface()); |
| 1615 ASSERT_FALSE(grandChildOfRoot->renderSurface()); | 1615 ASSERT_FALSE(grandChildOfRoot->renderSurface()); |
| 1616 | 1616 |
| 1617 ASSERT_TRUE(renderSurface1->renderSurface()); | 1617 ASSERT_TRUE(renderSurface1->renderSurface()); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1692 | 1692 |
| 1693 EXPECT_FLOAT_EQ(3, renderSurface2->screenSpaceTransform().m42()); | 1693 EXPECT_FLOAT_EQ(3, renderSurface2->screenSpaceTransform().m42()); |
| 1694 EXPECT_FLOAT_EQ(4, childOfRS2->screenSpaceTransform().m42()); | 1694 EXPECT_FLOAT_EQ(4, childOfRS2->screenSpaceTransform().m42()); |
| 1695 EXPECT_FLOAT_EQ(5, grandChildOfRS2->screenSpaceTransform().m42()); | 1695 EXPECT_FLOAT_EQ(5, grandChildOfRS2->screenSpaceTransform().m42()); |
| 1696 } | 1696 } |
| 1697 | 1697 |
| 1698 TEST(LayerTreeHostCommonTest, verifyVisibleRectForIdentityTransform) | 1698 TEST(LayerTreeHostCommonTest, verifyVisibleRectForIdentityTransform) |
| 1699 { | 1699 { |
| 1700 // Test the calculateVisibleRect() function works correctly for identity tra
nsforms. | 1700 // Test the calculateVisibleRect() function works correctly for identity tra
nsforms. |
| 1701 | 1701 |
| 1702 IntRect targetSurfaceRect = IntRect(IntPoint(0, 0), IntSize(100, 100)); | 1702 gfx::Rect targetSurfaceRect = gfx::Rect(gfx::Point(0, 0), gfx::Size(100, 100
)); |
| 1703 WebTransformationMatrix layerToSurfaceTransform; | 1703 WebTransformationMatrix layerToSurfaceTransform; |
| 1704 | 1704 |
| 1705 // Case 1: Layer is contained within the surface. | 1705 // Case 1: Layer is contained within the surface. |
| 1706 IntRect layerContentRect = IntRect(IntPoint(10, 10), IntSize(30, 30)); | 1706 gfx::Rect layerContentRect = gfx::Rect(gfx::Point(10, 10), gfx::Size(30, 30)
); |
| 1707 IntRect expected = IntRect(IntPoint(10, 10), IntSize(30, 30)); | 1707 gfx::Rect expected = gfx::Rect(gfx::Point(10, 10), gfx::Size(30, 30)); |
| 1708 IntRect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect
, layerContentRect, layerToSurfaceTransform); | 1708 gfx::Rect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRe
ct, layerContentRect, layerToSurfaceTransform); |
| 1709 EXPECT_RECT_EQ(expected, actual); | 1709 EXPECT_RECT_EQ(expected, actual); |
| 1710 | 1710 |
| 1711 // Case 2: Layer is outside the surface rect. | 1711 // Case 2: Layer is outside the surface rect. |
| 1712 layerContentRect = IntRect(IntPoint(120, 120), IntSize(30, 30)); | 1712 layerContentRect = gfx::Rect(gfx::Point(120, 120), gfx::Size(30, 30)); |
| 1713 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); | 1713 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); |
| 1714 EXPECT_TRUE(actual.isEmpty()); | 1714 EXPECT_TRUE(actual.IsEmpty()); |
| 1715 | 1715 |
| 1716 // Case 3: Layer is partially overlapping the surface rect. | 1716 // Case 3: Layer is partially overlapping the surface rect. |
| 1717 layerContentRect = IntRect(IntPoint(80, 80), IntSize(30, 30)); | 1717 layerContentRect = gfx::Rect(gfx::Point(80, 80), gfx::Size(30, 30)); |
| 1718 expected = IntRect(IntPoint(80, 80), IntSize(20, 20)); | 1718 expected = gfx::Rect(gfx::Point(80, 80), gfx::Size(20, 20)); |
| 1719 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); | 1719 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); |
| 1720 EXPECT_RECT_EQ(expected, actual); | 1720 EXPECT_RECT_EQ(expected, actual); |
| 1721 } | 1721 } |
| 1722 | 1722 |
| 1723 TEST(LayerTreeHostCommonTest, verifyVisibleRectForTranslations) | 1723 TEST(LayerTreeHostCommonTest, verifyVisibleRectForTranslations) |
| 1724 { | 1724 { |
| 1725 // Test the calculateVisibleRect() function works correctly for scaling tran
sforms. | 1725 // Test the calculateVisibleRect() function works correctly for scaling tran
sforms. |
| 1726 | 1726 |
| 1727 IntRect targetSurfaceRect = IntRect(IntPoint(0, 0), IntSize(100, 100)); | 1727 gfx::Rect targetSurfaceRect = gfx::Rect(gfx::Point(0, 0), gfx::Size(100, 100
)); |
| 1728 IntRect layerContentRect = IntRect(IntPoint(0, 0), IntSize(30, 30)); | 1728 gfx::Rect layerContentRect = gfx::Rect(gfx::Point(0, 0), gfx::Size(30, 30)); |
| 1729 WebTransformationMatrix layerToSurfaceTransform; | 1729 WebTransformationMatrix layerToSurfaceTransform; |
| 1730 | 1730 |
| 1731 // Case 1: Layer is contained within the surface. | 1731 // Case 1: Layer is contained within the surface. |
| 1732 layerToSurfaceTransform.makeIdentity(); | 1732 layerToSurfaceTransform.makeIdentity(); |
| 1733 layerToSurfaceTransform.translate(10, 10); | 1733 layerToSurfaceTransform.translate(10, 10); |
| 1734 IntRect expected = IntRect(IntPoint(0, 0), IntSize(30, 30)); | 1734 gfx::Rect expected = gfx::Rect(gfx::Point(0, 0), gfx::Size(30, 30)); |
| 1735 IntRect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect
, layerContentRect, layerToSurfaceTransform); | 1735 gfx::Rect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRe
ct, layerContentRect, layerToSurfaceTransform); |
| 1736 EXPECT_RECT_EQ(expected, actual); | 1736 EXPECT_RECT_EQ(expected, actual); |
| 1737 | 1737 |
| 1738 // Case 2: Layer is outside the surface rect. | 1738 // Case 2: Layer is outside the surface rect. |
| 1739 layerToSurfaceTransform.makeIdentity(); | 1739 layerToSurfaceTransform.makeIdentity(); |
| 1740 layerToSurfaceTransform.translate(120, 120); | 1740 layerToSurfaceTransform.translate(120, 120); |
| 1741 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); | 1741 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); |
| 1742 EXPECT_TRUE(actual.isEmpty()); | 1742 EXPECT_TRUE(actual.IsEmpty()); |
| 1743 | 1743 |
| 1744 // Case 3: Layer is partially overlapping the surface rect. | 1744 // Case 3: Layer is partially overlapping the surface rect. |
| 1745 layerToSurfaceTransform.makeIdentity(); | 1745 layerToSurfaceTransform.makeIdentity(); |
| 1746 layerToSurfaceTransform.translate(80, 80); | 1746 layerToSurfaceTransform.translate(80, 80); |
| 1747 expected = IntRect(IntPoint(0, 0), IntSize(20, 20)); | 1747 expected = gfx::Rect(gfx::Point(0, 0), gfx::Size(20, 20)); |
| 1748 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); | 1748 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); |
| 1749 EXPECT_RECT_EQ(expected, actual); | 1749 EXPECT_RECT_EQ(expected, actual); |
| 1750 } | 1750 } |
| 1751 | 1751 |
| 1752 TEST(LayerTreeHostCommonTest, verifyVisibleRectFor2DRotations) | 1752 TEST(LayerTreeHostCommonTest, verifyVisibleRectFor2DRotations) |
| 1753 { | 1753 { |
| 1754 // Test the calculateVisibleRect() function works correctly for rotations ab
out z-axis (i.e. 2D rotations). | 1754 // Test the calculateVisibleRect() function works correctly for rotations ab
out z-axis (i.e. 2D rotations). |
| 1755 // Remember that calculateVisibleRect() should return the visible rect in th
e layer's space. | 1755 // Remember that calculateVisibleRect() should return the visible rect in th
e layer's space. |
| 1756 | 1756 |
| 1757 IntRect targetSurfaceRect = IntRect(IntPoint(0, 0), IntSize(100, 100)); | 1757 gfx::Rect targetSurfaceRect = gfx::Rect(gfx::Point(0, 0), gfx::Size(100, 100
)); |
| 1758 IntRect layerContentRect = IntRect(IntPoint(0, 0), IntSize(30, 30)); | 1758 gfx::Rect layerContentRect = gfx::Rect(gfx::Point(0, 0), gfx::Size(30, 30)); |
| 1759 WebTransformationMatrix layerToSurfaceTransform; | 1759 WebTransformationMatrix layerToSurfaceTransform; |
| 1760 | 1760 |
| 1761 // Case 1: Layer is contained within the surface. | 1761 // Case 1: Layer is contained within the surface. |
| 1762 layerToSurfaceTransform.makeIdentity(); | 1762 layerToSurfaceTransform.makeIdentity(); |
| 1763 layerToSurfaceTransform.translate(50, 50); | 1763 layerToSurfaceTransform.translate(50, 50); |
| 1764 layerToSurfaceTransform.rotate(45); | 1764 layerToSurfaceTransform.rotate(45); |
| 1765 IntRect expected = IntRect(IntPoint(0, 0), IntSize(30, 30)); | 1765 gfx::Rect expected = gfx::Rect(gfx::Point(0, 0), gfx::Size(30, 30)); |
| 1766 IntRect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect
, layerContentRect, layerToSurfaceTransform); | 1766 gfx::Rect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRe
ct, layerContentRect, layerToSurfaceTransform); |
| 1767 EXPECT_RECT_EQ(expected, actual); | 1767 EXPECT_RECT_EQ(expected, actual); |
| 1768 | 1768 |
| 1769 // Case 2: Layer is outside the surface rect. | 1769 // Case 2: Layer is outside the surface rect. |
| 1770 layerToSurfaceTransform.makeIdentity(); | 1770 layerToSurfaceTransform.makeIdentity(); |
| 1771 layerToSurfaceTransform.translate(-50, 0); | 1771 layerToSurfaceTransform.translate(-50, 0); |
| 1772 layerToSurfaceTransform.rotate(45); | 1772 layerToSurfaceTransform.rotate(45); |
| 1773 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); | 1773 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); |
| 1774 EXPECT_TRUE(actual.isEmpty()); | 1774 EXPECT_TRUE(actual.IsEmpty()); |
| 1775 | 1775 |
| 1776 // Case 3: The layer is rotated about its top-left corner. In surface space,
the layer | 1776 // Case 3: The layer is rotated about its top-left corner. In surface space,
the layer |
| 1777 // is oriented diagonally, with the left half outside of the renderS
urface. In | 1777 // is oriented diagonally, with the left half outside of the renderS
urface. In |
| 1778 // this case, the visible rect should still be the entire layer (rem
ember the | 1778 // this case, the visible rect should still be the entire layer (rem
ember the |
| 1779 // visible rect is computed in layer space); both the top-left and | 1779 // visible rect is computed in layer space); both the top-left and |
| 1780 // bottom-right corners of the layer are still visible. | 1780 // bottom-right corners of the layer are still visible. |
| 1781 layerToSurfaceTransform.makeIdentity(); | 1781 layerToSurfaceTransform.makeIdentity(); |
| 1782 layerToSurfaceTransform.rotate(45); | 1782 layerToSurfaceTransform.rotate(45); |
| 1783 expected = IntRect(IntPoint(0, 0), IntSize(30, 30)); | 1783 expected = gfx::Rect(gfx::Point(0, 0), gfx::Size(30, 30)); |
| 1784 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); | 1784 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); |
| 1785 EXPECT_RECT_EQ(expected, actual); | 1785 EXPECT_RECT_EQ(expected, actual); |
| 1786 | 1786 |
| 1787 // Case 4: The layer is rotated about its top-left corner, and translated up
wards. In | 1787 // Case 4: The layer is rotated about its top-left corner, and translated up
wards. In |
| 1788 // surface space, the layer is oriented diagonally, with only the to
p corner | 1788 // surface space, the layer is oriented diagonally, with only the to
p corner |
| 1789 // of the surface overlapping the layer. In layer space, the render
surface | 1789 // of the surface overlapping the layer. In layer space, the render
surface |
| 1790 // overlaps the right side of the layer. The visible rect should be
the | 1790 // overlaps the right side of the layer. The visible rect should be
the |
| 1791 // layer's right half. | 1791 // layer's right half. |
| 1792 layerToSurfaceTransform.makeIdentity(); | 1792 layerToSurfaceTransform.makeIdentity(); |
| 1793 layerToSurfaceTransform.translate(0, -sqrt(2.0) * 15); | 1793 layerToSurfaceTransform.translate(0, -sqrt(2.0) * 15); |
| 1794 layerToSurfaceTransform.rotate(45); | 1794 layerToSurfaceTransform.rotate(45); |
| 1795 expected = IntRect(IntPoint(15, 0), IntSize(15, 30)); // right half of layer
bounds. | 1795 expected = gfx::Rect(gfx::Point(15, 0), gfx::Size(15, 30)); // right half of
layer bounds. |
| 1796 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); | 1796 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); |
| 1797 EXPECT_RECT_EQ(expected, actual); | 1797 EXPECT_RECT_EQ(expected, actual); |
| 1798 } | 1798 } |
| 1799 | 1799 |
| 1800 TEST(LayerTreeHostCommonTest, verifyVisibleRectFor3dOrthographicTransform) | 1800 TEST(LayerTreeHostCommonTest, verifyVisibleRectFor3dOrthographicTransform) |
| 1801 { | 1801 { |
| 1802 // Test that the calculateVisibleRect() function works correctly for 3d tran
sforms. | 1802 // Test that the calculateVisibleRect() function works correctly for 3d tran
sforms. |
| 1803 | 1803 |
| 1804 IntRect targetSurfaceRect = IntRect(IntPoint(0, 0), IntSize(100, 100)); | 1804 gfx::Rect targetSurfaceRect = gfx::Rect(gfx::Point(0, 0), gfx::Size(100, 100
)); |
| 1805 IntRect layerContentRect = IntRect(IntPoint(0, 0), IntSize(100, 100)); | 1805 gfx::Rect layerContentRect = gfx::Rect(gfx::Point(0, 0), gfx::Size(100, 100)
); |
| 1806 WebTransformationMatrix layerToSurfaceTransform; | 1806 WebTransformationMatrix layerToSurfaceTransform; |
| 1807 | 1807 |
| 1808 // Case 1: Orthographic projection of a layer rotated about y-axis by 45 deg
rees, should be fully contained in the renderSurface. | 1808 // Case 1: Orthographic projection of a layer rotated about y-axis by 45 deg
rees, should be fully contained in the renderSurface. |
| 1809 layerToSurfaceTransform.makeIdentity(); | 1809 layerToSurfaceTransform.makeIdentity(); |
| 1810 layerToSurfaceTransform.rotate3d(0, 45, 0); | 1810 layerToSurfaceTransform.rotate3d(0, 45, 0); |
| 1811 IntRect expected = IntRect(IntPoint(0, 0), IntSize(100, 100)); | 1811 gfx::Rect expected = gfx::Rect(gfx::Point(0, 0), gfx::Size(100, 100)); |
| 1812 IntRect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect
, layerContentRect, layerToSurfaceTransform); | 1812 gfx::Rect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRe
ct, layerContentRect, layerToSurfaceTransform); |
| 1813 EXPECT_RECT_EQ(expected, actual); | 1813 EXPECT_RECT_EQ(expected, actual); |
| 1814 | 1814 |
| 1815 // Case 2: Orthographic projection of a layer rotated about y-axis by 45 deg
rees, but | 1815 // Case 2: Orthographic projection of a layer rotated about y-axis by 45 deg
rees, but |
| 1816 // shifted to the side so only the right-half the layer would be vis
ible on | 1816 // shifted to the side so only the right-half the layer would be vis
ible on |
| 1817 // the surface. | 1817 // the surface. |
| 1818 double halfWidthOfRotatedLayer = (100 / sqrt(2.0)) * 0.5; // 100 is the un-r
otated layer width; divided by sqrt(2) is the rotated width. | 1818 double halfWidthOfRotatedLayer = (100 / sqrt(2.0)) * 0.5; // 100 is the un-r
otated layer width; divided by sqrt(2) is the rotated width. |
| 1819 layerToSurfaceTransform.makeIdentity(); | 1819 layerToSurfaceTransform.makeIdentity(); |
| 1820 layerToSurfaceTransform.translate(-halfWidthOfRotatedLayer, 0); | 1820 layerToSurfaceTransform.translate(-halfWidthOfRotatedLayer, 0); |
| 1821 layerToSurfaceTransform.rotate3d(0, 45, 0); // rotates about the left edge o
f the layer | 1821 layerToSurfaceTransform.rotate3d(0, 45, 0); // rotates about the left edge o
f the layer |
| 1822 expected = IntRect(IntPoint(50, 0), IntSize(50, 100)); // right half of the
layer. | 1822 expected = gfx::Rect(gfx::Point(50, 0), gfx::Size(50, 100)); // right half o
f the layer. |
| 1823 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); | 1823 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); |
| 1824 EXPECT_RECT_EQ(expected, actual); | 1824 EXPECT_RECT_EQ(expected, actual); |
| 1825 } | 1825 } |
| 1826 | 1826 |
| 1827 TEST(LayerTreeHostCommonTest, verifyVisibleRectFor3dPerspectiveTransform) | 1827 TEST(LayerTreeHostCommonTest, verifyVisibleRectFor3dPerspectiveTransform) |
| 1828 { | 1828 { |
| 1829 // Test the calculateVisibleRect() function works correctly when the layer h
as a | 1829 // Test the calculateVisibleRect() function works correctly when the layer h
as a |
| 1830 // perspective projection onto the target surface. | 1830 // perspective projection onto the target surface. |
| 1831 | 1831 |
| 1832 IntRect targetSurfaceRect = IntRect(IntPoint(0, 0), IntSize(100, 100)); | 1832 gfx::Rect targetSurfaceRect = gfx::Rect(gfx::Point(0, 0), gfx::Size(100, 100
)); |
| 1833 IntRect layerContentRect = IntRect(IntPoint(-50, -50), IntSize(200, 200)); | 1833 gfx::Rect layerContentRect = gfx::Rect(gfx::Point(-50, -50), gfx::Size(200,
200)); |
| 1834 WebTransformationMatrix layerToSurfaceTransform; | 1834 WebTransformationMatrix layerToSurfaceTransform; |
| 1835 | 1835 |
| 1836 // Case 1: Even though the layer is twice as large as the surface, due to pe
rspective | 1836 // Case 1: Even though the layer is twice as large as the surface, due to pe
rspective |
| 1837 // foreshortening, the layer will fit fully in the surface when its
translated | 1837 // foreshortening, the layer will fit fully in the surface when its
translated |
| 1838 // more than the perspective amount. | 1838 // more than the perspective amount. |
| 1839 layerToSurfaceTransform.makeIdentity(); | 1839 layerToSurfaceTransform.makeIdentity(); |
| 1840 | 1840 |
| 1841 // The following sequence of transforms applies the perspective about the ce
nter of the surface. | 1841 // The following sequence of transforms applies the perspective about the ce
nter of the surface. |
| 1842 layerToSurfaceTransform.translate(50, 50); | 1842 layerToSurfaceTransform.translate(50, 50); |
| 1843 layerToSurfaceTransform.applyPerspective(9); | 1843 layerToSurfaceTransform.applyPerspective(9); |
| 1844 layerToSurfaceTransform.translate(-50, -50); | 1844 layerToSurfaceTransform.translate(-50, -50); |
| 1845 | 1845 |
| 1846 // This translate places the layer in front of the surface's projection plan
e. | 1846 // This translate places the layer in front of the surface's projection plan
e. |
| 1847 layerToSurfaceTransform.translate3d(0, 0, -27); | 1847 layerToSurfaceTransform.translate3d(0, 0, -27); |
| 1848 | 1848 |
| 1849 IntRect expected = IntRect(IntPoint(-50, -50), IntSize(200, 200)); | 1849 gfx::Rect expected = gfx::Rect(gfx::Point(-50, -50), gfx::Size(200, 200)); |
| 1850 IntRect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect
, layerContentRect, layerToSurfaceTransform); | 1850 gfx::Rect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRe
ct, layerContentRect, layerToSurfaceTransform); |
| 1851 EXPECT_RECT_EQ(expected, actual); | 1851 EXPECT_RECT_EQ(expected, actual); |
| 1852 | 1852 |
| 1853 // Case 2: same projection as before, except that the layer is also translat
ed to the | 1853 // Case 2: same projection as before, except that the layer is also translat
ed to the |
| 1854 // side, so that only the right half of the layer should be visible. | 1854 // side, so that only the right half of the layer should be visible. |
| 1855 // | 1855 // |
| 1856 // Explanation of expected result: | 1856 // Explanation of expected result: |
| 1857 // The perspective ratio is (z distance between layer and camera origin) / (
z distance between projection plane and camera origin) == ((-27 - 9) / 9) | 1857 // The perspective ratio is (z distance between layer and camera origin) / (
z distance between projection plane and camera origin) == ((-27 - 9) / 9) |
| 1858 // Then, by similar triangles, if we want to move a layer by translating -50
units in projected surface units (so that only half of it is | 1858 // Then, by similar triangles, if we want to move a layer by translating -50
units in projected surface units (so that only half of it is |
| 1859 // visible), then we would need to translate by (-36 / 9) * -50 == -200 in t
he layer's units. | 1859 // visible), then we would need to translate by (-36 / 9) * -50 == -200 in t
he layer's units. |
| 1860 // | 1860 // |
| 1861 layerToSurfaceTransform.translate3d(-200, 0, 0); | 1861 layerToSurfaceTransform.translate3d(-200, 0, 0); |
| 1862 expected = IntRect(IntPoint(50, -50), IntSize(100, 200)); // The right half
of the layer's bounding rect. | 1862 expected = gfx::Rect(gfx::Point(50, -50), gfx::Size(100, 200)); // The right
half of the layer's bounding rect. |
| 1863 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); | 1863 actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect, layerC
ontentRect, layerToSurfaceTransform); |
| 1864 EXPECT_RECT_EQ(expected, actual); | 1864 EXPECT_RECT_EQ(expected, actual); |
| 1865 } | 1865 } |
| 1866 | 1866 |
| 1867 TEST(LayerTreeHostCommonTest, verifyVisibleRectFor3dOrthographicIsNotClippedBehi
ndSurface) | 1867 TEST(LayerTreeHostCommonTest, verifyVisibleRectFor3dOrthographicIsNotClippedBehi
ndSurface) |
| 1868 { | 1868 { |
| 1869 // There is currently no explicit concept of an orthographic projection plan
e in our | 1869 // There is currently no explicit concept of an orthographic projection plan
e in our |
| 1870 // code (nor in the CSS spec to my knowledge). Therefore, layers that are te
chnically | 1870 // code (nor in the CSS spec to my knowledge). Therefore, layers that are te
chnically |
| 1871 // behind the surface in an orthographic world should not be clipped when th
ey are | 1871 // behind the surface in an orthographic world should not be clipped when th
ey are |
| 1872 // flattened to the surface. | 1872 // flattened to the surface. |
| 1873 | 1873 |
| 1874 IntRect targetSurfaceRect = IntRect(IntPoint(0, 0), IntSize(100, 100)); | 1874 gfx::Rect targetSurfaceRect = gfx::Rect(gfx::Point(0, 0), gfx::Size(100, 100
)); |
| 1875 IntRect layerContentRect = IntRect(IntPoint(0, 0), IntSize(100, 100)); | 1875 gfx::Rect layerContentRect = gfx::Rect(gfx::Point(0, 0), gfx::Size(100, 100)
); |
| 1876 WebTransformationMatrix layerToSurfaceTransform; | 1876 WebTransformationMatrix layerToSurfaceTransform; |
| 1877 | 1877 |
| 1878 // This sequence of transforms effectively rotates the layer about the y-axi
s at the | 1878 // This sequence of transforms effectively rotates the layer about the y-axi
s at the |
| 1879 // center of the layer. | 1879 // center of the layer. |
| 1880 layerToSurfaceTransform.makeIdentity(); | 1880 layerToSurfaceTransform.makeIdentity(); |
| 1881 layerToSurfaceTransform.translate(50, 0); | 1881 layerToSurfaceTransform.translate(50, 0); |
| 1882 layerToSurfaceTransform.rotate3d(0, 45, 0); | 1882 layerToSurfaceTransform.rotate3d(0, 45, 0); |
| 1883 layerToSurfaceTransform.translate(-50, 0); | 1883 layerToSurfaceTransform.translate(-50, 0); |
| 1884 | 1884 |
| 1885 IntRect expected = IntRect(IntPoint(0, 0), IntSize(100, 100)); | 1885 gfx::Rect expected = gfx::Rect(gfx::Point(0, 0), gfx::Size(100, 100)); |
| 1886 IntRect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect
, layerContentRect, layerToSurfaceTransform); | 1886 gfx::Rect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRe
ct, layerContentRect, layerToSurfaceTransform); |
| 1887 EXPECT_RECT_EQ(expected, actual); | 1887 EXPECT_RECT_EQ(expected, actual); |
| 1888 } | 1888 } |
| 1889 | 1889 |
| 1890 TEST(LayerTreeHostCommonTest, verifyVisibleRectFor3dPerspectiveWhenClippedByW) | 1890 TEST(LayerTreeHostCommonTest, verifyVisibleRectFor3dPerspectiveWhenClippedByW) |
| 1891 { | 1891 { |
| 1892 // Test the calculateVisibleRect() function works correctly when projecting
a surface | 1892 // Test the calculateVisibleRect() function works correctly when projecting
a surface |
| 1893 // onto a layer, but the layer is partially behind the camera (not just behi
nd the | 1893 // onto a layer, but the layer is partially behind the camera (not just behi
nd the |
| 1894 // projection plane). In this case, the cartesian coordinates may seem to be
valid, | 1894 // projection plane). In this case, the cartesian coordinates may seem to be
valid, |
| 1895 // but actually they are not. The visibleRect needs to be properly clipped b
y the | 1895 // but actually they are not. The visibleRect needs to be properly clipped b
y the |
| 1896 // w = 0 plane in homogeneous coordinates before converting to cartesian coo
rdinates. | 1896 // w = 0 plane in homogeneous coordinates before converting to cartesian coo
rdinates. |
| 1897 | 1897 |
| 1898 IntRect targetSurfaceRect = IntRect(IntPoint(-50, -50), IntSize(100, 100)); | 1898 gfx::Rect targetSurfaceRect = gfx::Rect(gfx::Point(-50, -50), gfx::Size(100,
100)); |
| 1899 IntRect layerContentRect = IntRect(IntPoint(-10, -1), IntSize(20, 2)); | 1899 gfx::Rect layerContentRect = gfx::Rect(gfx::Point(-10, -1), gfx::Size(20, 2)
); |
| 1900 WebTransformationMatrix layerToSurfaceTransform; | 1900 WebTransformationMatrix layerToSurfaceTransform; |
| 1901 | 1901 |
| 1902 // The layer is positioned so that the right half of the layer should be in
front of | 1902 // The layer is positioned so that the right half of the layer should be in
front of |
| 1903 // the camera, while the other half is behind the surface's projection plane
. The | 1903 // the camera, while the other half is behind the surface's projection plane
. The |
| 1904 // following sequence of transforms applies the perspective and rotation abo
ut the | 1904 // following sequence of transforms applies the perspective and rotation abo
ut the |
| 1905 // center of the layer. | 1905 // center of the layer. |
| 1906 layerToSurfaceTransform.makeIdentity(); | 1906 layerToSurfaceTransform.makeIdentity(); |
| 1907 layerToSurfaceTransform.applyPerspective(1); | 1907 layerToSurfaceTransform.applyPerspective(1); |
| 1908 layerToSurfaceTransform.translate3d(-2, 0, 1); | 1908 layerToSurfaceTransform.translate3d(-2, 0, 1); |
| 1909 layerToSurfaceTransform.rotate3d(0, 45, 0); | 1909 layerToSurfaceTransform.rotate3d(0, 45, 0); |
| 1910 | 1910 |
| 1911 // Sanity check that this transform does indeed cause w < 0 when applying th
e | 1911 // Sanity check that this transform does indeed cause w < 0 when applying th
e |
| 1912 // transform, otherwise this code is not testing the intended scenario. | 1912 // transform, otherwise this code is not testing the intended scenario. |
| 1913 bool clipped = false; | 1913 bool clipped = false; |
| 1914 MathUtil::mapQuad(layerToSurfaceTransform, FloatQuad(FloatRect(layerContentR
ect)), clipped); | 1914 MathUtil::mapQuad(layerToSurfaceTransform, FloatQuad(gfx::RectF(layerContent
Rect)), clipped); |
| 1915 ASSERT_TRUE(clipped); | 1915 ASSERT_TRUE(clipped); |
| 1916 | 1916 |
| 1917 int expectedXPosition = 0; | 1917 int expectedXPosition = 0; |
| 1918 int expectedWidth = 10; | 1918 int expectedWidth = 10; |
| 1919 IntRect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect
, layerContentRect, layerToSurfaceTransform); | 1919 gfx::Rect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRe
ct, layerContentRect, layerToSurfaceTransform); |
| 1920 EXPECT_EQ(expectedXPosition, actual.x()); | 1920 EXPECT_EQ(expectedXPosition, actual.x()); |
| 1921 EXPECT_EQ(expectedWidth, actual.width()); | 1921 EXPECT_EQ(expectedWidth, actual.width()); |
| 1922 } | 1922 } |
| 1923 | 1923 |
| 1924 TEST(LayerTreeHostCommonTest, verifyVisibleRectForPerspectiveUnprojection) | 1924 TEST(LayerTreeHostCommonTest, verifyVisibleRectForPerspectiveUnprojection) |
| 1925 { | 1925 { |
| 1926 // To determine visibleRect in layer space, there needs to be an un-projecti
on from | 1926 // To determine visibleRect in layer space, there needs to be an un-projecti
on from |
| 1927 // surface space to layer space. When the original transform was a perspecti
ve | 1927 // surface space to layer space. When the original transform was a perspecti
ve |
| 1928 // projection that was clipped, it returns a rect that encloses the clipped
bounds. | 1928 // projection that was clipped, it returns a rect that encloses the clipped
bounds. |
| 1929 // Un-projecting this new rect may require clipping again. | 1929 // Un-projecting this new rect may require clipping again. |
| 1930 | 1930 |
| 1931 // This sequence of transforms causes one corner of the layer to protrude ac
ross the w = 0 plane, and should be clipped. | 1931 // This sequence of transforms causes one corner of the layer to protrude ac
ross the w = 0 plane, and should be clipped. |
| 1932 IntRect targetSurfaceRect = IntRect(IntPoint(-50, -50), IntSize(100, 100)); | 1932 gfx::Rect targetSurfaceRect = gfx::Rect(gfx::Point(-50, -50), gfx::Size(100,
100)); |
| 1933 IntRect layerContentRect = IntRect(IntPoint(-10, -10), IntSize(20, 20)); | 1933 gfx::Rect layerContentRect = gfx::Rect(gfx::Point(-10, -10), gfx::Size(20, 2
0)); |
| 1934 WebTransformationMatrix layerToSurfaceTransform; | 1934 WebTransformationMatrix layerToSurfaceTransform; |
| 1935 layerToSurfaceTransform.makeIdentity(); | 1935 layerToSurfaceTransform.makeIdentity(); |
| 1936 layerToSurfaceTransform.applyPerspective(1); | 1936 layerToSurfaceTransform.applyPerspective(1); |
| 1937 layerToSurfaceTransform.translate3d(0, 0, -5); | 1937 layerToSurfaceTransform.translate3d(0, 0, -5); |
| 1938 layerToSurfaceTransform.rotate3d(0, 45, 0); | 1938 layerToSurfaceTransform.rotate3d(0, 45, 0); |
| 1939 layerToSurfaceTransform.rotate3d(80, 0, 0); | 1939 layerToSurfaceTransform.rotate3d(80, 0, 0); |
| 1940 | 1940 |
| 1941 // Sanity check that un-projection does indeed cause w < 0, otherwise this c
ode is not | 1941 // Sanity check that un-projection does indeed cause w < 0, otherwise this c
ode is not |
| 1942 // testing the intended scenario. | 1942 // testing the intended scenario. |
| 1943 bool clipped = false; | 1943 bool clipped = false; |
| 1944 FloatRect clippedRect = MathUtil::mapClippedRect(layerToSurfaceTransform, la
yerContentRect); | 1944 gfx::RectF clippedRect = MathUtil::mapClippedRect(layerToSurfaceTransform, l
ayerContentRect); |
| 1945 MathUtil::projectQuad(layerToSurfaceTransform.inverse(), FloatQuad(clippedRe
ct), clipped); | 1945 MathUtil::projectQuad(layerToSurfaceTransform.inverse(), FloatQuad(clippedRe
ct), clipped); |
| 1946 ASSERT_TRUE(clipped); | 1946 ASSERT_TRUE(clipped); |
| 1947 | 1947 |
| 1948 // Only the corner of the layer is not visible on the surface because of bei
ng | 1948 // Only the corner of the layer is not visible on the surface because of bei
ng |
| 1949 // clipped. But, the net result of rounding visible region to an axis-aligne
d rect is | 1949 // clipped. But, the net result of rounding visible region to an axis-aligne
d rect is |
| 1950 // that the entire layer should still be considered visible. | 1950 // that the entire layer should still be considered visible. |
| 1951 IntRect expected = IntRect(IntPoint(-10, -10), IntSize(20, 20)); | 1951 gfx::Rect expected = gfx::Rect(gfx::Point(-10, -10), gfx::Size(20, 20)); |
| 1952 IntRect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRect
, layerContentRect, layerToSurfaceTransform); | 1952 gfx::Rect actual = LayerTreeHostCommon::calculateVisibleRect(targetSurfaceRe
ct, layerContentRect, layerToSurfaceTransform); |
| 1953 EXPECT_RECT_EQ(expected, actual); | 1953 EXPECT_RECT_EQ(expected, actual); |
| 1954 } | 1954 } |
| 1955 | 1955 |
| 1956 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsForSimpleLayer
s) | 1956 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsForSimpleLayer
s) |
| 1957 { | 1957 { |
| 1958 scoped_refptr<Layer> root = Layer::create(); | 1958 scoped_refptr<Layer> root = Layer::create(); |
| 1959 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 1959 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 1960 scoped_refptr<LayerWithForcedDrawsContent> child2 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 1960 scoped_refptr<LayerWithForcedDrawsContent> child2 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 1961 scoped_refptr<LayerWithForcedDrawsContent> child3 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 1961 scoped_refptr<LayerWithForcedDrawsContent> child3 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 1962 root->addChild(child1); | 1962 root->addChild(child1); |
| 1963 root->addChild(child2); | 1963 root->addChild(child2); |
| 1964 root->addChild(child3); | 1964 root->addChild(child3); |
| 1965 | 1965 |
| 1966 WebTransformationMatrix identityMatrix; | 1966 WebTransformationMatrix identityMatrix; |
| 1967 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, Flo
atPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 1967 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, gfx
::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 1968 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(50, 50), false); | 1968 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(50, 50), false); |
| 1969 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(75, 75), IntSize(50, 50), false); | 1969 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(75, 75), gfx::Size(50, 50), false); |
| 1970 setLayerPropertiesForTesting(child3.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(125, 125), IntSize(50, 50), false); | 1970 setLayerPropertiesForTesting(child3.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(125, 125), gfx::Size(50, 50), false); |
| 1971 | 1971 |
| 1972 executeCalculateDrawTransformsAndVisibility(root.get()); | 1972 executeCalculateDrawTransformsAndVisibility(root.get()); |
| 1973 | 1973 |
| 1974 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), root->renderSurface()->drawableConte
ntRect()); | 1974 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->renderSurface()->drawableCon
tentRect()); |
| 1975 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), root->drawableContentRect()); | 1975 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawableContentRect()); |
| 1976 | 1976 |
| 1977 // Layers that do not draw content should have empty visibleContentRects. | 1977 // Layers that do not draw content should have empty visibleContentRects. |
| 1978 EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), root->visibleContentRect()); | 1978 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visibleContentRect()); |
| 1979 | 1979 |
| 1980 // layer visibleContentRects are clipped by their targetSurface | 1980 // layer visibleContentRects are clipped by their targetSurface |
| 1981 EXPECT_RECT_EQ(IntRect(0, 0, 50, 50), child1->visibleContentRect()); | 1981 EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visibleContentRect()); |
| 1982 EXPECT_RECT_EQ(IntRect(0, 0, 25, 25), child2->visibleContentRect()); | 1982 EXPECT_RECT_EQ(gfx::Rect(0, 0, 25, 25), child2->visibleContentRect()); |
| 1983 EXPECT_TRUE(child3->visibleContentRect().isEmpty()); | 1983 EXPECT_TRUE(child3->visibleContentRect().IsEmpty()); |
| 1984 | 1984 |
| 1985 // layer drawableContentRects are not clipped. | 1985 // layer drawableContentRects are not clipped. |
| 1986 EXPECT_RECT_EQ(IntRect(0, 0, 50, 50), child1->drawableContentRect()); | 1986 EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child1->drawableContentRect()); |
| 1987 EXPECT_RECT_EQ(IntRect(75, 75, 50, 50), child2->drawableContentRect()); | 1987 EXPECT_RECT_EQ(gfx::Rect(75, 75, 50, 50), child2->drawableContentRect()); |
| 1988 EXPECT_RECT_EQ(IntRect(125, 125, 50, 50), child3->drawableContentRect()); | 1988 EXPECT_RECT_EQ(gfx::Rect(125, 125, 50, 50), child3->drawableContentRect()); |
| 1989 } | 1989 } |
| 1990 | 1990 |
| 1991 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsForLayersClipp
edByLayer) | 1991 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsForLayersClipp
edByLayer) |
| 1992 { | 1992 { |
| 1993 scoped_refptr<Layer> root = Layer::create(); | 1993 scoped_refptr<Layer> root = Layer::create(); |
| 1994 scoped_refptr<Layer> child = Layer::create(); | 1994 scoped_refptr<Layer> child = Layer::create(); |
| 1995 scoped_refptr<LayerWithForcedDrawsContent> grandChild1 = make_scoped_refptr(
new LayerWithForcedDrawsContent()); | 1995 scoped_refptr<LayerWithForcedDrawsContent> grandChild1 = make_scoped_refptr(
new LayerWithForcedDrawsContent()); |
| 1996 scoped_refptr<LayerWithForcedDrawsContent> grandChild2 = make_scoped_refptr(
new LayerWithForcedDrawsContent()); | 1996 scoped_refptr<LayerWithForcedDrawsContent> grandChild2 = make_scoped_refptr(
new LayerWithForcedDrawsContent()); |
| 1997 scoped_refptr<LayerWithForcedDrawsContent> grandChild3 = make_scoped_refptr(
new LayerWithForcedDrawsContent()); | 1997 scoped_refptr<LayerWithForcedDrawsContent> grandChild3 = make_scoped_refptr(
new LayerWithForcedDrawsContent()); |
| 1998 root->addChild(child); | 1998 root->addChild(child); |
| 1999 child->addChild(grandChild1); | 1999 child->addChild(grandChild1); |
| 2000 child->addChild(grandChild2); | 2000 child->addChild(grandChild2); |
| 2001 child->addChild(grandChild3); | 2001 child->addChild(grandChild3); |
| 2002 | 2002 |
| 2003 WebTransformationMatrix identityMatrix; | 2003 WebTransformationMatrix identityMatrix; |
| 2004 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, Flo
atPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2004 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, gfx
::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2005 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2005 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2006 setLayerPropertiesForTesting(grandChild1.get(), identityMatrix, identityMatr
ix, FloatPoint(0, 0), FloatPoint(5, 5), IntSize(50, 50), false); | 2006 setLayerPropertiesForTesting(grandChild1.get(), identityMatrix, identityMatr
ix, gfx::PointF(0, 0), gfx::PointF(5, 5), gfx::Size(50, 50), false); |
| 2007 setLayerPropertiesForTesting(grandChild2.get(), identityMatrix, identityMatr
ix, FloatPoint(0, 0), FloatPoint(75, 75), IntSize(50, 50), false); | 2007 setLayerPropertiesForTesting(grandChild2.get(), identityMatrix, identityMatr
ix, gfx::PointF(0, 0), gfx::PointF(75, 75), gfx::Size(50, 50), false); |
| 2008 setLayerPropertiesForTesting(grandChild3.get(), identityMatrix, identityMatr
ix, FloatPoint(0, 0), FloatPoint(125, 125), IntSize(50, 50), false); | 2008 setLayerPropertiesForTesting(grandChild3.get(), identityMatrix, identityMatr
ix, gfx::PointF(0, 0), gfx::PointF(125, 125), gfx::Size(50, 50), false); |
| 2009 | 2009 |
| 2010 child->setMasksToBounds(true); | 2010 child->setMasksToBounds(true); |
| 2011 executeCalculateDrawTransformsAndVisibility(root.get()); | 2011 executeCalculateDrawTransformsAndVisibility(root.get()); |
| 2012 | 2012 |
| 2013 ASSERT_FALSE(child->renderSurface()); | 2013 ASSERT_FALSE(child->renderSurface()); |
| 2014 | 2014 |
| 2015 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), root->renderSurface()->drawableConte
ntRect()); | 2015 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->renderSurface()->drawableCon
tentRect()); |
| 2016 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), root->drawableContentRect()); | 2016 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawableContentRect()); |
| 2017 | 2017 |
| 2018 // Layers that do not draw content should have empty visibleContentRects. | 2018 // Layers that do not draw content should have empty visibleContentRects. |
| 2019 EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), root->visibleContentRect()); | 2019 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visibleContentRect()); |
| 2020 EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), child->visibleContentRect()); | 2020 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), child->visibleContentRect()); |
| 2021 | 2021 |
| 2022 // All grandchild visibleContentRects should be clipped by child. | 2022 // All grandchild visibleContentRects should be clipped by child. |
| 2023 EXPECT_RECT_EQ(IntRect(0, 0, 50, 50), grandChild1->visibleContentRect()); | 2023 EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), grandChild1->visibleContentRect()); |
| 2024 EXPECT_RECT_EQ(IntRect(0, 0, 25, 25), grandChild2->visibleContentRect()); | 2024 EXPECT_RECT_EQ(gfx::Rect(0, 0, 25, 25), grandChild2->visibleContentRect()); |
| 2025 EXPECT_TRUE(grandChild3->visibleContentRect().isEmpty()); | 2025 EXPECT_TRUE(grandChild3->visibleContentRect().IsEmpty()); |
| 2026 | 2026 |
| 2027 // All grandchild drawableContentRects should also be clipped by child. | 2027 // All grandchild drawableContentRects should also be clipped by child. |
| 2028 EXPECT_RECT_EQ(IntRect(5, 5, 50, 50), grandChild1->drawableContentRect()); | 2028 EXPECT_RECT_EQ(gfx::Rect(5, 5, 50, 50), grandChild1->drawableContentRect()); |
| 2029 EXPECT_RECT_EQ(IntRect(75, 75, 25, 25), grandChild2->drawableContentRect()); | 2029 EXPECT_RECT_EQ(gfx::Rect(75, 75, 25, 25), grandChild2->drawableContentRect()
); |
| 2030 EXPECT_TRUE(grandChild3->drawableContentRect().isEmpty()); | 2030 EXPECT_TRUE(grandChild3->drawableContentRect().IsEmpty()); |
| 2031 } | 2031 } |
| 2032 | 2032 |
| 2033 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsForLayersInUnc
lippedRenderSurface) | 2033 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsForLayersInUnc
lippedRenderSurface) |
| 2034 { | 2034 { |
| 2035 scoped_refptr<Layer> root = Layer::create(); | 2035 scoped_refptr<Layer> root = Layer::create(); |
| 2036 scoped_refptr<Layer> renderSurface1 = Layer::create(); | 2036 scoped_refptr<Layer> renderSurface1 = Layer::create(); |
| 2037 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 2037 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 2038 scoped_refptr<LayerWithForcedDrawsContent> child2 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 2038 scoped_refptr<LayerWithForcedDrawsContent> child2 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 2039 scoped_refptr<LayerWithForcedDrawsContent> child3 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 2039 scoped_refptr<LayerWithForcedDrawsContent> child3 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 2040 root->addChild(renderSurface1); | 2040 root->addChild(renderSurface1); |
| 2041 renderSurface1->addChild(child1); | 2041 renderSurface1->addChild(child1); |
| 2042 renderSurface1->addChild(child2); | 2042 renderSurface1->addChild(child2); |
| 2043 renderSurface1->addChild(child3); | 2043 renderSurface1->addChild(child3); |
| 2044 | 2044 |
| 2045 WebTransformationMatrix identityMatrix; | 2045 WebTransformationMatrix identityMatrix; |
| 2046 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, Flo
atPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2046 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, gfx
::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2047 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(3, 4), false); | 2047 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(3, 4), false); |
| 2048 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(5, 5), IntSize(50, 50), false); | 2048 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(5, 5), gfx::Size(50, 50), false); |
| 2049 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(75, 75), IntSize(50, 50), false); | 2049 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(75, 75), gfx::Size(50, 50), false); |
| 2050 setLayerPropertiesForTesting(child3.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(125, 125), IntSize(50, 50), false); | 2050 setLayerPropertiesForTesting(child3.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(125, 125), gfx::Size(50, 50), false); |
| 2051 | 2051 |
| 2052 renderSurface1->setForceRenderSurface(true); | 2052 renderSurface1->setForceRenderSurface(true); |
| 2053 executeCalculateDrawTransformsAndVisibility(root.get()); | 2053 executeCalculateDrawTransformsAndVisibility(root.get()); |
| 2054 | 2054 |
| 2055 ASSERT_TRUE(renderSurface1->renderSurface()); | 2055 ASSERT_TRUE(renderSurface1->renderSurface()); |
| 2056 | 2056 |
| 2057 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), root->renderSurface()->drawableConte
ntRect()); | 2057 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->renderSurface()->drawableCon
tentRect()); |
| 2058 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), root->drawableContentRect()); | 2058 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawableContentRect()); |
| 2059 | 2059 |
| 2060 // Layers that do not draw content should have empty visibleContentRects. | 2060 // Layers that do not draw content should have empty visibleContentRects. |
| 2061 EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), root->visibleContentRect()); | 2061 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visibleContentRect()); |
| 2062 EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), renderSurface1->visibleContentRect()); | 2062 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), renderSurface1->visibleContentRect()); |
| 2063 | 2063 |
| 2064 // An unclipped surface grows its drawableContentRect to include all drawabl
e regions of the subtree. | 2064 // An unclipped surface grows its drawableContentRect to include all drawabl
e regions of the subtree. |
| 2065 EXPECT_RECT_EQ(IntRect(5, 5, 170, 170), renderSurface1->renderSurface()->dra
wableContentRect()); | 2065 EXPECT_RECT_EQ(gfx::Rect(5, 5, 170, 170), renderSurface1->renderSurface()->d
rawableContentRect()); |
| 2066 | 2066 |
| 2067 // All layers that draw content into the unclipped surface are also unclippe
d. | 2067 // All layers that draw content into the unclipped surface are also unclippe
d. |
| 2068 EXPECT_RECT_EQ(IntRect(0, 0, 50, 50), child1->visibleContentRect()); | 2068 EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visibleContentRect()); |
| 2069 EXPECT_RECT_EQ(IntRect(0, 0, 50, 50), child2->visibleContentRect()); | 2069 EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child2->visibleContentRect()); |
| 2070 EXPECT_RECT_EQ(IntRect(0, 0, 50, 50), child3->visibleContentRect()); | 2070 EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child3->visibleContentRect()); |
| 2071 | 2071 |
| 2072 EXPECT_RECT_EQ(IntRect(5, 5, 50, 50), child1->drawableContentRect()); | 2072 EXPECT_RECT_EQ(gfx::Rect(5, 5, 50, 50), child1->drawableContentRect()); |
| 2073 EXPECT_RECT_EQ(IntRect(75, 75, 50, 50), child2->drawableContentRect()); | 2073 EXPECT_RECT_EQ(gfx::Rect(75, 75, 50, 50), child2->drawableContentRect()); |
| 2074 EXPECT_RECT_EQ(IntRect(125, 125, 50, 50), child3->drawableContentRect()); | 2074 EXPECT_RECT_EQ(gfx::Rect(125, 125, 50, 50), child3->drawableContentRect()); |
| 2075 } | 2075 } |
| 2076 | 2076 |
| 2077 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsForLayersInCli
ppedRenderSurface) | 2077 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsForLayersInCli
ppedRenderSurface) |
| 2078 { | 2078 { |
| 2079 scoped_refptr<Layer> root = Layer::create(); | 2079 scoped_refptr<Layer> root = Layer::create(); |
| 2080 scoped_refptr<Layer> renderSurface1 = Layer::create(); | 2080 scoped_refptr<Layer> renderSurface1 = Layer::create(); |
| 2081 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 2081 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 2082 scoped_refptr<LayerWithForcedDrawsContent> child2 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 2082 scoped_refptr<LayerWithForcedDrawsContent> child2 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 2083 scoped_refptr<LayerWithForcedDrawsContent> child3 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 2083 scoped_refptr<LayerWithForcedDrawsContent> child3 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 2084 root->addChild(renderSurface1); | 2084 root->addChild(renderSurface1); |
| 2085 renderSurface1->addChild(child1); | 2085 renderSurface1->addChild(child1); |
| 2086 renderSurface1->addChild(child2); | 2086 renderSurface1->addChild(child2); |
| 2087 renderSurface1->addChild(child3); | 2087 renderSurface1->addChild(child3); |
| 2088 | 2088 |
| 2089 WebTransformationMatrix identityMatrix; | 2089 WebTransformationMatrix identityMatrix; |
| 2090 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, Flo
atPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2090 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, gfx
::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2091 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(3, 4), false); | 2091 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(3, 4), false); |
| 2092 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(5, 5), IntSize(50, 50), false); | 2092 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(5, 5), gfx::Size(50, 50), false); |
| 2093 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(75, 75), IntSize(50, 50), false); | 2093 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(75, 75), gfx::Size(50, 50), false); |
| 2094 setLayerPropertiesForTesting(child3.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(125, 125), IntSize(50, 50), false); | 2094 setLayerPropertiesForTesting(child3.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(125, 125), gfx::Size(50, 50), false); |
| 2095 | 2095 |
| 2096 root->setMasksToBounds(true); | 2096 root->setMasksToBounds(true); |
| 2097 renderSurface1->setForceRenderSurface(true); | 2097 renderSurface1->setForceRenderSurface(true); |
| 2098 executeCalculateDrawTransformsAndVisibility(root.get()); | 2098 executeCalculateDrawTransformsAndVisibility(root.get()); |
| 2099 | 2099 |
| 2100 ASSERT_TRUE(renderSurface1->renderSurface()); | 2100 ASSERT_TRUE(renderSurface1->renderSurface()); |
| 2101 | 2101 |
| 2102 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), root->renderSurface()->drawableConte
ntRect()); | 2102 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->renderSurface()->drawableCon
tentRect()); |
| 2103 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), root->drawableContentRect()); | 2103 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawableContentRect()); |
| 2104 | 2104 |
| 2105 // Layers that do not draw content should have empty visibleContentRects. | 2105 // Layers that do not draw content should have empty visibleContentRects. |
| 2106 EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), root->visibleContentRect()); | 2106 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visibleContentRect()); |
| 2107 EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), renderSurface1->visibleContentRect()); | 2107 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), renderSurface1->visibleContentRect()); |
| 2108 | 2108 |
| 2109 // A clipped surface grows its drawableContentRect to include all drawable r
egions of the subtree, | 2109 // A clipped surface grows its drawableContentRect to include all drawable r
egions of the subtree, |
| 2110 // but also gets clamped by the ancestor's clip. | 2110 // but also gets clamped by the ancestor's clip. |
| 2111 EXPECT_RECT_EQ(IntRect(5, 5, 95, 95), renderSurface1->renderSurface()->drawa
bleContentRect()); | 2111 EXPECT_RECT_EQ(gfx::Rect(5, 5, 95, 95), renderSurface1->renderSurface()->dra
wableContentRect()); |
| 2112 | 2112 |
| 2113 // All layers that draw content into the surface have their visibleContentRe
ct clipped by the surface clipRect. | 2113 // All layers that draw content into the surface have their visibleContentRe
ct clipped by the surface clipRect. |
| 2114 EXPECT_RECT_EQ(IntRect(0, 0, 50, 50), child1->visibleContentRect()); | 2114 EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visibleContentRect()); |
| 2115 EXPECT_RECT_EQ(IntRect(0, 0, 25, 25), child2->visibleContentRect()); | 2115 EXPECT_RECT_EQ(gfx::Rect(0, 0, 25, 25), child2->visibleContentRect()); |
| 2116 EXPECT_TRUE(child3->visibleContentRect().isEmpty()); | 2116 EXPECT_TRUE(child3->visibleContentRect().IsEmpty()); |
| 2117 | 2117 |
| 2118 // But the drawableContentRects are unclipped. | 2118 // But the drawableContentRects are unclipped. |
| 2119 EXPECT_RECT_EQ(IntRect(5, 5, 50, 50), child1->drawableContentRect()); | 2119 EXPECT_RECT_EQ(gfx::Rect(5, 5, 50, 50), child1->drawableContentRect()); |
| 2120 EXPECT_RECT_EQ(IntRect(75, 75, 50, 50), child2->drawableContentRect()); | 2120 EXPECT_RECT_EQ(gfx::Rect(75, 75, 50, 50), child2->drawableContentRect()); |
| 2121 EXPECT_RECT_EQ(IntRect(125, 125, 50, 50), child3->drawableContentRect()); | 2121 EXPECT_RECT_EQ(gfx::Rect(125, 125, 50, 50), child3->drawableContentRect()); |
| 2122 } | 2122 } |
| 2123 | 2123 |
| 2124 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsForSurfaceHier
archy) | 2124 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsForSurfaceHier
archy) |
| 2125 { | 2125 { |
| 2126 // Check that clipping does not propagate down surfaces. | 2126 // Check that clipping does not propagate down surfaces. |
| 2127 scoped_refptr<Layer> root = Layer::create(); | 2127 scoped_refptr<Layer> root = Layer::create(); |
| 2128 scoped_refptr<Layer> renderSurface1 = Layer::create(); | 2128 scoped_refptr<Layer> renderSurface1 = Layer::create(); |
| 2129 scoped_refptr<Layer> renderSurface2 = Layer::create(); | 2129 scoped_refptr<Layer> renderSurface2 = Layer::create(); |
| 2130 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 2130 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 2131 scoped_refptr<LayerWithForcedDrawsContent> child2 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 2131 scoped_refptr<LayerWithForcedDrawsContent> child2 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 2132 scoped_refptr<LayerWithForcedDrawsContent> child3 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 2132 scoped_refptr<LayerWithForcedDrawsContent> child3 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 2133 root->addChild(renderSurface1); | 2133 root->addChild(renderSurface1); |
| 2134 renderSurface1->addChild(renderSurface2); | 2134 renderSurface1->addChild(renderSurface2); |
| 2135 renderSurface2->addChild(child1); | 2135 renderSurface2->addChild(child1); |
| 2136 renderSurface2->addChild(child2); | 2136 renderSurface2->addChild(child2); |
| 2137 renderSurface2->addChild(child3); | 2137 renderSurface2->addChild(child3); |
| 2138 | 2138 |
| 2139 WebTransformationMatrix identityMatrix; | 2139 WebTransformationMatrix identityMatrix; |
| 2140 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, Flo
atPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2140 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, gfx
::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2141 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(3, 4), false); | 2141 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(3, 4), false); |
| 2142 setLayerPropertiesForTesting(renderSurface2.get(), identityMatrix, identityM
atrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(7, 13), false); | 2142 setLayerPropertiesForTesting(renderSurface2.get(), identityMatrix, identityM
atrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(7, 13), false); |
| 2143 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(5, 5), IntSize(50, 50), false); | 2143 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(5, 5), gfx::Size(50, 50), false); |
| 2144 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(75, 75), IntSize(50, 50), false); | 2144 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(75, 75), gfx::Size(50, 50), false); |
| 2145 setLayerPropertiesForTesting(child3.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(125, 125), IntSize(50, 50), false); | 2145 setLayerPropertiesForTesting(child3.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(125, 125), gfx::Size(50, 50), false); |
| 2146 | 2146 |
| 2147 root->setMasksToBounds(true); | 2147 root->setMasksToBounds(true); |
| 2148 renderSurface1->setForceRenderSurface(true); | 2148 renderSurface1->setForceRenderSurface(true); |
| 2149 renderSurface2->setForceRenderSurface(true); | 2149 renderSurface2->setForceRenderSurface(true); |
| 2150 executeCalculateDrawTransformsAndVisibility(root.get()); | 2150 executeCalculateDrawTransformsAndVisibility(root.get()); |
| 2151 | 2151 |
| 2152 ASSERT_TRUE(renderSurface1->renderSurface()); | 2152 ASSERT_TRUE(renderSurface1->renderSurface()); |
| 2153 ASSERT_TRUE(renderSurface2->renderSurface()); | 2153 ASSERT_TRUE(renderSurface2->renderSurface()); |
| 2154 | 2154 |
| 2155 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), root->renderSurface()->drawableConte
ntRect()); | 2155 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->renderSurface()->drawableCon
tentRect()); |
| 2156 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), root->drawableContentRect()); | 2156 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawableContentRect()); |
| 2157 | 2157 |
| 2158 // Layers that do not draw content should have empty visibleContentRects. | 2158 // Layers that do not draw content should have empty visibleContentRects. |
| 2159 EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), root->visibleContentRect()); | 2159 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visibleContentRect()); |
| 2160 EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), renderSurface1->visibleContentRect()); | 2160 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), renderSurface1->visibleContentRect()); |
| 2161 EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), renderSurface2->visibleContentRect()); | 2161 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), renderSurface2->visibleContentRect()); |
| 2162 | 2162 |
| 2163 // A clipped surface grows its drawableContentRect to include all drawable r
egions of the subtree, | 2163 // A clipped surface grows its drawableContentRect to include all drawable r
egions of the subtree, |
| 2164 // but also gets clamped by the ancestor's clip. | 2164 // but also gets clamped by the ancestor's clip. |
| 2165 EXPECT_RECT_EQ(IntRect(5, 5, 95, 95), renderSurface1->renderSurface()->drawa
bleContentRect()); | 2165 EXPECT_RECT_EQ(gfx::Rect(5, 5, 95, 95), renderSurface1->renderSurface()->dra
wableContentRect()); |
| 2166 | 2166 |
| 2167 // renderSurface1 lives in the "unclipped universe" of renderSurface1, and i
s only | 2167 // renderSurface1 lives in the "unclipped universe" of renderSurface1, and i
s only |
| 2168 // implicitly clipped by renderSurface1's contentRect. So, renderSurface2 gr
ows to | 2168 // implicitly clipped by renderSurface1's contentRect. So, renderSurface2 gr
ows to |
| 2169 // enclose all drawable content of its subtree. | 2169 // enclose all drawable content of its subtree. |
| 2170 EXPECT_RECT_EQ(IntRect(5, 5, 170, 170), renderSurface2->renderSurface()->dra
wableContentRect()); | 2170 EXPECT_RECT_EQ(gfx::Rect(5, 5, 170, 170), renderSurface2->renderSurface()->d
rawableContentRect()); |
| 2171 | 2171 |
| 2172 // All layers that draw content into renderSurface2 think they are unclipped
. | 2172 // All layers that draw content into renderSurface2 think they are unclipped
. |
| 2173 EXPECT_RECT_EQ(IntRect(0, 0, 50, 50), child1->visibleContentRect()); | 2173 EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visibleContentRect()); |
| 2174 EXPECT_RECT_EQ(IntRect(0, 0, 50, 50), child2->visibleContentRect()); | 2174 EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child2->visibleContentRect()); |
| 2175 EXPECT_RECT_EQ(IntRect(0, 0, 50, 50), child3->visibleContentRect()); | 2175 EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child3->visibleContentRect()); |
| 2176 | 2176 |
| 2177 // drawableContentRects are also unclipped. | 2177 // drawableContentRects are also unclipped. |
| 2178 EXPECT_RECT_EQ(IntRect(5, 5, 50, 50), child1->drawableContentRect()); | 2178 EXPECT_RECT_EQ(gfx::Rect(5, 5, 50, 50), child1->drawableContentRect()); |
| 2179 EXPECT_RECT_EQ(IntRect(75, 75, 50, 50), child2->drawableContentRect()); | 2179 EXPECT_RECT_EQ(gfx::Rect(75, 75, 50, 50), child2->drawableContentRect()); |
| 2180 EXPECT_RECT_EQ(IntRect(125, 125, 50, 50), child3->drawableContentRect()); | 2180 EXPECT_RECT_EQ(gfx::Rect(125, 125, 50, 50), child3->drawableContentRect()); |
| 2181 } | 2181 } |
| 2182 | 2182 |
| 2183 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsWithTransformO
nUnclippedSurface) | 2183 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsWithTransformO
nUnclippedSurface) |
| 2184 { | 2184 { |
| 2185 // Layers that have non-axis aligned bounds (due to transforms) have an expa
nded, | 2185 // Layers that have non-axis aligned bounds (due to transforms) have an expa
nded, |
| 2186 // axis-aligned drawableContentRect and visibleContentRect. | 2186 // axis-aligned drawableContentRect and visibleContentRect. |
| 2187 | 2187 |
| 2188 scoped_refptr<Layer> root = Layer::create(); | 2188 scoped_refptr<Layer> root = Layer::create(); |
| 2189 scoped_refptr<Layer> renderSurface1 = Layer::create(); | 2189 scoped_refptr<Layer> renderSurface1 = Layer::create(); |
| 2190 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 2190 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 2191 root->addChild(renderSurface1); | 2191 root->addChild(renderSurface1); |
| 2192 renderSurface1->addChild(child1); | 2192 renderSurface1->addChild(child1); |
| 2193 | 2193 |
| 2194 WebTransformationMatrix identityMatrix; | 2194 WebTransformationMatrix identityMatrix; |
| 2195 WebTransformationMatrix childRotation; | 2195 WebTransformationMatrix childRotation; |
| 2196 childRotation.rotate(45); | 2196 childRotation.rotate(45); |
| 2197 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, Flo
atPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2197 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, gfx
::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2198 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(3, 4), false); | 2198 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(3, 4), false); |
| 2199 setLayerPropertiesForTesting(child1.get(), childRotation, identityMatrix, Fl
oatPoint(0.5, 0.5), FloatPoint(25, 25), IntSize(50, 50), false); | 2199 setLayerPropertiesForTesting(child1.get(), childRotation, identityMatrix, gf
x::PointF(0.5, 0.5), gfx::PointF(25, 25), gfx::Size(50, 50), false); |
| 2200 | 2200 |
| 2201 renderSurface1->setForceRenderSurface(true); | 2201 renderSurface1->setForceRenderSurface(true); |
| 2202 executeCalculateDrawTransformsAndVisibility(root.get()); | 2202 executeCalculateDrawTransformsAndVisibility(root.get()); |
| 2203 | 2203 |
| 2204 ASSERT_TRUE(renderSurface1->renderSurface()); | 2204 ASSERT_TRUE(renderSurface1->renderSurface()); |
| 2205 | 2205 |
| 2206 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), root->renderSurface()->drawableConte
ntRect()); | 2206 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->renderSurface()->drawableCon
tentRect()); |
| 2207 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), root->drawableContentRect()); | 2207 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), root->drawableContentRect()); |
| 2208 | 2208 |
| 2209 // Layers that do not draw content should have empty visibleContentRects. | 2209 // Layers that do not draw content should have empty visibleContentRects. |
| 2210 EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), root->visibleContentRect()); | 2210 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visibleContentRect()); |
| 2211 EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), renderSurface1->visibleContentRect()); | 2211 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), renderSurface1->visibleContentRect()); |
| 2212 | 2212 |
| 2213 // The unclipped surface grows its drawableContentRect to include all drawab
le regions of the subtree. | 2213 // The unclipped surface grows its drawableContentRect to include all drawab
le regions of the subtree. |
| 2214 int diagonalRadius = ceil(sqrt(2.0) * 25); | 2214 int diagonalRadius = ceil(sqrt(2.0) * 25); |
| 2215 IntRect expectedSurfaceDrawableContent = IntRect(50 - diagonalRadius, 50 - d
iagonalRadius, diagonalRadius * 2, diagonalRadius * 2); | 2215 gfx::Rect expectedSurfaceDrawableContent = gfx::Rect(50 - diagonalRadius, 50
- diagonalRadius, diagonalRadius * 2, diagonalRadius * 2); |
| 2216 EXPECT_RECT_EQ(expectedSurfaceDrawableContent, renderSurface1->renderSurface
()->drawableContentRect()); | 2216 EXPECT_RECT_EQ(expectedSurfaceDrawableContent, renderSurface1->renderSurface
()->drawableContentRect()); |
| 2217 | 2217 |
| 2218 // All layers that draw content into the unclipped surface are also unclippe
d. | 2218 // All layers that draw content into the unclipped surface are also unclippe
d. |
| 2219 EXPECT_RECT_EQ(IntRect(0, 0, 50, 50), child1->visibleContentRect()); | 2219 EXPECT_RECT_EQ(gfx::Rect(0, 0, 50, 50), child1->visibleContentRect()); |
| 2220 EXPECT_RECT_EQ(expectedSurfaceDrawableContent, child1->drawableContentRect()
); | 2220 EXPECT_RECT_EQ(expectedSurfaceDrawableContent, child1->drawableContentRect()
); |
| 2221 } | 2221 } |
| 2222 | 2222 |
| 2223 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsWithTransformO
nClippedSurface) | 2223 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsWithTransformO
nClippedSurface) |
| 2224 { | 2224 { |
| 2225 // Layers that have non-axis aligned bounds (due to transforms) have an expa
nded, | 2225 // Layers that have non-axis aligned bounds (due to transforms) have an expa
nded, |
| 2226 // axis-aligned drawableContentRect and visibleContentRect. | 2226 // axis-aligned drawableContentRect and visibleContentRect. |
| 2227 | 2227 |
| 2228 scoped_refptr<Layer> root = Layer::create(); | 2228 scoped_refptr<Layer> root = Layer::create(); |
| 2229 scoped_refptr<Layer> renderSurface1 = Layer::create(); | 2229 scoped_refptr<Layer> renderSurface1 = Layer::create(); |
| 2230 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 2230 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 2231 root->addChild(renderSurface1); | 2231 root->addChild(renderSurface1); |
| 2232 renderSurface1->addChild(child1); | 2232 renderSurface1->addChild(child1); |
| 2233 | 2233 |
| 2234 WebTransformationMatrix identityMatrix; | 2234 WebTransformationMatrix identityMatrix; |
| 2235 WebTransformationMatrix childRotation; | 2235 WebTransformationMatrix childRotation; |
| 2236 childRotation.rotate(45); | 2236 childRotation.rotate(45); |
| 2237 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, Flo
atPoint(0, 0), FloatPoint(0, 0), IntSize(50, 50), false); | 2237 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, gfx
::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(50, 50), false); |
| 2238 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(3, 4), false); | 2238 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(3, 4), false); |
| 2239 setLayerPropertiesForTesting(child1.get(), childRotation, identityMatrix, Fl
oatPoint(0.5, 0.5), FloatPoint(25, 25), IntSize(50, 50), false); | 2239 setLayerPropertiesForTesting(child1.get(), childRotation, identityMatrix, gf
x::PointF(0.5, 0.5), gfx::PointF(25, 25), gfx::Size(50, 50), false); |
| 2240 | 2240 |
| 2241 root->setMasksToBounds(true); | 2241 root->setMasksToBounds(true); |
| 2242 renderSurface1->setForceRenderSurface(true); | 2242 renderSurface1->setForceRenderSurface(true); |
| 2243 executeCalculateDrawTransformsAndVisibility(root.get()); | 2243 executeCalculateDrawTransformsAndVisibility(root.get()); |
| 2244 | 2244 |
| 2245 ASSERT_TRUE(renderSurface1->renderSurface()); | 2245 ASSERT_TRUE(renderSurface1->renderSurface()); |
| 2246 | 2246 |
| 2247 // The clipped surface clamps the drawableContentRect that encloses the rota
ted layer. | 2247 // The clipped surface clamps the drawableContentRect that encloses the rota
ted layer. |
| 2248 int diagonalRadius = ceil(sqrt(2.0) * 25); | 2248 int diagonalRadius = ceil(sqrt(2.0) * 25); |
| 2249 IntRect unclippedSurfaceContent = IntRect(50 - diagonalRadius, 50 - diagonal
Radius, diagonalRadius * 2, diagonalRadius * 2); | 2249 gfx::Rect unclippedSurfaceContent = gfx::Rect(50 - diagonalRadius, 50 - diag
onalRadius, diagonalRadius * 2, diagonalRadius * 2); |
| 2250 IntRect expectedSurfaceDrawableContent = intersection(unclippedSurfaceConten
t, IntRect(0, 0, 50, 50)); | 2250 gfx::Rect expectedSurfaceDrawableContent = gfx::IntersectRects(unclippedSurf
aceContent, gfx::Rect(0, 0, 50, 50)); |
| 2251 EXPECT_RECT_EQ(expectedSurfaceDrawableContent, renderSurface1->renderSurface
()->drawableContentRect()); | 2251 EXPECT_RECT_EQ(expectedSurfaceDrawableContent, renderSurface1->renderSurface
()->drawableContentRect()); |
| 2252 | 2252 |
| 2253 // On the clipped surface, only a quarter of the child1 is visible, but whe
n rotating | 2253 // On the clipped surface, only a quarter of the child1 is visible, but whe
n rotating |
| 2254 // it back to child1's content space, the actual enclosing rect ends up cov
ering the | 2254 // it back to child1's content space, the actual enclosing rect ends up cov
ering the |
| 2255 // full left half of child1. | 2255 // full left half of child1. |
| 2256 EXPECT_RECT_EQ(IntRect(0, 0, 26, 50), child1->visibleContentRect()); | 2256 EXPECT_RECT_EQ(gfx::Rect(0, 0, 26, 50), child1->visibleContentRect()); |
| 2257 | 2257 |
| 2258 // The child's drawableContentRect is unclipped. | 2258 // The child's drawableContentRect is unclipped. |
| 2259 EXPECT_RECT_EQ(unclippedSurfaceContent, child1->drawableContentRect()); | 2259 EXPECT_RECT_EQ(unclippedSurfaceContent, child1->drawableContentRect()); |
| 2260 } | 2260 } |
| 2261 | 2261 |
| 2262 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsInHighDPI) | 2262 TEST(LayerTreeHostCommonTest, verifyDrawableAndVisibleContentRectsInHighDPI) |
| 2263 { | 2263 { |
| 2264 MockContentLayerClient client; | 2264 MockContentLayerClient client; |
| 2265 | 2265 |
| 2266 scoped_refptr<Layer> root = Layer::create(); | 2266 scoped_refptr<Layer> root = Layer::create(); |
| 2267 scoped_refptr<ContentLayer> renderSurface1 = createDrawableContentLayer(&cli
ent); | 2267 scoped_refptr<ContentLayer> renderSurface1 = createDrawableContentLayer(&cli
ent); |
| 2268 scoped_refptr<ContentLayer> renderSurface2 = createDrawableContentLayer(&cli
ent); | 2268 scoped_refptr<ContentLayer> renderSurface2 = createDrawableContentLayer(&cli
ent); |
| 2269 scoped_refptr<ContentLayer> child1 = createDrawableContentLayer(&client); | 2269 scoped_refptr<ContentLayer> child1 = createDrawableContentLayer(&client); |
| 2270 scoped_refptr<ContentLayer> child2 = createDrawableContentLayer(&client); | 2270 scoped_refptr<ContentLayer> child2 = createDrawableContentLayer(&client); |
| 2271 scoped_refptr<ContentLayer> child3 = createDrawableContentLayer(&client); | 2271 scoped_refptr<ContentLayer> child3 = createDrawableContentLayer(&client); |
| 2272 root->addChild(renderSurface1); | 2272 root->addChild(renderSurface1); |
| 2273 renderSurface1->addChild(renderSurface2); | 2273 renderSurface1->addChild(renderSurface2); |
| 2274 renderSurface2->addChild(child1); | 2274 renderSurface2->addChild(child1); |
| 2275 renderSurface2->addChild(child2); | 2275 renderSurface2->addChild(child2); |
| 2276 renderSurface2->addChild(child3); | 2276 renderSurface2->addChild(child3); |
| 2277 | 2277 |
| 2278 WebTransformationMatrix identityMatrix; | 2278 WebTransformationMatrix identityMatrix; |
| 2279 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, Flo
atPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2279 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, gfx
::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2280 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, FloatPoint(0, 0), FloatPoint(5, 5), IntSize(3, 4), false); | 2280 setLayerPropertiesForTesting(renderSurface1.get(), identityMatrix, identityM
atrix, gfx::PointF(0, 0), gfx::PointF(5, 5), gfx::Size(3, 4), false); |
| 2281 setLayerPropertiesForTesting(renderSurface2.get(), identityMatrix, identityM
atrix, FloatPoint(0, 0), FloatPoint(5, 5), IntSize(7, 13), false); | 2281 setLayerPropertiesForTesting(renderSurface2.get(), identityMatrix, identityM
atrix, gfx::PointF(0, 0), gfx::PointF(5, 5), gfx::Size(7, 13), false); |
| 2282 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(5, 5), IntSize(50, 50), false); | 2282 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(5, 5), gfx::Size(50, 50), false); |
| 2283 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(75, 75), IntSize(50, 50), false); | 2283 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(75, 75), gfx::Size(50, 50), false); |
| 2284 setLayerPropertiesForTesting(child3.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(125, 125), IntSize(50, 50), false); | 2284 setLayerPropertiesForTesting(child3.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(125, 125), gfx::Size(50, 50), false); |
| 2285 | 2285 |
| 2286 const double deviceScaleFactor = 2; | 2286 const double deviceScaleFactor = 2; |
| 2287 root->setContentsScale(deviceScaleFactor); | 2287 root->setContentsScale(deviceScaleFactor); |
| 2288 renderSurface1->setContentsScale(deviceScaleFactor); | 2288 renderSurface1->setContentsScale(deviceScaleFactor); |
| 2289 renderSurface2->setContentsScale(deviceScaleFactor); | 2289 renderSurface2->setContentsScale(deviceScaleFactor); |
| 2290 child1->setContentsScale(deviceScaleFactor); | 2290 child1->setContentsScale(deviceScaleFactor); |
| 2291 child2->setContentsScale(deviceScaleFactor); | 2291 child2->setContentsScale(deviceScaleFactor); |
| 2292 child3->setContentsScale(deviceScaleFactor); | 2292 child3->setContentsScale(deviceScaleFactor); |
| 2293 | 2293 |
| 2294 root->setMasksToBounds(true); | 2294 root->setMasksToBounds(true); |
| 2295 renderSurface1->setForceRenderSurface(true); | 2295 renderSurface1->setForceRenderSurface(true); |
| 2296 renderSurface2->setForceRenderSurface(true); | 2296 renderSurface2->setForceRenderSurface(true); |
| 2297 executeCalculateDrawTransformsAndVisibility(root.get(), deviceScaleFactor); | 2297 executeCalculateDrawTransformsAndVisibility(root.get(), deviceScaleFactor); |
| 2298 | 2298 |
| 2299 ASSERT_TRUE(renderSurface1->renderSurface()); | 2299 ASSERT_TRUE(renderSurface1->renderSurface()); |
| 2300 ASSERT_TRUE(renderSurface2->renderSurface()); | 2300 ASSERT_TRUE(renderSurface2->renderSurface()); |
| 2301 | 2301 |
| 2302 // DrawableContentRects for all layers and surfaces are scaled by deviceScal
eFactor. | 2302 // DrawableContentRects for all layers and surfaces are scaled by deviceScal
eFactor. |
| 2303 EXPECT_RECT_EQ(IntRect(0, 0, 200, 200), root->renderSurface()->drawableConte
ntRect()); | 2303 EXPECT_RECT_EQ(gfx::Rect(0, 0, 200, 200), root->renderSurface()->drawableCon
tentRect()); |
| 2304 EXPECT_RECT_EQ(IntRect(0, 0, 200, 200), root->drawableContentRect()); | 2304 EXPECT_RECT_EQ(gfx::Rect(0, 0, 200, 200), root->drawableContentRect()); |
| 2305 EXPECT_RECT_EQ(IntRect(10, 10, 190, 190), renderSurface1->renderSurface()->d
rawableContentRect()); | 2305 EXPECT_RECT_EQ(gfx::Rect(10, 10, 190, 190), renderSurface1->renderSurface()-
>drawableContentRect()); |
| 2306 | 2306 |
| 2307 // renderSurface2 lives in the "unclipped universe" of renderSurface1, and | 2307 // renderSurface2 lives in the "unclipped universe" of renderSurface1, and |
| 2308 // is only implicitly clipped by renderSurface1. | 2308 // is only implicitly clipped by renderSurface1. |
| 2309 EXPECT_RECT_EQ(IntRect(10, 10, 350, 350), renderSurface2->renderSurface()->d
rawableContentRect()); | 2309 EXPECT_RECT_EQ(gfx::Rect(10, 10, 350, 350), renderSurface2->renderSurface()-
>drawableContentRect()); |
| 2310 | 2310 |
| 2311 EXPECT_RECT_EQ(IntRect(10, 10, 100, 100), child1->drawableContentRect()); | 2311 EXPECT_RECT_EQ(gfx::Rect(10, 10, 100, 100), child1->drawableContentRect()); |
| 2312 EXPECT_RECT_EQ(IntRect(150, 150, 100, 100), child2->drawableContentRect()); | 2312 EXPECT_RECT_EQ(gfx::Rect(150, 150, 100, 100), child2->drawableContentRect())
; |
| 2313 EXPECT_RECT_EQ(IntRect(250, 250, 100, 100), child3->drawableContentRect()); | 2313 EXPECT_RECT_EQ(gfx::Rect(250, 250, 100, 100), child3->drawableContentRect())
; |
| 2314 | 2314 |
| 2315 // The root layer does not actually draw content of its own. | 2315 // The root layer does not actually draw content of its own. |
| 2316 EXPECT_RECT_EQ(IntRect(0, 0, 0, 0), root->visibleContentRect()); | 2316 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), root->visibleContentRect()); |
| 2317 | 2317 |
| 2318 // All layer visibleContentRects are expressed in content space of each | 2318 // All layer visibleContentRects are expressed in content space of each |
| 2319 // layer, so they are also scaled by the deviceScaleFactor. | 2319 // layer, so they are also scaled by the deviceScaleFactor. |
| 2320 EXPECT_RECT_EQ(IntRect(0, 0, 6, 8), renderSurface1->visibleContentRect()); | 2320 EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 8), renderSurface1->visibleContentRect()); |
| 2321 EXPECT_RECT_EQ(IntRect(0, 0, 14, 26), renderSurface2->visibleContentRect()); | 2321 EXPECT_RECT_EQ(gfx::Rect(0, 0, 14, 26), renderSurface2->visibleContentRect()
); |
| 2322 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), child1->visibleContentRect()); | 2322 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), child1->visibleContentRect()); |
| 2323 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), child2->visibleContentRect()); | 2323 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), child2->visibleContentRect()); |
| 2324 EXPECT_RECT_EQ(IntRect(0, 0, 100, 100), child3->visibleContentRect()); | 2324 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), child3->visibleContentRect()); |
| 2325 } | 2325 } |
| 2326 | 2326 |
| 2327 TEST(LayerTreeHostCommonTest, verifyBackFaceCullingWithoutPreserves3d) | 2327 TEST(LayerTreeHostCommonTest, verifyBackFaceCullingWithoutPreserves3d) |
| 2328 { | 2328 { |
| 2329 // Verify the behavior of back-face culling when there are no preserve-3d la
yers. Note | 2329 // Verify the behavior of back-face culling when there are no preserve-3d la
yers. Note |
| 2330 // that 3d transforms still apply in this case, but they are "flattened" to
each | 2330 // that 3d transforms still apply in this case, but they are "flattened" to
each |
| 2331 // parent layer according to current W3C spec. | 2331 // parent layer according to current W3C spec. |
| 2332 | 2332 |
| 2333 const WebTransformationMatrix identityMatrix; | 2333 const WebTransformationMatrix identityMatrix; |
| 2334 scoped_refptr<Layer> parent = Layer::create(); | 2334 scoped_refptr<Layer> parent = Layer::create(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2364 backfaceMatrix.translate(50, 50); | 2364 backfaceMatrix.translate(50, 50); |
| 2365 backfaceMatrix.rotate3d(0, 1, 0, 180); | 2365 backfaceMatrix.rotate3d(0, 1, 0, 180); |
| 2366 backfaceMatrix.translate(-50, -50); | 2366 backfaceMatrix.translate(-50, -50); |
| 2367 | 2367 |
| 2368 // Having a descendant and opacity will force these to have render surfaces. | 2368 // Having a descendant and opacity will force these to have render surfaces. |
| 2369 frontFacingSurface->setOpacity(0.5); | 2369 frontFacingSurface->setOpacity(0.5); |
| 2370 backFacingSurface->setOpacity(0.5); | 2370 backFacingSurface->setOpacity(0.5); |
| 2371 | 2371 |
| 2372 // Nothing preserves 3d. According to current W3C CSS Transforms spec, these
layers | 2372 // Nothing preserves 3d. According to current W3C CSS Transforms spec, these
layers |
| 2373 // should blindly use their own local transforms to determine back-face cull
ing. | 2373 // should blindly use their own local transforms to determine back-face cull
ing. |
| 2374 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2374 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2375 setLayerPropertiesForTesting(frontFacingChild.get(), identityMatrix, identit
yMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2375 setLayerPropertiesForTesting(frontFacingChild.get(), identityMatrix, identit
yMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2376 setLayerPropertiesForTesting(backFacingChild.get(), backfaceMatrix, identity
Matrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2376 setLayerPropertiesForTesting(backFacingChild.get(), backfaceMatrix, identity
Matrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2377 setLayerPropertiesForTesting(frontFacingSurface.get(), identityMatrix, ident
ityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2377 setLayerPropertiesForTesting(frontFacingSurface.get(), identityMatrix, ident
ityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2378 setLayerPropertiesForTesting(backFacingSurface.get(), backfaceMatrix, identi
tyMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2378 setLayerPropertiesForTesting(backFacingSurface.get(), backfaceMatrix, identi
tyMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2379 setLayerPropertiesForTesting(frontFacingChildOfFrontFacingSurface.get(), ide
ntityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 10
0), false); | 2379 setLayerPropertiesForTesting(frontFacingChildOfFrontFacingSurface.get(), ide
ntityMatrix, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100
, 100), false); |
| 2380 setLayerPropertiesForTesting(backFacingChildOfFrontFacingSurface.get(), back
faceMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100
), false); | 2380 setLayerPropertiesForTesting(backFacingChildOfFrontFacingSurface.get(), back
faceMatrix, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100,
100), false); |
| 2381 setLayerPropertiesForTesting(frontFacingChildOfBackFacingSurface.get(), iden
tityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100
), false); | 2381 setLayerPropertiesForTesting(frontFacingChildOfBackFacingSurface.get(), iden
tityMatrix, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100,
100), false); |
| 2382 setLayerPropertiesForTesting(backFacingChildOfBackFacingSurface.get(), backf
aceMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100)
, false); | 2382 setLayerPropertiesForTesting(backFacingChildOfBackFacingSurface.get(), backf
aceMatrix, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100,
100), false); |
| 2383 | 2383 |
| 2384 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; | 2384 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 2385 int dummyMaxTextureSize = 512; | 2385 int dummyMaxTextureSize = 512; |
| 2386 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); | 2386 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); |
| 2387 | 2387 |
| 2388 // Verify which renderSurfaces were created. | 2388 // Verify which renderSurfaces were created. |
| 2389 EXPECT_FALSE(frontFacingChild->renderSurface()); | 2389 EXPECT_FALSE(frontFacingChild->renderSurface()); |
| 2390 EXPECT_FALSE(backFacingChild->renderSurface()); | 2390 EXPECT_FALSE(backFacingChild->renderSurface()); |
| 2391 EXPECT_TRUE(frontFacingSurface->renderSurface()); | 2391 EXPECT_TRUE(frontFacingSurface->renderSurface()); |
| 2392 EXPECT_TRUE(backFacingSurface->renderSurface()); | 2392 EXPECT_TRUE(backFacingSurface->renderSurface()); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2463 // preserve-3d transform style. Instead, an example of when a surface would
be | 2463 // preserve-3d transform style. Instead, an example of when a surface would
be |
| 2464 // created with preserve-3d is when there is a replica layer. | 2464 // created with preserve-3d is when there is a replica layer. |
| 2465 frontFacingSurface->setReplicaLayer(dummyReplicaLayer1.get()); | 2465 frontFacingSurface->setReplicaLayer(dummyReplicaLayer1.get()); |
| 2466 backFacingSurface->setReplicaLayer(dummyReplicaLayer2.get()); | 2466 backFacingSurface->setReplicaLayer(dummyReplicaLayer2.get()); |
| 2467 | 2467 |
| 2468 // Each surface creates its own new 3d rendering context (as defined by W3C
spec). | 2468 // Each surface creates its own new 3d rendering context (as defined by W3C
spec). |
| 2469 // According to current W3C CSS Transforms spec, layers in a 3d rendering co
ntext | 2469 // According to current W3C CSS Transforms spec, layers in a 3d rendering co
ntext |
| 2470 // should use the transform with respect to that context. This 3d rendering
context | 2470 // should use the transform with respect to that context. This 3d rendering
context |
| 2471 // occurs when (a) parent's transform style is flat and (b) the layer's tran
sform | 2471 // occurs when (a) parent's transform style is flat and (b) the layer's tran
sform |
| 2472 // style is preserve-3d. | 2472 // style is preserve-3d. |
| 2473 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); // parent transfor
m style is flat. | 2473 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); // parent tran
sform style is flat. |
| 2474 setLayerPropertiesForTesting(frontFacingChild.get(), identityMatrix, identit
yMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2474 setLayerPropertiesForTesting(frontFacingChild.get(), identityMatrix, identit
yMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2475 setLayerPropertiesForTesting(backFacingChild.get(), backfaceMatrix, identity
Matrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2475 setLayerPropertiesForTesting(backFacingChild.get(), backfaceMatrix, identity
Matrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2476 setLayerPropertiesForTesting(frontFacingSurface.get(), identityMatrix, ident
ityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), true); // surf
ace transform style is preserve-3d. | 2476 setLayerPropertiesForTesting(frontFacingSurface.get(), identityMatrix, ident
ityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), true); //
surface transform style is preserve-3d. |
| 2477 setLayerPropertiesForTesting(backFacingSurface.get(), backfaceMatrix, identi
tyMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), true); // surfa
ce transform style is preserve-3d. | 2477 setLayerPropertiesForTesting(backFacingSurface.get(), backfaceMatrix, identi
tyMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), true); // s
urface transform style is preserve-3d. |
| 2478 setLayerPropertiesForTesting(frontFacingChildOfFrontFacingSurface.get(), ide
ntityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 10
0), false); | 2478 setLayerPropertiesForTesting(frontFacingChildOfFrontFacingSurface.get(), ide
ntityMatrix, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100
, 100), false); |
| 2479 setLayerPropertiesForTesting(backFacingChildOfFrontFacingSurface.get(), back
faceMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100
), false); | 2479 setLayerPropertiesForTesting(backFacingChildOfFrontFacingSurface.get(), back
faceMatrix, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100,
100), false); |
| 2480 setLayerPropertiesForTesting(frontFacingChildOfBackFacingSurface.get(), iden
tityMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100
), false); | 2480 setLayerPropertiesForTesting(frontFacingChildOfBackFacingSurface.get(), iden
tityMatrix, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100,
100), false); |
| 2481 setLayerPropertiesForTesting(backFacingChildOfBackFacingSurface.get(), backf
aceMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100)
, false); | 2481 setLayerPropertiesForTesting(backFacingChildOfBackFacingSurface.get(), backf
aceMatrix, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100,
100), false); |
| 2482 | 2482 |
| 2483 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; | 2483 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 2484 int dummyMaxTextureSize = 512; | 2484 int dummyMaxTextureSize = 512; |
| 2485 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); | 2485 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); |
| 2486 | 2486 |
| 2487 // Verify which renderSurfaces were created. | 2487 // Verify which renderSurfaces were created. |
| 2488 EXPECT_FALSE(frontFacingChild->renderSurface()); | 2488 EXPECT_FALSE(frontFacingChild->renderSurface()); |
| 2489 EXPECT_FALSE(backFacingChild->renderSurface()); | 2489 EXPECT_FALSE(backFacingChild->renderSurface()); |
| 2490 EXPECT_TRUE(frontFacingSurface->renderSurface()); | 2490 EXPECT_TRUE(frontFacingSurface->renderSurface()); |
| 2491 EXPECT_FALSE(backFacingSurface->renderSurface()); | 2491 EXPECT_FALSE(backFacingSurface->renderSurface()); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2546 backfaceMatrix.translate(-50, -50); | 2546 backfaceMatrix.translate(-50, -50); |
| 2547 | 2547 |
| 2548 // Make our render surface. | 2548 // Make our render surface. |
| 2549 animatingSurface->setForceRenderSurface(true); | 2549 animatingSurface->setForceRenderSurface(true); |
| 2550 | 2550 |
| 2551 // Animate the transform on the render surface. | 2551 // Animate the transform on the render surface. |
| 2552 addAnimatedTransformToController(*animatingSurface->layerAnimationController
(), 10, 30, 0); | 2552 addAnimatedTransformToController(*animatingSurface->layerAnimationController
(), 10, 30, 0); |
| 2553 // This is just an animating layer, not a surface. | 2553 // This is just an animating layer, not a surface. |
| 2554 addAnimatedTransformToController(*animatingChild->layerAnimationController()
, 10, 30, 0); | 2554 addAnimatedTransformToController(*animatingChild->layerAnimationController()
, 10, 30, 0); |
| 2555 | 2555 |
| 2556 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2556 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2557 setLayerPropertiesForTesting(child.get(), backfaceMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2557 setLayerPropertiesForTesting(child.get(), backfaceMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2558 setLayerPropertiesForTesting(animatingSurface.get(), backfaceMatrix, identit
yMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2558 setLayerPropertiesForTesting(animatingSurface.get(), backfaceMatrix, identit
yMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2559 setLayerPropertiesForTesting(childOfAnimatingSurface.get(), backfaceMatrix,
identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2559 setLayerPropertiesForTesting(childOfAnimatingSurface.get(), backfaceMatrix,
identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false
); |
| 2560 setLayerPropertiesForTesting(animatingChild.get(), backfaceMatrix, identityM
atrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2560 setLayerPropertiesForTesting(animatingChild.get(), backfaceMatrix, identityM
atrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2561 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2561 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2562 | 2562 |
| 2563 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; | 2563 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 2564 int dummyMaxTextureSize = 512; | 2564 int dummyMaxTextureSize = 512; |
| 2565 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); | 2565 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); |
| 2566 | 2566 |
| 2567 EXPECT_FALSE(child->renderSurface()); | 2567 EXPECT_FALSE(child->renderSurface()); |
| 2568 EXPECT_TRUE(animatingSurface->renderSurface()); | 2568 EXPECT_TRUE(animatingSurface->renderSurface()); |
| 2569 EXPECT_FALSE(childOfAnimatingSurface->renderSurface()); | 2569 EXPECT_FALSE(childOfAnimatingSurface->renderSurface()); |
| 2570 EXPECT_FALSE(animatingChild->renderSurface()); | 2570 EXPECT_FALSE(animatingChild->renderSurface()); |
| 2571 EXPECT_FALSE(child2->renderSurface()); | 2571 EXPECT_FALSE(child2->renderSurface()); |
| 2572 | 2572 |
| 2573 // Verify that the animatingChild and childOfAnimatingSurface were not culle
d, but that child was. | 2573 // Verify that the animatingChild and childOfAnimatingSurface were not culle
d, but that child was. |
| 2574 ASSERT_EQ(2u, renderSurfaceLayerList.size()); | 2574 ASSERT_EQ(2u, renderSurfaceLayerList.size()); |
| 2575 EXPECT_EQ(parent->id(), renderSurfaceLayerList[0]->id()); | 2575 EXPECT_EQ(parent->id(), renderSurfaceLayerList[0]->id()); |
| 2576 EXPECT_EQ(animatingSurface->id(), renderSurfaceLayerList[1]->id()); | 2576 EXPECT_EQ(animatingSurface->id(), renderSurfaceLayerList[1]->id()); |
| 2577 | 2577 |
| 2578 // The non-animating child be culled from the layer list for the parent rend
er surface. | 2578 // The non-animating child be culled from the layer list for the parent rend
er surface. |
| 2579 ASSERT_EQ(3u, renderSurfaceLayerList[0]->renderSurface()->layerList().size()
); | 2579 ASSERT_EQ(3u, renderSurfaceLayerList[0]->renderSurface()->layerList().size()
); |
| 2580 EXPECT_EQ(animatingSurface->id(), renderSurfaceLayerList[0]->renderSurface()
->layerList()[0]->id()); | 2580 EXPECT_EQ(animatingSurface->id(), renderSurfaceLayerList[0]->renderSurface()
->layerList()[0]->id()); |
| 2581 EXPECT_EQ(animatingChild->id(), renderSurfaceLayerList[0]->renderSurface()->
layerList()[1]->id()); | 2581 EXPECT_EQ(animatingChild->id(), renderSurfaceLayerList[0]->renderSurface()->
layerList()[1]->id()); |
| 2582 EXPECT_EQ(child2->id(), renderSurfaceLayerList[0]->renderSurface()->layerLis
t()[2]->id()); | 2582 EXPECT_EQ(child2->id(), renderSurfaceLayerList[0]->renderSurface()->layerLis
t()[2]->id()); |
| 2583 | 2583 |
| 2584 ASSERT_EQ(2u, renderSurfaceLayerList[1]->renderSurface()->layerList().size()
); | 2584 ASSERT_EQ(2u, renderSurfaceLayerList[1]->renderSurface()->layerList().size()
); |
| 2585 EXPECT_EQ(animatingSurface->id(), renderSurfaceLayerList[1]->renderSurface()
->layerList()[0]->id()); | 2585 EXPECT_EQ(animatingSurface->id(), renderSurfaceLayerList[1]->renderSurface()
->layerList()[0]->id()); |
| 2586 EXPECT_EQ(childOfAnimatingSurface->id(), renderSurfaceLayerList[1]->renderSu
rface()->layerList()[1]->id()); | 2586 EXPECT_EQ(childOfAnimatingSurface->id(), renderSurfaceLayerList[1]->renderSu
rface()->layerList()[1]->id()); |
| 2587 | 2587 |
| 2588 EXPECT_FALSE(child2->visibleContentRect().isEmpty()); | 2588 EXPECT_FALSE(child2->visibleContentRect().IsEmpty()); |
| 2589 | 2589 |
| 2590 // The animating layers should have a visibleContentRect that represents the
area of the front face that is within the viewport. | 2590 // The animating layers should have a visibleContentRect that represents the
area of the front face that is within the viewport. |
| 2591 EXPECT_EQ(animatingChild->visibleContentRect(), IntRect(IntPoint(), animatin
gChild->contentBounds())); | 2591 EXPECT_EQ(animatingChild->visibleContentRect(), gfx::Rect(gfx::Point(), anim
atingChild->contentBounds())); |
| 2592 EXPECT_EQ(animatingSurface->visibleContentRect(), IntRect(IntPoint(), animat
ingSurface->contentBounds())); | 2592 EXPECT_EQ(animatingSurface->visibleContentRect(), gfx::Rect(gfx::Point(), an
imatingSurface->contentBounds())); |
| 2593 // And layers in the subtree of the animating layer should have valid visibl
eContentRects also. | 2593 // And layers in the subtree of the animating layer should have valid visibl
eContentRects also. |
| 2594 EXPECT_EQ(childOfAnimatingSurface->visibleContentRect(), IntRect(IntPoint(),
childOfAnimatingSurface->contentBounds())); | 2594 EXPECT_EQ(childOfAnimatingSurface->visibleContentRect(), gfx::Rect(gfx::Poin
t(), childOfAnimatingSurface->contentBounds())); |
| 2595 } | 2595 } |
| 2596 | 2596 |
| 2597 TEST(LayerTreeHostCommonTest, verifyBackFaceCullingWithPreserves3dForFlatteningS
urface) | 2597 TEST(LayerTreeHostCommonTest, verifyBackFaceCullingWithPreserves3dForFlatteningS
urface) |
| 2598 { | 2598 { |
| 2599 // Verify the behavior of back-face culling for a renderSurface that is crea
ted | 2599 // Verify the behavior of back-face culling for a renderSurface that is crea
ted |
| 2600 // when it flattens its subtree, and its parent has preserves-3d. | 2600 // when it flattens its subtree, and its parent has preserves-3d. |
| 2601 | 2601 |
| 2602 const WebTransformationMatrix identityMatrix; | 2602 const WebTransformationMatrix identityMatrix; |
| 2603 scoped_refptr<Layer> parent = Layer::create(); | 2603 scoped_refptr<Layer> parent = Layer::create(); |
| 2604 scoped_refptr<LayerWithForcedDrawsContent> frontFacingSurface = make_scoped_
refptr(new LayerWithForcedDrawsContent()); | 2604 scoped_refptr<LayerWithForcedDrawsContent> frontFacingSurface = make_scoped_
refptr(new LayerWithForcedDrawsContent()); |
| 2605 scoped_refptr<LayerWithForcedDrawsContent> backFacingSurface = make_scoped_r
efptr(new LayerWithForcedDrawsContent()); | 2605 scoped_refptr<LayerWithForcedDrawsContent> backFacingSurface = make_scoped_r
efptr(new LayerWithForcedDrawsContent()); |
| 2606 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 2606 scoped_refptr<LayerWithForcedDrawsContent> child1 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 2607 scoped_refptr<LayerWithForcedDrawsContent> child2 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); | 2607 scoped_refptr<LayerWithForcedDrawsContent> child2 = make_scoped_refptr(new L
ayerWithForcedDrawsContent()); |
| 2608 | 2608 |
| 2609 parent->addChild(frontFacingSurface); | 2609 parent->addChild(frontFacingSurface); |
| 2610 parent->addChild(backFacingSurface); | 2610 parent->addChild(backFacingSurface); |
| 2611 frontFacingSurface->addChild(child1); | 2611 frontFacingSurface->addChild(child1); |
| 2612 backFacingSurface->addChild(child2); | 2612 backFacingSurface->addChild(child2); |
| 2613 | 2613 |
| 2614 // RenderSurfaces are not double-sided | 2614 // RenderSurfaces are not double-sided |
| 2615 frontFacingSurface->setDoubleSided(false); | 2615 frontFacingSurface->setDoubleSided(false); |
| 2616 backFacingSurface->setDoubleSided(false); | 2616 backFacingSurface->setDoubleSided(false); |
| 2617 | 2617 |
| 2618 WebTransformationMatrix backfaceMatrix; | 2618 WebTransformationMatrix backfaceMatrix; |
| 2619 backfaceMatrix.translate(50, 50); | 2619 backfaceMatrix.translate(50, 50); |
| 2620 backfaceMatrix.rotate3d(0, 1, 0, 180); | 2620 backfaceMatrix.rotate3d(0, 1, 0, 180); |
| 2621 backfaceMatrix.translate(-50, -50); | 2621 backfaceMatrix.translate(-50, -50); |
| 2622 | 2622 |
| 2623 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), true); // parent transform
style is preserve3d. | 2623 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), true); // parent trans
form style is preserve3d. |
| 2624 setLayerPropertiesForTesting(frontFacingSurface.get(), identityMatrix, ident
ityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); // sur
face transform style is flat. | 2624 setLayerPropertiesForTesting(frontFacingSurface.get(), identityMatrix, ident
ityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); //
surface transform style is flat. |
| 2625 setLayerPropertiesForTesting(backFacingSurface.get(), backfaceMatrix, ident
ityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); // sur
face transform style is flat. | 2625 setLayerPropertiesForTesting(backFacingSurface.get(), backfaceMatrix, ident
ityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); //
surface transform style is flat. |
| 2626 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2626 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2627 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), false); | 2627 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2628 | 2628 |
| 2629 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; | 2629 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 2630 int dummyMaxTextureSize = 512; | 2630 int dummyMaxTextureSize = 512; |
| 2631 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); | 2631 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
1, 1, dummyMaxTextureSize, renderSurfaceLayerList); |
| 2632 | 2632 |
| 2633 // Verify which renderSurfaces were created. | 2633 // Verify which renderSurfaces were created. |
| 2634 EXPECT_TRUE(frontFacingSurface->renderSurface()); | 2634 EXPECT_TRUE(frontFacingSurface->renderSurface()); |
| 2635 EXPECT_FALSE(backFacingSurface->renderSurface()); // because it should be cu
lled | 2635 EXPECT_FALSE(backFacingSurface->renderSurface()); // because it should be cu
lled |
| 2636 EXPECT_FALSE(child1->renderSurface()); | 2636 EXPECT_FALSE(child1->renderSurface()); |
| 2637 EXPECT_FALSE(child2->renderSurface()); | 2637 EXPECT_FALSE(child2->renderSurface()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2651 EXPECT_EQ(child1->id(), renderSurfaceLayerList[1]->renderSurface()->layerLis
t()[1]->id()); | 2651 EXPECT_EQ(child1->id(), renderSurfaceLayerList[1]->renderSurface()->layerLis
t()[1]->id()); |
| 2652 } | 2652 } |
| 2653 | 2653 |
| 2654 TEST(LayerTreeHostCommonTest, verifyHitTestingForEmptyLayerList) | 2654 TEST(LayerTreeHostCommonTest, verifyHitTestingForEmptyLayerList) |
| 2655 { | 2655 { |
| 2656 // Hit testing on an empty renderSurfaceLayerList should return a null point
er. | 2656 // Hit testing on an empty renderSurfaceLayerList should return a null point
er. |
| 2657 DebugScopedSetImplThread thisScopeIsOnImplThread; | 2657 DebugScopedSetImplThread thisScopeIsOnImplThread; |
| 2658 | 2658 |
| 2659 std::vector<LayerImpl*> renderSurfaceLayerList; | 2659 std::vector<LayerImpl*> renderSurfaceLayerList; |
| 2660 | 2660 |
| 2661 IntPoint testPoint(0, 0); | 2661 gfx::Point testPoint(0, 0); |
| 2662 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); | 2662 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); |
| 2663 EXPECT_FALSE(resultLayer); | 2663 EXPECT_FALSE(resultLayer); |
| 2664 | 2664 |
| 2665 testPoint = IntPoint(10, 20); | 2665 testPoint = gfx::Point(10, 20); |
| 2666 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2666 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2667 EXPECT_FALSE(resultLayer); | 2667 EXPECT_FALSE(resultLayer); |
| 2668 } | 2668 } |
| 2669 | 2669 |
| 2670 TEST(LayerTreeHostCommonTest, verifyHitTestingForSingleLayer) | 2670 TEST(LayerTreeHostCommonTest, verifyHitTestingForSingleLayer) |
| 2671 { | 2671 { |
| 2672 DebugScopedSetImplThread thisScopeIsOnImplThread; | 2672 DebugScopedSetImplThread thisScopeIsOnImplThread; |
| 2673 | 2673 |
| 2674 scoped_ptr<LayerImpl> root = LayerImpl::create(12345); | 2674 scoped_ptr<LayerImpl> root = LayerImpl::create(12345); |
| 2675 | 2675 |
| 2676 WebTransformationMatrix identityMatrix; | 2676 WebTransformationMatrix identityMatrix; |
| 2677 FloatPoint anchor(0, 0); | 2677 gfx::PointF anchor(0, 0); |
| 2678 FloatPoint position(0, 0); | 2678 gfx::PointF position(0, 0); |
| 2679 IntSize bounds(100, 100); | 2679 gfx::Size bounds(100, 100); |
| 2680 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, position, bounds, false); | 2680 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, position, bounds, false); |
| 2681 root->setDrawsContent(true); | 2681 root->setDrawsContent(true); |
| 2682 | 2682 |
| 2683 std::vector<LayerImpl*> renderSurfaceLayerList; | 2683 std::vector<LayerImpl*> renderSurfaceLayerList; |
| 2684 int dummyMaxTextureSize = 512; | 2684 int dummyMaxTextureSize = 512; |
| 2685 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | 2685 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
| 2686 | 2686 |
| 2687 // Sanity check the scenario we just created. | 2687 // Sanity check the scenario we just created. |
| 2688 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | 2688 ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
| 2689 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); | 2689 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
| 2690 | 2690 |
| 2691 // Hit testing for a point outside the layer should return a null pointer. | 2691 // Hit testing for a point outside the layer should return a null pointer. |
| 2692 IntPoint testPoint(101, 101); | 2692 gfx::Point testPoint(101, 101); |
| 2693 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); | 2693 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); |
| 2694 EXPECT_FALSE(resultLayer); | 2694 EXPECT_FALSE(resultLayer); |
| 2695 | 2695 |
| 2696 testPoint = IntPoint(-1, -1); | 2696 testPoint = gfx::Point(-1, -1); |
| 2697 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2697 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2698 EXPECT_FALSE(resultLayer); | 2698 EXPECT_FALSE(resultLayer); |
| 2699 | 2699 |
| 2700 // Hit testing for a point inside should return the root layer. | 2700 // Hit testing for a point inside should return the root layer. |
| 2701 testPoint = IntPoint(1, 1); | 2701 testPoint = gfx::Point(1, 1); |
| 2702 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2702 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2703 ASSERT_TRUE(resultLayer); | 2703 ASSERT_TRUE(resultLayer); |
| 2704 EXPECT_EQ(12345, resultLayer->id()); | 2704 EXPECT_EQ(12345, resultLayer->id()); |
| 2705 | 2705 |
| 2706 testPoint = IntPoint(99, 99); | 2706 testPoint = gfx::Point(99, 99); |
| 2707 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2707 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2708 ASSERT_TRUE(resultLayer); | 2708 ASSERT_TRUE(resultLayer); |
| 2709 EXPECT_EQ(12345, resultLayer->id()); | 2709 EXPECT_EQ(12345, resultLayer->id()); |
| 2710 } | 2710 } |
| 2711 | 2711 |
| 2712 TEST(LayerTreeHostCommonTest, verifyHitTestingForUninvertibleTransform) | 2712 TEST(LayerTreeHostCommonTest, verifyHitTestingForUninvertibleTransform) |
| 2713 { | 2713 { |
| 2714 DebugScopedSetImplThread thisScopeIsOnImplThread; | 2714 DebugScopedSetImplThread thisScopeIsOnImplThread; |
| 2715 | 2715 |
| 2716 scoped_ptr<LayerImpl> root = LayerImpl::create(12345); | 2716 scoped_ptr<LayerImpl> root = LayerImpl::create(12345); |
| 2717 | 2717 |
| 2718 WebTransformationMatrix uninvertibleTransform; | 2718 WebTransformationMatrix uninvertibleTransform; |
| 2719 uninvertibleTransform.setM11(0); | 2719 uninvertibleTransform.setM11(0); |
| 2720 uninvertibleTransform.setM22(0); | 2720 uninvertibleTransform.setM22(0); |
| 2721 uninvertibleTransform.setM33(0); | 2721 uninvertibleTransform.setM33(0); |
| 2722 uninvertibleTransform.setM44(0); | 2722 uninvertibleTransform.setM44(0); |
| 2723 ASSERT_FALSE(uninvertibleTransform.isInvertible()); | 2723 ASSERT_FALSE(uninvertibleTransform.isInvertible()); |
| 2724 | 2724 |
| 2725 WebTransformationMatrix identityMatrix; | 2725 WebTransformationMatrix identityMatrix; |
| 2726 FloatPoint anchor(0, 0); | 2726 gfx::PointF anchor(0, 0); |
| 2727 FloatPoint position(0, 0); | 2727 gfx::PointF position(0, 0); |
| 2728 IntSize bounds(100, 100); | 2728 gfx::Size bounds(100, 100); |
| 2729 setLayerPropertiesForTesting(root.get(), uninvertibleTransform, identityMatr
ix, anchor, position, bounds, false); | 2729 setLayerPropertiesForTesting(root.get(), uninvertibleTransform, identityMatr
ix, anchor, position, bounds, false); |
| 2730 root->setDrawsContent(true); | 2730 root->setDrawsContent(true); |
| 2731 | 2731 |
| 2732 std::vector<LayerImpl*> renderSurfaceLayerList; | 2732 std::vector<LayerImpl*> renderSurfaceLayerList; |
| 2733 int dummyMaxTextureSize = 512; | 2733 int dummyMaxTextureSize = 512; |
| 2734 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | 2734 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
| 2735 | 2735 |
| 2736 // Sanity check the scenario we just created. | 2736 // Sanity check the scenario we just created. |
| 2737 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | 2737 ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
| 2738 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); | 2738 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
| 2739 ASSERT_FALSE(root->screenSpaceTransform().isInvertible()); | 2739 ASSERT_FALSE(root->screenSpaceTransform().isInvertible()); |
| 2740 | 2740 |
| 2741 // Hit testing any point should not hit the layer. If the invertible matrix
is | 2741 // Hit testing any point should not hit the layer. If the invertible matrix
is |
| 2742 // accidentally ignored and treated like an identity, then the hit testing w
ill | 2742 // accidentally ignored and treated like an identity, then the hit testing w
ill |
| 2743 // incorrectly hit the layer when it shouldn't. | 2743 // incorrectly hit the layer when it shouldn't. |
| 2744 IntPoint testPoint(1, 1); | 2744 gfx::Point testPoint(1, 1); |
| 2745 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); | 2745 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); |
| 2746 EXPECT_FALSE(resultLayer); | 2746 EXPECT_FALSE(resultLayer); |
| 2747 | 2747 |
| 2748 testPoint = IntPoint(10, 10); | 2748 testPoint = gfx::Point(10, 10); |
| 2749 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2749 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2750 EXPECT_FALSE(resultLayer); | 2750 EXPECT_FALSE(resultLayer); |
| 2751 | 2751 |
| 2752 testPoint = IntPoint(10, 30); | 2752 testPoint = gfx::Point(10, 30); |
| 2753 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2753 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2754 EXPECT_FALSE(resultLayer); | 2754 EXPECT_FALSE(resultLayer); |
| 2755 | 2755 |
| 2756 testPoint = IntPoint(50, 50); | 2756 testPoint = gfx::Point(50, 50); |
| 2757 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2757 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2758 EXPECT_FALSE(resultLayer); | 2758 EXPECT_FALSE(resultLayer); |
| 2759 | 2759 |
| 2760 testPoint = IntPoint(67, 48); | 2760 testPoint = gfx::Point(67, 48); |
| 2761 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2761 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2762 EXPECT_FALSE(resultLayer); | 2762 EXPECT_FALSE(resultLayer); |
| 2763 | 2763 |
| 2764 testPoint = IntPoint(99, 99); | 2764 testPoint = gfx::Point(99, 99); |
| 2765 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2765 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2766 EXPECT_FALSE(resultLayer); | 2766 EXPECT_FALSE(resultLayer); |
| 2767 | 2767 |
| 2768 testPoint = IntPoint(-1, -1); | 2768 testPoint = gfx::Point(-1, -1); |
| 2769 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2769 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2770 EXPECT_FALSE(resultLayer); | 2770 EXPECT_FALSE(resultLayer); |
| 2771 } | 2771 } |
| 2772 | 2772 |
| 2773 TEST(LayerTreeHostCommonTest, verifyHitTestingForSinglePositionedLayer) | 2773 TEST(LayerTreeHostCommonTest, verifyHitTestingForSinglePositionedLayer) |
| 2774 { | 2774 { |
| 2775 DebugScopedSetImplThread thisScopeIsOnImplThread; | 2775 DebugScopedSetImplThread thisScopeIsOnImplThread; |
| 2776 | 2776 |
| 2777 scoped_ptr<LayerImpl> root = LayerImpl::create(12345); | 2777 scoped_ptr<LayerImpl> root = LayerImpl::create(12345); |
| 2778 | 2778 |
| 2779 WebTransformationMatrix identityMatrix; | 2779 WebTransformationMatrix identityMatrix; |
| 2780 FloatPoint anchor(0, 0); | 2780 gfx::PointF anchor(0, 0); |
| 2781 FloatPoint position(50, 50); // this layer is positioned, and hit testing sh
ould correctly know where the layer is located. | 2781 gfx::PointF position(50, 50); // this layer is positioned, and hit testing s
hould correctly know where the layer is located. |
| 2782 IntSize bounds(100, 100); | 2782 gfx::Size bounds(100, 100); |
| 2783 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, position, bounds, false); | 2783 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, position, bounds, false); |
| 2784 root->setDrawsContent(true); | 2784 root->setDrawsContent(true); |
| 2785 | 2785 |
| 2786 std::vector<LayerImpl*> renderSurfaceLayerList; | 2786 std::vector<LayerImpl*> renderSurfaceLayerList; |
| 2787 int dummyMaxTextureSize = 512; | 2787 int dummyMaxTextureSize = 512; |
| 2788 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | 2788 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
| 2789 | 2789 |
| 2790 // Sanity check the scenario we just created. | 2790 // Sanity check the scenario we just created. |
| 2791 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | 2791 ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
| 2792 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); | 2792 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
| 2793 | 2793 |
| 2794 // Hit testing for a point outside the layer should return a null pointer. | 2794 // Hit testing for a point outside the layer should return a null pointer. |
| 2795 IntPoint testPoint(49, 49); | 2795 gfx::Point testPoint(49, 49); |
| 2796 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); | 2796 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); |
| 2797 EXPECT_FALSE(resultLayer); | 2797 EXPECT_FALSE(resultLayer); |
| 2798 | 2798 |
| 2799 // Even though the layer exists at (101, 101), it should not be visible ther
e since the root renderSurface would clamp it. | 2799 // Even though the layer exists at (101, 101), it should not be visible ther
e since the root renderSurface would clamp it. |
| 2800 testPoint = IntPoint(101, 101); | 2800 testPoint = gfx::Point(101, 101); |
| 2801 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2801 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2802 EXPECT_FALSE(resultLayer); | 2802 EXPECT_FALSE(resultLayer); |
| 2803 | 2803 |
| 2804 // Hit testing for a point inside should return the root layer. | 2804 // Hit testing for a point inside should return the root layer. |
| 2805 testPoint = IntPoint(51, 51); | 2805 testPoint = gfx::Point(51, 51); |
| 2806 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2806 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2807 ASSERT_TRUE(resultLayer); | 2807 ASSERT_TRUE(resultLayer); |
| 2808 EXPECT_EQ(12345, resultLayer->id()); | 2808 EXPECT_EQ(12345, resultLayer->id()); |
| 2809 | 2809 |
| 2810 testPoint = IntPoint(99, 99); | 2810 testPoint = gfx::Point(99, 99); |
| 2811 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2811 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2812 ASSERT_TRUE(resultLayer); | 2812 ASSERT_TRUE(resultLayer); |
| 2813 EXPECT_EQ(12345, resultLayer->id()); | 2813 EXPECT_EQ(12345, resultLayer->id()); |
| 2814 } | 2814 } |
| 2815 | 2815 |
| 2816 TEST(LayerTreeHostCommonTest, verifyHitTestingForSingleRotatedLayer) | 2816 TEST(LayerTreeHostCommonTest, verifyHitTestingForSingleRotatedLayer) |
| 2817 { | 2817 { |
| 2818 DebugScopedSetImplThread thisScopeIsOnImplThread; | 2818 DebugScopedSetImplThread thisScopeIsOnImplThread; |
| 2819 | 2819 |
| 2820 scoped_ptr<LayerImpl> root = LayerImpl::create(12345); | 2820 scoped_ptr<LayerImpl> root = LayerImpl::create(12345); |
| 2821 | 2821 |
| 2822 WebTransformationMatrix identityMatrix; | 2822 WebTransformationMatrix identityMatrix; |
| 2823 WebTransformationMatrix rotation45DegreesAboutCenter; | 2823 WebTransformationMatrix rotation45DegreesAboutCenter; |
| 2824 rotation45DegreesAboutCenter.translate(50, 50); | 2824 rotation45DegreesAboutCenter.translate(50, 50); |
| 2825 rotation45DegreesAboutCenter.rotate3d(0, 0, 45); | 2825 rotation45DegreesAboutCenter.rotate3d(0, 0, 45); |
| 2826 rotation45DegreesAboutCenter.translate(-50, -50); | 2826 rotation45DegreesAboutCenter.translate(-50, -50); |
| 2827 FloatPoint anchor(0, 0); | 2827 gfx::PointF anchor(0, 0); |
| 2828 FloatPoint position(0, 0); | 2828 gfx::PointF position(0, 0); |
| 2829 IntSize bounds(100, 100); | 2829 gfx::Size bounds(100, 100); |
| 2830 setLayerPropertiesForTesting(root.get(), rotation45DegreesAboutCenter, ident
ityMatrix, anchor, position, bounds, false); | 2830 setLayerPropertiesForTesting(root.get(), rotation45DegreesAboutCenter, ident
ityMatrix, anchor, position, bounds, false); |
| 2831 root->setDrawsContent(true); | 2831 root->setDrawsContent(true); |
| 2832 | 2832 |
| 2833 std::vector<LayerImpl*> renderSurfaceLayerList; | 2833 std::vector<LayerImpl*> renderSurfaceLayerList; |
| 2834 int dummyMaxTextureSize = 512; | 2834 int dummyMaxTextureSize = 512; |
| 2835 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | 2835 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
| 2836 | 2836 |
| 2837 // Sanity check the scenario we just created. | 2837 // Sanity check the scenario we just created. |
| 2838 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | 2838 ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
| 2839 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); | 2839 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
| 2840 | 2840 |
| 2841 // Hit testing for points outside the layer. | 2841 // Hit testing for points outside the layer. |
| 2842 // These corners would have been inside the un-transformed layer, but they s
hould not hit the correctly transformed layer. | 2842 // These corners would have been inside the un-transformed layer, but they s
hould not hit the correctly transformed layer. |
| 2843 IntPoint testPoint(99, 99); | 2843 gfx::Point testPoint(99, 99); |
| 2844 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); | 2844 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); |
| 2845 EXPECT_FALSE(resultLayer); | 2845 EXPECT_FALSE(resultLayer); |
| 2846 | 2846 |
| 2847 testPoint = IntPoint(1, 1); | 2847 testPoint = gfx::Point(1, 1); |
| 2848 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2848 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2849 EXPECT_FALSE(resultLayer); | 2849 EXPECT_FALSE(resultLayer); |
| 2850 | 2850 |
| 2851 // Hit testing for a point inside should return the root layer. | 2851 // Hit testing for a point inside should return the root layer. |
| 2852 testPoint = IntPoint(1, 50); | 2852 testPoint = gfx::Point(1, 50); |
| 2853 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2853 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2854 ASSERT_TRUE(resultLayer); | 2854 ASSERT_TRUE(resultLayer); |
| 2855 EXPECT_EQ(12345, resultLayer->id()); | 2855 EXPECT_EQ(12345, resultLayer->id()); |
| 2856 | 2856 |
| 2857 // Hit testing the corners that would overlap the unclipped layer, but are o
utside the clipped region. | 2857 // Hit testing the corners that would overlap the unclipped layer, but are o
utside the clipped region. |
| 2858 testPoint = IntPoint(50, -1); | 2858 testPoint = gfx::Point(50, -1); |
| 2859 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2859 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2860 ASSERT_FALSE(resultLayer); | 2860 ASSERT_FALSE(resultLayer); |
| 2861 | 2861 |
| 2862 testPoint = IntPoint(-1, 50); | 2862 testPoint = gfx::Point(-1, 50); |
| 2863 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2863 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2864 ASSERT_FALSE(resultLayer); | 2864 ASSERT_FALSE(resultLayer); |
| 2865 } | 2865 } |
| 2866 | 2866 |
| 2867 TEST(LayerTreeHostCommonTest, verifyHitTestingForSinglePerspectiveLayer) | 2867 TEST(LayerTreeHostCommonTest, verifyHitTestingForSinglePerspectiveLayer) |
| 2868 { | 2868 { |
| 2869 DebugScopedSetImplThread thisScopeIsOnImplThread; | 2869 DebugScopedSetImplThread thisScopeIsOnImplThread; |
| 2870 | 2870 |
| 2871 scoped_ptr<LayerImpl> root = LayerImpl::create(12345); | 2871 scoped_ptr<LayerImpl> root = LayerImpl::create(12345); |
| 2872 | 2872 |
| 2873 WebTransformationMatrix identityMatrix; | 2873 WebTransformationMatrix identityMatrix; |
| 2874 | 2874 |
| 2875 // perspectiveProjectionAboutCenter * translationByZ is designed so that the
100 x 100 layer becomes 50 x 50, and remains centered at (50, 50). | 2875 // perspectiveProjectionAboutCenter * translationByZ is designed so that the
100 x 100 layer becomes 50 x 50, and remains centered at (50, 50). |
| 2876 WebTransformationMatrix perspectiveProjectionAboutCenter; | 2876 WebTransformationMatrix perspectiveProjectionAboutCenter; |
| 2877 perspectiveProjectionAboutCenter.translate(50, 50); | 2877 perspectiveProjectionAboutCenter.translate(50, 50); |
| 2878 perspectiveProjectionAboutCenter.applyPerspective(1); | 2878 perspectiveProjectionAboutCenter.applyPerspective(1); |
| 2879 perspectiveProjectionAboutCenter.translate(-50, -50); | 2879 perspectiveProjectionAboutCenter.translate(-50, -50); |
| 2880 WebTransformationMatrix translationByZ; | 2880 WebTransformationMatrix translationByZ; |
| 2881 translationByZ.translate3d(0, 0, -1); | 2881 translationByZ.translate3d(0, 0, -1); |
| 2882 | 2882 |
| 2883 FloatPoint anchor(0, 0); | 2883 gfx::PointF anchor(0, 0); |
| 2884 FloatPoint position(0, 0); | 2884 gfx::PointF position(0, 0); |
| 2885 IntSize bounds(100, 100); | 2885 gfx::Size bounds(100, 100); |
| 2886 setLayerPropertiesForTesting(root.get(), perspectiveProjectionAboutCenter *
translationByZ, identityMatrix, anchor, position, bounds, false); | 2886 setLayerPropertiesForTesting(root.get(), perspectiveProjectionAboutCenter *
translationByZ, identityMatrix, anchor, position, bounds, false); |
| 2887 root->setDrawsContent(true); | 2887 root->setDrawsContent(true); |
| 2888 | 2888 |
| 2889 std::vector<LayerImpl*> renderSurfaceLayerList; | 2889 std::vector<LayerImpl*> renderSurfaceLayerList; |
| 2890 int dummyMaxTextureSize = 512; | 2890 int dummyMaxTextureSize = 512; |
| 2891 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | 2891 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
| 2892 | 2892 |
| 2893 // Sanity check the scenario we just created. | 2893 // Sanity check the scenario we just created. |
| 2894 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | 2894 ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
| 2895 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); | 2895 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
| 2896 | 2896 |
| 2897 // Hit testing for points outside the layer. | 2897 // Hit testing for points outside the layer. |
| 2898 // These corners would have been inside the un-transformed layer, but they s
hould not hit the correctly transformed layer. | 2898 // These corners would have been inside the un-transformed layer, but they s
hould not hit the correctly transformed layer. |
| 2899 IntPoint testPoint(24, 24); | 2899 gfx::Point testPoint(24, 24); |
| 2900 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); | 2900 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); |
| 2901 EXPECT_FALSE(resultLayer); | 2901 EXPECT_FALSE(resultLayer); |
| 2902 | 2902 |
| 2903 testPoint = IntPoint(76, 76); | 2903 testPoint = gfx::Point(76, 76); |
| 2904 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2904 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2905 EXPECT_FALSE(resultLayer); | 2905 EXPECT_FALSE(resultLayer); |
| 2906 | 2906 |
| 2907 // Hit testing for a point inside should return the root layer. | 2907 // Hit testing for a point inside should return the root layer. |
| 2908 testPoint = IntPoint(26, 26); | 2908 testPoint = gfx::Point(26, 26); |
| 2909 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2909 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2910 ASSERT_TRUE(resultLayer); | 2910 ASSERT_TRUE(resultLayer); |
| 2911 EXPECT_EQ(12345, resultLayer->id()); | 2911 EXPECT_EQ(12345, resultLayer->id()); |
| 2912 | 2912 |
| 2913 testPoint = IntPoint(74, 74); | 2913 testPoint = gfx::Point(74, 74); |
| 2914 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2914 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2915 ASSERT_TRUE(resultLayer); | 2915 ASSERT_TRUE(resultLayer); |
| 2916 EXPECT_EQ(12345, resultLayer->id()); | 2916 EXPECT_EQ(12345, resultLayer->id()); |
| 2917 } | 2917 } |
| 2918 | 2918 |
| 2919 TEST(LayerTreeHostCommonTest, verifyHitTestingForSingleLayerWithScaledContents) | 2919 TEST(LayerTreeHostCommonTest, verifyHitTestingForSingleLayerWithScaledContents) |
| 2920 { | 2920 { |
| 2921 // A layer's visibleContentRect is actually in the layer's content space. Th
e | 2921 // A layer's visibleContentRect is actually in the layer's content space. Th
e |
| 2922 // screenSpaceTransform converts from the layer's origin space to screen spa
ce. This | 2922 // screenSpaceTransform converts from the layer's origin space to screen spa
ce. This |
| 2923 // test makes sure that hit testing works correctly accounts for the content
s scale. | 2923 // test makes sure that hit testing works correctly accounts for the content
s scale. |
| 2924 // A contentsScale that is not 1 effectively forces a non-identity transform
between | 2924 // A contentsScale that is not 1 effectively forces a non-identity transform
between |
| 2925 // layer's content space and layer's origin space. The hit testing code must
take this into account. | 2925 // layer's content space and layer's origin space. The hit testing code must
take this into account. |
| 2926 // | 2926 // |
| 2927 // To test this, the layer is positioned at (25, 25), and is size (50, 50).
If | 2927 // To test this, the layer is positioned at (25, 25), and is size (50, 50).
If |
| 2928 // contentsScale is ignored, then hit testing will mis-interpret the visible
ContentRect | 2928 // contentsScale is ignored, then hit testing will mis-interpret the visible
ContentRect |
| 2929 // as being larger than the actual bounds of the layer. | 2929 // as being larger than the actual bounds of the layer. |
| 2930 // | 2930 // |
| 2931 DebugScopedSetImplThread thisScopeIsOnImplThread; | 2931 DebugScopedSetImplThread thisScopeIsOnImplThread; |
| 2932 | 2932 |
| 2933 scoped_ptr<LayerImpl> root = LayerImpl::create(1); | 2933 scoped_ptr<LayerImpl> root = LayerImpl::create(1); |
| 2934 | 2934 |
| 2935 WebTransformationMatrix identityMatrix; | 2935 WebTransformationMatrix identityMatrix; |
| 2936 FloatPoint anchor(0, 0); | 2936 gfx::PointF anchor(0, 0); |
| 2937 | 2937 |
| 2938 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, FloatPoint(0, 0), IntSize(100, 100), false); | 2938 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 2939 | 2939 |
| 2940 { | 2940 { |
| 2941 FloatPoint position(25, 25); | 2941 gfx::PointF position(25, 25); |
| 2942 IntSize bounds(50, 50); | 2942 gfx::Size bounds(50, 50); |
| 2943 scoped_ptr<LayerImpl> testLayer = LayerImpl::create(12345); | 2943 scoped_ptr<LayerImpl> testLayer = LayerImpl::create(12345); |
| 2944 setLayerPropertiesForTesting(testLayer.get(), identityMatrix, identityMa
trix, anchor, position, bounds, false); | 2944 setLayerPropertiesForTesting(testLayer.get(), identityMatrix, identityMa
trix, anchor, position, bounds, false); |
| 2945 | 2945 |
| 2946 // override contentBounds | 2946 // override contentBounds |
| 2947 testLayer->setContentBounds(IntSize(100, 100)); | 2947 testLayer->setContentBounds(gfx::Size(100, 100)); |
| 2948 | 2948 |
| 2949 testLayer->setDrawsContent(true); | 2949 testLayer->setDrawsContent(true); |
| 2950 root->addChild(testLayer.Pass()); | 2950 root->addChild(testLayer.Pass()); |
| 2951 } | 2951 } |
| 2952 | 2952 |
| 2953 std::vector<LayerImpl*> renderSurfaceLayerList; | 2953 std::vector<LayerImpl*> renderSurfaceLayerList; |
| 2954 int dummyMaxTextureSize = 512; | 2954 int dummyMaxTextureSize = 512; |
| 2955 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | 2955 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
| 2956 | 2956 |
| 2957 // Sanity check the scenario we just created. | 2957 // Sanity check the scenario we just created. |
| 2958 // The visibleContentRect for testLayer is actually 100x100, even though its
layout size is 50x50, positioned at 25x25. | 2958 // The visibleContentRect for testLayer is actually 100x100, even though its
layout size is 50x50, positioned at 25x25. |
| 2959 LayerImpl* testLayer = root->children()[0]; | 2959 LayerImpl* testLayer = root->children()[0]; |
| 2960 EXPECT_RECT_EQ(IntRect(IntPoint::zero(), IntSize(100, 100)), testLayer->visi
bleContentRect()); | 2960 EXPECT_RECT_EQ(gfx::Rect(gfx::Point(), gfx::Size(100, 100)), testLayer->visi
bleContentRect()); |
| 2961 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | 2961 ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
| 2962 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); | 2962 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
| 2963 | 2963 |
| 2964 // Hit testing for a point outside the layer should return a null pointer (t
he root layer does not draw content, so it will not be hit tested either). | 2964 // Hit testing for a point outside the layer should return a null pointer (t
he root layer does not draw content, so it will not be hit tested either). |
| 2965 IntPoint testPoint(101, 101); | 2965 gfx::Point testPoint(101, 101); |
| 2966 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); | 2966 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); |
| 2967 EXPECT_FALSE(resultLayer); | 2967 EXPECT_FALSE(resultLayer); |
| 2968 | 2968 |
| 2969 testPoint = IntPoint(24, 24); | 2969 testPoint = gfx::Point(24, 24); |
| 2970 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2970 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2971 EXPECT_FALSE(resultLayer); | 2971 EXPECT_FALSE(resultLayer); |
| 2972 | 2972 |
| 2973 testPoint = IntPoint(76, 76); | 2973 testPoint = gfx::Point(76, 76); |
| 2974 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2974 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2975 EXPECT_FALSE(resultLayer); | 2975 EXPECT_FALSE(resultLayer); |
| 2976 | 2976 |
| 2977 // Hit testing for a point inside should return the test layer. | 2977 // Hit testing for a point inside should return the test layer. |
| 2978 testPoint = IntPoint(26, 26); | 2978 testPoint = gfx::Point(26, 26); |
| 2979 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2979 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2980 ASSERT_TRUE(resultLayer); | 2980 ASSERT_TRUE(resultLayer); |
| 2981 EXPECT_EQ(12345, resultLayer->id()); | 2981 EXPECT_EQ(12345, resultLayer->id()); |
| 2982 | 2982 |
| 2983 testPoint = IntPoint(74, 74); | 2983 testPoint = gfx::Point(74, 74); |
| 2984 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 2984 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 2985 ASSERT_TRUE(resultLayer); | 2985 ASSERT_TRUE(resultLayer); |
| 2986 EXPECT_EQ(12345, resultLayer->id()); | 2986 EXPECT_EQ(12345, resultLayer->id()); |
| 2987 } | 2987 } |
| 2988 | 2988 |
| 2989 TEST(LayerTreeHostCommonTest, verifyHitTestingForSimpleClippedLayer) | 2989 TEST(LayerTreeHostCommonTest, verifyHitTestingForSimpleClippedLayer) |
| 2990 { | 2990 { |
| 2991 // Test that hit-testing will only work for the visible portion of a layer,
and not | 2991 // Test that hit-testing will only work for the visible portion of a layer,
and not |
| 2992 // the entire layer bounds. Here we just test the simple axis-aligned case. | 2992 // the entire layer bounds. Here we just test the simple axis-aligned case. |
| 2993 DebugScopedSetImplThread thisScopeIsOnImplThread; | 2993 DebugScopedSetImplThread thisScopeIsOnImplThread; |
| 2994 | 2994 |
| 2995 WebTransformationMatrix identityMatrix; | 2995 WebTransformationMatrix identityMatrix; |
| 2996 FloatPoint anchor(0, 0); | 2996 gfx::PointF anchor(0, 0); |
| 2997 | 2997 |
| 2998 scoped_ptr<LayerImpl> root = LayerImpl::create(1); | 2998 scoped_ptr<LayerImpl> root = LayerImpl::create(1); |
| 2999 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, FloatPoint(0, 0), IntSize(100, 100), false); | 2999 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 3000 | 3000 |
| 3001 { | 3001 { |
| 3002 scoped_ptr<LayerImpl> clippingLayer = LayerImpl::create(123); | 3002 scoped_ptr<LayerImpl> clippingLayer = LayerImpl::create(123); |
| 3003 FloatPoint position(25, 25); // this layer is positioned, and hit testin
g should correctly know where the layer is located. | 3003 gfx::PointF position(25, 25); // this layer is positioned, and hit testi
ng should correctly know where the layer is located. |
| 3004 IntSize bounds(50, 50); | 3004 gfx::Size bounds(50, 50); |
| 3005 setLayerPropertiesForTesting(clippingLayer.get(), identityMatrix, identi
tyMatrix, anchor, position, bounds, false); | 3005 setLayerPropertiesForTesting(clippingLayer.get(), identityMatrix, identi
tyMatrix, anchor, position, bounds, false); |
| 3006 clippingLayer->setMasksToBounds(true); | 3006 clippingLayer->setMasksToBounds(true); |
| 3007 | 3007 |
| 3008 scoped_ptr<LayerImpl> child = LayerImpl::create(456); | 3008 scoped_ptr<LayerImpl> child = LayerImpl::create(456); |
| 3009 position = FloatPoint(-50, -50); | 3009 position = gfx::PointF(-50, -50); |
| 3010 bounds = IntSize(300, 300); | 3010 bounds = gfx::Size(300, 300); |
| 3011 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix
, anchor, position, bounds, false); | 3011 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix
, anchor, position, bounds, false); |
| 3012 child->setDrawsContent(true); | 3012 child->setDrawsContent(true); |
| 3013 clippingLayer->addChild(child.Pass()); | 3013 clippingLayer->addChild(child.Pass()); |
| 3014 root->addChild(clippingLayer.Pass()); | 3014 root->addChild(clippingLayer.Pass()); |
| 3015 } | 3015 } |
| 3016 | 3016 |
| 3017 std::vector<LayerImpl*> renderSurfaceLayerList; | 3017 std::vector<LayerImpl*> renderSurfaceLayerList; |
| 3018 int dummyMaxTextureSize = 512; | 3018 int dummyMaxTextureSize = 512; |
| 3019 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | 3019 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
| 3020 | 3020 |
| 3021 // Sanity check the scenario we just created. | 3021 // Sanity check the scenario we just created. |
| 3022 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | 3022 ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
| 3023 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); | 3023 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
| 3024 ASSERT_EQ(456, root->renderSurface()->layerList()[0]->id()); | 3024 ASSERT_EQ(456, root->renderSurface()->layerList()[0]->id()); |
| 3025 | 3025 |
| 3026 // Hit testing for a point outside the layer should return a null pointer. | 3026 // Hit testing for a point outside the layer should return a null pointer. |
| 3027 // Despite the child layer being very large, it should be clipped to the roo
t layer's bounds. | 3027 // Despite the child layer being very large, it should be clipped to the roo
t layer's bounds. |
| 3028 IntPoint testPoint(24, 24); | 3028 gfx::Point testPoint(24, 24); |
| 3029 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); | 3029 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); |
| 3030 EXPECT_FALSE(resultLayer); | 3030 EXPECT_FALSE(resultLayer); |
| 3031 | 3031 |
| 3032 // Even though the layer exists at (101, 101), it should not be visible ther
e since the clippingLayer would clamp it. | 3032 // Even though the layer exists at (101, 101), it should not be visible ther
e since the clippingLayer would clamp it. |
| 3033 testPoint = IntPoint(76, 76); | 3033 testPoint = gfx::Point(76, 76); |
| 3034 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3034 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3035 EXPECT_FALSE(resultLayer); | 3035 EXPECT_FALSE(resultLayer); |
| 3036 | 3036 |
| 3037 // Hit testing for a point inside should return the child layer. | 3037 // Hit testing for a point inside should return the child layer. |
| 3038 testPoint = IntPoint(26, 26); | 3038 testPoint = gfx::Point(26, 26); |
| 3039 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3039 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3040 ASSERT_TRUE(resultLayer); | 3040 ASSERT_TRUE(resultLayer); |
| 3041 EXPECT_EQ(456, resultLayer->id()); | 3041 EXPECT_EQ(456, resultLayer->id()); |
| 3042 | 3042 |
| 3043 testPoint = IntPoint(74, 74); | 3043 testPoint = gfx::Point(74, 74); |
| 3044 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3044 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3045 ASSERT_TRUE(resultLayer); | 3045 ASSERT_TRUE(resultLayer); |
| 3046 EXPECT_EQ(456, resultLayer->id()); | 3046 EXPECT_EQ(456, resultLayer->id()); |
| 3047 } | 3047 } |
| 3048 | 3048 |
| 3049 TEST(LayerTreeHostCommonTest, verifyHitTestingForMultiClippedRotatedLayer) | 3049 TEST(LayerTreeHostCommonTest, verifyHitTestingForMultiClippedRotatedLayer) |
| 3050 { | 3050 { |
| 3051 // This test checks whether hit testing correctly avoids hit testing with mu
ltiple | 3051 // This test checks whether hit testing correctly avoids hit testing with mu
ltiple |
| 3052 // ancestors that clip in non axis-aligned ways. To pass this test, the hit
testing | 3052 // ancestors that clip in non axis-aligned ways. To pass this test, the hit
testing |
| 3053 // algorithm needs to recognize that multiple parent layers may clip the lay
er, and | 3053 // algorithm needs to recognize that multiple parent layers may clip the lay
er, and |
| 3054 // should not actually hit those clipped areas. | 3054 // should not actually hit those clipped areas. |
| 3055 // | 3055 // |
| 3056 // The child and grandChild layers are both initialized to clip the rotatedL
eaf. The | 3056 // The child and grandChild layers are both initialized to clip the rotatedL
eaf. The |
| 3057 // child layer is rotated about the top-left corner, so that the root + chil
d clips | 3057 // child layer is rotated about the top-left corner, so that the root + chil
d clips |
| 3058 // combined create a triangle. The rotatedLeaf will only be visible where it
overlaps | 3058 // combined create a triangle. The rotatedLeaf will only be visible where it
overlaps |
| 3059 // this triangle. | 3059 // this triangle. |
| 3060 // | 3060 // |
| 3061 DebugScopedSetImplThread thisScopeIsOnImplThread; | 3061 DebugScopedSetImplThread thisScopeIsOnImplThread; |
| 3062 | 3062 |
| 3063 scoped_ptr<LayerImpl> root = LayerImpl::create(123); | 3063 scoped_ptr<LayerImpl> root = LayerImpl::create(123); |
| 3064 | 3064 |
| 3065 WebTransformationMatrix identityMatrix; | 3065 WebTransformationMatrix identityMatrix; |
| 3066 FloatPoint anchor(0, 0); | 3066 gfx::PointF anchor(0, 0); |
| 3067 FloatPoint position(0, 0); | 3067 gfx::PointF position(0, 0); |
| 3068 IntSize bounds(100, 100); | 3068 gfx::Size bounds(100, 100); |
| 3069 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, position, bounds, false); | 3069 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, position, bounds, false); |
| 3070 root->setMasksToBounds(true); | 3070 root->setMasksToBounds(true); |
| 3071 | 3071 |
| 3072 { | 3072 { |
| 3073 scoped_ptr<LayerImpl> child = LayerImpl::create(456); | 3073 scoped_ptr<LayerImpl> child = LayerImpl::create(456); |
| 3074 scoped_ptr<LayerImpl> grandChild = LayerImpl::create(789); | 3074 scoped_ptr<LayerImpl> grandChild = LayerImpl::create(789); |
| 3075 scoped_ptr<LayerImpl> rotatedLeaf = LayerImpl::create(2468); | 3075 scoped_ptr<LayerImpl> rotatedLeaf = LayerImpl::create(2468); |
| 3076 | 3076 |
| 3077 position = FloatPoint(10, 10); | 3077 position = gfx::PointF(10, 10); |
| 3078 bounds = IntSize(80, 80); | 3078 bounds = gfx::Size(80, 80); |
| 3079 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix
, anchor, position, bounds, false); | 3079 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix
, anchor, position, bounds, false); |
| 3080 child->setMasksToBounds(true); | 3080 child->setMasksToBounds(true); |
| 3081 | 3081 |
| 3082 WebTransformationMatrix rotation45DegreesAboutCorner; | 3082 WebTransformationMatrix rotation45DegreesAboutCorner; |
| 3083 rotation45DegreesAboutCorner.rotate3d(0, 0, 45); | 3083 rotation45DegreesAboutCorner.rotate3d(0, 0, 45); |
| 3084 | 3084 |
| 3085 position = FloatPoint(0, 0); // remember, positioned with respect to its
parent which is already at 10, 10 | 3085 position = gfx::PointF(0, 0); // remember, positioned with respect to it
s parent which is already at 10, 10 |
| 3086 bounds = IntSize(200, 200); // to ensure it covers at least sqrt(2) * 10
0. | 3086 bounds = gfx::Size(200, 200); // to ensure it covers at least sqrt(2) *
100. |
| 3087 setLayerPropertiesForTesting(grandChild.get(), rotation45DegreesAboutCor
ner, identityMatrix, anchor, position, bounds, false); | 3087 setLayerPropertiesForTesting(grandChild.get(), rotation45DegreesAboutCor
ner, identityMatrix, anchor, position, bounds, false); |
| 3088 grandChild->setMasksToBounds(true); | 3088 grandChild->setMasksToBounds(true); |
| 3089 | 3089 |
| 3090 // Rotates about the center of the layer | 3090 // Rotates about the center of the layer |
| 3091 WebTransformationMatrix rotatedLeafTransform; | 3091 WebTransformationMatrix rotatedLeafTransform; |
| 3092 rotatedLeafTransform.translate(-10, -10); // cancel out the grandParent'
s position | 3092 rotatedLeafTransform.translate(-10, -10); // cancel out the grandParent'
s position |
| 3093 rotatedLeafTransform.rotate3d(0, 0, -45); // cancel out the corner 45-de
gree rotation of the parent. | 3093 rotatedLeafTransform.rotate3d(0, 0, -45); // cancel out the corner 45-de
gree rotation of the parent. |
| 3094 rotatedLeafTransform.translate(50, 50); | 3094 rotatedLeafTransform.translate(50, 50); |
| 3095 rotatedLeafTransform.rotate3d(0, 0, 45); | 3095 rotatedLeafTransform.rotate3d(0, 0, 45); |
| 3096 rotatedLeafTransform.translate(-50, -50); | 3096 rotatedLeafTransform.translate(-50, -50); |
| 3097 position = FloatPoint(0, 0); | 3097 position = gfx::PointF(0, 0); |
| 3098 bounds = IntSize(100, 100); | 3098 bounds = gfx::Size(100, 100); |
| 3099 setLayerPropertiesForTesting(rotatedLeaf.get(), rotatedLeafTransform, id
entityMatrix, anchor, position, bounds, false); | 3099 setLayerPropertiesForTesting(rotatedLeaf.get(), rotatedLeafTransform, id
entityMatrix, anchor, position, bounds, false); |
| 3100 rotatedLeaf->setDrawsContent(true); | 3100 rotatedLeaf->setDrawsContent(true); |
| 3101 | 3101 |
| 3102 grandChild->addChild(rotatedLeaf.Pass()); | 3102 grandChild->addChild(rotatedLeaf.Pass()); |
| 3103 child->addChild(grandChild.Pass()); | 3103 child->addChild(grandChild.Pass()); |
| 3104 root->addChild(child.Pass()); | 3104 root->addChild(child.Pass()); |
| 3105 } | 3105 } |
| 3106 | 3106 |
| 3107 std::vector<LayerImpl*> renderSurfaceLayerList; | 3107 std::vector<LayerImpl*> renderSurfaceLayerList; |
| 3108 int dummyMaxTextureSize = 512; | 3108 int dummyMaxTextureSize = 512; |
| 3109 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | 3109 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
| 3110 | 3110 |
| 3111 // Sanity check the scenario we just created. | 3111 // Sanity check the scenario we just created. |
| 3112 // The grandChild is expected to create a renderSurface because it masksToBo
unds and is not axis aligned. | 3112 // The grandChild is expected to create a renderSurface because it masksToBo
unds and is not axis aligned. |
| 3113 ASSERT_EQ(2u, renderSurfaceLayerList.size()); | 3113 ASSERT_EQ(2u, renderSurfaceLayerList.size()); |
| 3114 ASSERT_EQ(1u, renderSurfaceLayerList[0]->renderSurface()->layerList().size()
); | 3114 ASSERT_EQ(1u, renderSurfaceLayerList[0]->renderSurface()->layerList().size()
); |
| 3115 ASSERT_EQ(789, renderSurfaceLayerList[0]->renderSurface()->layerList()[0]->i
d()); // grandChild's surface. | 3115 ASSERT_EQ(789, renderSurfaceLayerList[0]->renderSurface()->layerList()[0]->i
d()); // grandChild's surface. |
| 3116 ASSERT_EQ(1u, renderSurfaceLayerList[1]->renderSurface()->layerList().size()
); | 3116 ASSERT_EQ(1u, renderSurfaceLayerList[1]->renderSurface()->layerList().size()
); |
| 3117 ASSERT_EQ(2468, renderSurfaceLayerList[1]->renderSurface()->layerList()[0]->
id()); | 3117 ASSERT_EQ(2468, renderSurfaceLayerList[1]->renderSurface()->layerList()[0]->
id()); |
| 3118 | 3118 |
| 3119 // (11, 89) is close to the the bottom left corner within the clip, but it i
s not inside the layer. | 3119 // (11, 89) is close to the the bottom left corner within the clip, but it i
s not inside the layer. |
| 3120 IntPoint testPoint(11, 89); | 3120 gfx::Point testPoint(11, 89); |
| 3121 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); | 3121 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); |
| 3122 EXPECT_FALSE(resultLayer); | 3122 EXPECT_FALSE(resultLayer); |
| 3123 | 3123 |
| 3124 // Closer inwards from the bottom left will overlap the layer. | 3124 // Closer inwards from the bottom left will overlap the layer. |
| 3125 testPoint = IntPoint(25, 75); | 3125 testPoint = gfx::Point(25, 75); |
| 3126 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3126 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3127 ASSERT_TRUE(resultLayer); | 3127 ASSERT_TRUE(resultLayer); |
| 3128 EXPECT_EQ(2468, resultLayer->id()); | 3128 EXPECT_EQ(2468, resultLayer->id()); |
| 3129 | 3129 |
| 3130 // (4, 50) is inside the unclipped layer, but that corner of the layer shoul
d be | 3130 // (4, 50) is inside the unclipped layer, but that corner of the layer shoul
d be |
| 3131 // clipped away by the grandParent and should not get hit. If hit testing bl
indly uses | 3131 // clipped away by the grandParent and should not get hit. If hit testing bl
indly uses |
| 3132 // visibleContentRect without considering how parent may clip the layer, the
n hit | 3132 // visibleContentRect without considering how parent may clip the layer, the
n hit |
| 3133 // testing would accidentally think that the point successfully hits the lay
er. | 3133 // testing would accidentally think that the point successfully hits the lay
er. |
| 3134 testPoint = IntPoint(4, 50); | 3134 testPoint = gfx::Point(4, 50); |
| 3135 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3135 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3136 EXPECT_FALSE(resultLayer); | 3136 EXPECT_FALSE(resultLayer); |
| 3137 | 3137 |
| 3138 // (11, 50) is inside the layer and within the clipped area. | 3138 // (11, 50) is inside the layer and within the clipped area. |
| 3139 testPoint = IntPoint(11, 50); | 3139 testPoint = gfx::Point(11, 50); |
| 3140 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3140 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3141 ASSERT_TRUE(resultLayer); | 3141 ASSERT_TRUE(resultLayer); |
| 3142 EXPECT_EQ(2468, resultLayer->id()); | 3142 EXPECT_EQ(2468, resultLayer->id()); |
| 3143 | 3143 |
| 3144 // Around the middle, just to the right and up, would have hit the layer exc
ept that | 3144 // Around the middle, just to the right and up, would have hit the layer exc
ept that |
| 3145 // that area should be clipped away by the parent. | 3145 // that area should be clipped away by the parent. |
| 3146 testPoint = IntPoint(51, 51); | 3146 testPoint = gfx::Point(51, 51); |
| 3147 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3147 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3148 EXPECT_FALSE(resultLayer); | 3148 EXPECT_FALSE(resultLayer); |
| 3149 | 3149 |
| 3150 // Around the middle, just to the left and down, should successfully hit the
layer. | 3150 // Around the middle, just to the left and down, should successfully hit the
layer. |
| 3151 testPoint = IntPoint(49, 51); | 3151 testPoint = gfx::Point(49, 51); |
| 3152 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3152 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3153 ASSERT_TRUE(resultLayer); | 3153 ASSERT_TRUE(resultLayer); |
| 3154 EXPECT_EQ(2468, resultLayer->id()); | 3154 EXPECT_EQ(2468, resultLayer->id()); |
| 3155 } | 3155 } |
| 3156 | 3156 |
| 3157 TEST(LayerTreeHostCommonTest, verifyHitTestingForNonClippingIntermediateLayer) | 3157 TEST(LayerTreeHostCommonTest, verifyHitTestingForNonClippingIntermediateLayer) |
| 3158 { | 3158 { |
| 3159 // This test checks that hit testing code does not accidentally clip to laye
r | 3159 // This test checks that hit testing code does not accidentally clip to laye
r |
| 3160 // bounds for a layer that actually does not clip. | 3160 // bounds for a layer that actually does not clip. |
| 3161 DebugScopedSetImplThread thisScopeIsOnImplThread; | 3161 DebugScopedSetImplThread thisScopeIsOnImplThread; |
| 3162 | 3162 |
| 3163 WebTransformationMatrix identityMatrix; | 3163 WebTransformationMatrix identityMatrix; |
| 3164 FloatPoint anchor(0, 0); | 3164 gfx::PointF anchor(0, 0); |
| 3165 | 3165 |
| 3166 scoped_ptr<LayerImpl> root = LayerImpl::create(1); | 3166 scoped_ptr<LayerImpl> root = LayerImpl::create(1); |
| 3167 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, FloatPoint(0, 0), IntSize(100, 100), false); | 3167 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, gfx::PointF(0, 0), gfx::Size(100, 100), false); |
| 3168 | 3168 |
| 3169 { | 3169 { |
| 3170 scoped_ptr<LayerImpl> intermediateLayer = LayerImpl::create(123); | 3170 scoped_ptr<LayerImpl> intermediateLayer = LayerImpl::create(123); |
| 3171 FloatPoint position(10, 10); // this layer is positioned, and hit testin
g should correctly know where the layer is located. | 3171 gfx::PointF position(10, 10); // this layer is positioned, and hit testi
ng should correctly know where the layer is located. |
| 3172 IntSize bounds(50, 50); | 3172 gfx::Size bounds(50, 50); |
| 3173 setLayerPropertiesForTesting(intermediateLayer.get(), identityMatrix, id
entityMatrix, anchor, position, bounds, false); | 3173 setLayerPropertiesForTesting(intermediateLayer.get(), identityMatrix, id
entityMatrix, anchor, position, bounds, false); |
| 3174 // Sanity check the intermediate layer should not clip. | 3174 // Sanity check the intermediate layer should not clip. |
| 3175 ASSERT_FALSE(intermediateLayer->masksToBounds()); | 3175 ASSERT_FALSE(intermediateLayer->masksToBounds()); |
| 3176 ASSERT_FALSE(intermediateLayer->maskLayer()); | 3176 ASSERT_FALSE(intermediateLayer->maskLayer()); |
| 3177 | 3177 |
| 3178 // The child of the intermediateLayer is translated so that it does not
overlap intermediateLayer at all. | 3178 // The child of the intermediateLayer is translated so that it does not
overlap intermediateLayer at all. |
| 3179 // If child is incorrectly clipped, we would not be able to hit it succe
ssfully. | 3179 // If child is incorrectly clipped, we would not be able to hit it succe
ssfully. |
| 3180 scoped_ptr<LayerImpl> child = LayerImpl::create(456); | 3180 scoped_ptr<LayerImpl> child = LayerImpl::create(456); |
| 3181 position = FloatPoint(60, 60); // 70, 70 in screen space | 3181 position = gfx::PointF(60, 60); // 70, 70 in screen space |
| 3182 bounds = IntSize(20, 20); | 3182 bounds = gfx::Size(20, 20); |
| 3183 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix
, anchor, position, bounds, false); | 3183 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix
, anchor, position, bounds, false); |
| 3184 child->setDrawsContent(true); | 3184 child->setDrawsContent(true); |
| 3185 intermediateLayer->addChild(child.Pass()); | 3185 intermediateLayer->addChild(child.Pass()); |
| 3186 root->addChild(intermediateLayer.Pass()); | 3186 root->addChild(intermediateLayer.Pass()); |
| 3187 } | 3187 } |
| 3188 | 3188 |
| 3189 std::vector<LayerImpl*> renderSurfaceLayerList; | 3189 std::vector<LayerImpl*> renderSurfaceLayerList; |
| 3190 int dummyMaxTextureSize = 512; | 3190 int dummyMaxTextureSize = 512; |
| 3191 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | 3191 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
| 3192 | 3192 |
| 3193 // Sanity check the scenario we just created. | 3193 // Sanity check the scenario we just created. |
| 3194 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | 3194 ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
| 3195 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); | 3195 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
| 3196 ASSERT_EQ(456, root->renderSurface()->layerList()[0]->id()); | 3196 ASSERT_EQ(456, root->renderSurface()->layerList()[0]->id()); |
| 3197 | 3197 |
| 3198 // Hit testing for a point outside the layer should return a null pointer. | 3198 // Hit testing for a point outside the layer should return a null pointer. |
| 3199 IntPoint testPoint(69, 69); | 3199 gfx::Point testPoint(69, 69); |
| 3200 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); | 3200 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); |
| 3201 EXPECT_FALSE(resultLayer); | 3201 EXPECT_FALSE(resultLayer); |
| 3202 | 3202 |
| 3203 testPoint = IntPoint(91, 91); | 3203 testPoint = gfx::Point(91, 91); |
| 3204 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3204 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3205 EXPECT_FALSE(resultLayer); | 3205 EXPECT_FALSE(resultLayer); |
| 3206 | 3206 |
| 3207 // Hit testing for a point inside should return the child layer. | 3207 // Hit testing for a point inside should return the child layer. |
| 3208 testPoint = IntPoint(71, 71); | 3208 testPoint = gfx::Point(71, 71); |
| 3209 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3209 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3210 ASSERT_TRUE(resultLayer); | 3210 ASSERT_TRUE(resultLayer); |
| 3211 EXPECT_EQ(456, resultLayer->id()); | 3211 EXPECT_EQ(456, resultLayer->id()); |
| 3212 | 3212 |
| 3213 testPoint = IntPoint(89, 89); | 3213 testPoint = gfx::Point(89, 89); |
| 3214 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3214 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3215 ASSERT_TRUE(resultLayer); | 3215 ASSERT_TRUE(resultLayer); |
| 3216 EXPECT_EQ(456, resultLayer->id()); | 3216 EXPECT_EQ(456, resultLayer->id()); |
| 3217 } | 3217 } |
| 3218 | 3218 |
| 3219 | 3219 |
| 3220 TEST(LayerTreeHostCommonTest, verifyHitTestingForMultipleLayers) | 3220 TEST(LayerTreeHostCommonTest, verifyHitTestingForMultipleLayers) |
| 3221 { | 3221 { |
| 3222 DebugScopedSetImplThread thisScopeIsOnImplThread; | 3222 DebugScopedSetImplThread thisScopeIsOnImplThread; |
| 3223 | 3223 |
| 3224 scoped_ptr<LayerImpl> root = LayerImpl::create(1); | 3224 scoped_ptr<LayerImpl> root = LayerImpl::create(1); |
| 3225 | 3225 |
| 3226 WebTransformationMatrix identityMatrix; | 3226 WebTransformationMatrix identityMatrix; |
| 3227 FloatPoint anchor(0, 0); | 3227 gfx::PointF anchor(0, 0); |
| 3228 FloatPoint position(0, 0); | 3228 gfx::PointF position(0, 0); |
| 3229 IntSize bounds(100, 100); | 3229 gfx::Size bounds(100, 100); |
| 3230 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, position, bounds, false); | 3230 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, position, bounds, false); |
| 3231 root->setDrawsContent(true); | 3231 root->setDrawsContent(true); |
| 3232 | 3232 |
| 3233 { | 3233 { |
| 3234 // child 1 and child2 are initialized to overlap between x=50 and x=60. | 3234 // child 1 and child2 are initialized to overlap between x=50 and x=60. |
| 3235 // grandChild is set to overlap both child1 and child2 between y=50 and
y=60. | 3235 // grandChild is set to overlap both child1 and child2 between y=50 and
y=60. |
| 3236 // The expected stacking order is: | 3236 // The expected stacking order is: |
| 3237 // (front) child2, (second) grandChild, (third) child1, and (back) the
root layer behind all other layers. | 3237 // (front) child2, (second) grandChild, (third) child1, and (back) the
root layer behind all other layers. |
| 3238 | 3238 |
| 3239 scoped_ptr<LayerImpl> child1 = LayerImpl::create(2); | 3239 scoped_ptr<LayerImpl> child1 = LayerImpl::create(2); |
| 3240 scoped_ptr<LayerImpl> child2 = LayerImpl::create(3); | 3240 scoped_ptr<LayerImpl> child2 = LayerImpl::create(3); |
| 3241 scoped_ptr<LayerImpl> grandChild1 = LayerImpl::create(4); | 3241 scoped_ptr<LayerImpl> grandChild1 = LayerImpl::create(4); |
| 3242 | 3242 |
| 3243 position = FloatPoint(10, 10); | 3243 position = gfx::PointF(10, 10); |
| 3244 bounds = IntSize(50, 50); | 3244 bounds = gfx::Size(50, 50); |
| 3245 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatri
x, anchor, position, bounds, false); | 3245 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatri
x, anchor, position, bounds, false); |
| 3246 child1->setDrawsContent(true); | 3246 child1->setDrawsContent(true); |
| 3247 | 3247 |
| 3248 position = FloatPoint(50, 10); | 3248 position = gfx::PointF(50, 10); |
| 3249 bounds = IntSize(50, 50); | 3249 bounds = gfx::Size(50, 50); |
| 3250 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatri
x, anchor, position, bounds, false); | 3250 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatri
x, anchor, position, bounds, false); |
| 3251 child2->setDrawsContent(true); | 3251 child2->setDrawsContent(true); |
| 3252 | 3252 |
| 3253 // Remember that grandChild is positioned with respect to its parent (i.
e. child1). | 3253 // Remember that grandChild is positioned with respect to its parent (i.
e. child1). |
| 3254 // In screen space, the intended position is (10, 50), with size 100 x 5
0. | 3254 // In screen space, the intended position is (10, 50), with size 100 x 5
0. |
| 3255 position = FloatPoint(0, 40); | 3255 position = gfx::PointF(0, 40); |
| 3256 bounds = IntSize(100, 50); | 3256 bounds = gfx::Size(100, 50); |
| 3257 setLayerPropertiesForTesting(grandChild1.get(), identityMatrix, identity
Matrix, anchor, position, bounds, false); | 3257 setLayerPropertiesForTesting(grandChild1.get(), identityMatrix, identity
Matrix, anchor, position, bounds, false); |
| 3258 grandChild1->setDrawsContent(true); | 3258 grandChild1->setDrawsContent(true); |
| 3259 | 3259 |
| 3260 child1->addChild(grandChild1.Pass()); | 3260 child1->addChild(grandChild1.Pass()); |
| 3261 root->addChild(child1.Pass()); | 3261 root->addChild(child1.Pass()); |
| 3262 root->addChild(child2.Pass()); | 3262 root->addChild(child2.Pass()); |
| 3263 } | 3263 } |
| 3264 | 3264 |
| 3265 LayerImpl* child1 = root->children()[0]; | 3265 LayerImpl* child1 = root->children()[0]; |
| 3266 LayerImpl* child2 = root->children()[1]; | 3266 LayerImpl* child2 = root->children()[1]; |
| 3267 LayerImpl* grandChild1 = child1->children()[0]; | 3267 LayerImpl* grandChild1 = child1->children()[0]; |
| 3268 | 3268 |
| 3269 std::vector<LayerImpl*> renderSurfaceLayerList; | 3269 std::vector<LayerImpl*> renderSurfaceLayerList; |
| 3270 int dummyMaxTextureSize = 512; | 3270 int dummyMaxTextureSize = 512; |
| 3271 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | 3271 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1,
1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
| 3272 | 3272 |
| 3273 // Sanity check the scenario we just created. | 3273 // Sanity check the scenario we just created. |
| 3274 ASSERT_TRUE(child1); | 3274 ASSERT_TRUE(child1); |
| 3275 ASSERT_TRUE(child2); | 3275 ASSERT_TRUE(child2); |
| 3276 ASSERT_TRUE(grandChild1); | 3276 ASSERT_TRUE(grandChild1); |
| 3277 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | 3277 ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
| 3278 ASSERT_EQ(4u, root->renderSurface()->layerList().size()); | 3278 ASSERT_EQ(4u, root->renderSurface()->layerList().size()); |
| 3279 ASSERT_EQ(1, root->renderSurface()->layerList()[0]->id()); // root layer | 3279 ASSERT_EQ(1, root->renderSurface()->layerList()[0]->id()); // root layer |
| 3280 ASSERT_EQ(2, root->renderSurface()->layerList()[1]->id()); // child1 | 3280 ASSERT_EQ(2, root->renderSurface()->layerList()[1]->id()); // child1 |
| 3281 ASSERT_EQ(4, root->renderSurface()->layerList()[2]->id()); // grandChild1 | 3281 ASSERT_EQ(4, root->renderSurface()->layerList()[2]->id()); // grandChild1 |
| 3282 ASSERT_EQ(3, root->renderSurface()->layerList()[3]->id()); // child2 | 3282 ASSERT_EQ(3, root->renderSurface()->layerList()[3]->id()); // child2 |
| 3283 | 3283 |
| 3284 // Nothing overlaps the rootLayer at (1, 1), so hit testing there should fin
d the root layer. | 3284 // Nothing overlaps the rootLayer at (1, 1), so hit testing there should fin
d the root layer. |
| 3285 IntPoint testPoint = IntPoint(1, 1); | 3285 gfx::Point testPoint = gfx::Point(1, 1); |
| 3286 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); | 3286 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); |
| 3287 ASSERT_TRUE(resultLayer); | 3287 ASSERT_TRUE(resultLayer); |
| 3288 EXPECT_EQ(1, resultLayer->id()); | 3288 EXPECT_EQ(1, resultLayer->id()); |
| 3289 | 3289 |
| 3290 // At (15, 15), child1 and root are the only layers. child1 is expected to b
e on top. | 3290 // At (15, 15), child1 and root are the only layers. child1 is expected to b
e on top. |
| 3291 testPoint = IntPoint(15, 15); | 3291 testPoint = gfx::Point(15, 15); |
| 3292 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3292 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3293 ASSERT_TRUE(resultLayer); | 3293 ASSERT_TRUE(resultLayer); |
| 3294 EXPECT_EQ(2, resultLayer->id()); | 3294 EXPECT_EQ(2, resultLayer->id()); |
| 3295 | 3295 |
| 3296 // At (51, 20), child1 and child2 overlap. child2 is expected to be on top. | 3296 // At (51, 20), child1 and child2 overlap. child2 is expected to be on top. |
| 3297 testPoint = IntPoint(51, 20); | 3297 testPoint = gfx::Point(51, 20); |
| 3298 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3298 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3299 ASSERT_TRUE(resultLayer); | 3299 ASSERT_TRUE(resultLayer); |
| 3300 EXPECT_EQ(3, resultLayer->id()); | 3300 EXPECT_EQ(3, resultLayer->id()); |
| 3301 | 3301 |
| 3302 // At (80, 51), child2 and grandChild1 overlap. child2 is expected to be on
top. | 3302 // At (80, 51), child2 and grandChild1 overlap. child2 is expected to be on
top. |
| 3303 testPoint = IntPoint(80, 51); | 3303 testPoint = gfx::Point(80, 51); |
| 3304 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3304 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3305 ASSERT_TRUE(resultLayer); | 3305 ASSERT_TRUE(resultLayer); |
| 3306 EXPECT_EQ(3, resultLayer->id()); | 3306 EXPECT_EQ(3, resultLayer->id()); |
| 3307 | 3307 |
| 3308 // At (51, 51), all layers overlap each other. child2 is expected to be on t
op of all other layers. | 3308 // At (51, 51), all layers overlap each other. child2 is expected to be on t
op of all other layers. |
| 3309 testPoint = IntPoint(51, 51); | 3309 testPoint = gfx::Point(51, 51); |
| 3310 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3310 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3311 ASSERT_TRUE(resultLayer); | 3311 ASSERT_TRUE(resultLayer); |
| 3312 EXPECT_EQ(3, resultLayer->id()); | 3312 EXPECT_EQ(3, resultLayer->id()); |
| 3313 | 3313 |
| 3314 // At (20, 51), child1 and grandChild1 overlap. grandChild1 is expected to b
e on top. | 3314 // At (20, 51), child1 and grandChild1 overlap. grandChild1 is expected to b
e on top. |
| 3315 testPoint = IntPoint(20, 51); | 3315 testPoint = gfx::Point(20, 51); |
| 3316 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3316 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3317 ASSERT_TRUE(resultLayer); | 3317 ASSERT_TRUE(resultLayer); |
| 3318 EXPECT_EQ(4, resultLayer->id()); | 3318 EXPECT_EQ(4, resultLayer->id()); |
| 3319 } | 3319 } |
| 3320 | 3320 |
| 3321 TEST(LayerTreeHostCommonTest, verifyHitTestingForMultipleLayerLists) | 3321 TEST(LayerTreeHostCommonTest, verifyHitTestingForMultipleLayerLists) |
| 3322 { | 3322 { |
| 3323 // | 3323 // |
| 3324 // The geometry is set up similarly to the previous case, but | 3324 // The geometry is set up similarly to the previous case, but |
| 3325 // all layers are forced to be renderSurfaces now. | 3325 // all layers are forced to be renderSurfaces now. |
| 3326 // | 3326 // |
| 3327 DebugScopedSetImplThread thisScopeIsOnImplThread; | 3327 DebugScopedSetImplThread thisScopeIsOnImplThread; |
| 3328 | 3328 |
| 3329 scoped_ptr<LayerImpl> root = LayerImpl::create(1); | 3329 scoped_ptr<LayerImpl> root = LayerImpl::create(1); |
| 3330 | 3330 |
| 3331 WebTransformationMatrix identityMatrix; | 3331 WebTransformationMatrix identityMatrix; |
| 3332 FloatPoint anchor(0, 0); | 3332 gfx::PointF anchor(0, 0); |
| 3333 FloatPoint position(0, 0); | 3333 gfx::PointF position(0, 0); |
| 3334 IntSize bounds(100, 100); | 3334 gfx::Size bounds(100, 100); |
| 3335 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, position, bounds, false); | 3335 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc
hor, position, bounds, false); |
| 3336 root->setDrawsContent(true); | 3336 root->setDrawsContent(true); |
| 3337 | 3337 |
| 3338 { | 3338 { |
| 3339 // child 1 and child2 are initialized to overlap between x=50 and x=60. | 3339 // child 1 and child2 are initialized to overlap between x=50 and x=60. |
| 3340 // grandChild is set to overlap both child1 and child2 between y=50 and
y=60. | 3340 // grandChild is set to overlap both child1 and child2 between y=50 and
y=60. |
| 3341 // The expected stacking order is: | 3341 // The expected stacking order is: |
| 3342 // (front) child2, (second) grandChild, (third) child1, and (back) the
root layer behind all other layers. | 3342 // (front) child2, (second) grandChild, (third) child1, and (back) the
root layer behind all other layers. |
| 3343 | 3343 |
| 3344 scoped_ptr<LayerImpl> child1 = LayerImpl::create(2); | 3344 scoped_ptr<LayerImpl> child1 = LayerImpl::create(2); |
| 3345 scoped_ptr<LayerImpl> child2 = LayerImpl::create(3); | 3345 scoped_ptr<LayerImpl> child2 = LayerImpl::create(3); |
| 3346 scoped_ptr<LayerImpl> grandChild1 = LayerImpl::create(4); | 3346 scoped_ptr<LayerImpl> grandChild1 = LayerImpl::create(4); |
| 3347 | 3347 |
| 3348 position = FloatPoint(10, 10); | 3348 position = gfx::PointF(10, 10); |
| 3349 bounds = IntSize(50, 50); | 3349 bounds = gfx::Size(50, 50); |
| 3350 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatri
x, anchor, position, bounds, false); | 3350 setLayerPropertiesForTesting(child1.get(), identityMatrix, identityMatri
x, anchor, position, bounds, false); |
| 3351 child1->setDrawsContent(true); | 3351 child1->setDrawsContent(true); |
| 3352 child1->setForceRenderSurface(true); | 3352 child1->setForceRenderSurface(true); |
| 3353 | 3353 |
| 3354 position = FloatPoint(50, 10); | 3354 position = gfx::PointF(50, 10); |
| 3355 bounds = IntSize(50, 50); | 3355 bounds = gfx::Size(50, 50); |
| 3356 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatri
x, anchor, position, bounds, false); | 3356 setLayerPropertiesForTesting(child2.get(), identityMatrix, identityMatri
x, anchor, position, bounds, false); |
| 3357 child2->setDrawsContent(true); | 3357 child2->setDrawsContent(true); |
| 3358 child2->setForceRenderSurface(true); | 3358 child2->setForceRenderSurface(true); |
| 3359 | 3359 |
| 3360 // Remember that grandChild is positioned with respect to its parent (i.
e. child1). | 3360 // Remember that grandChild is positioned with respect to its parent (i.
e. child1). |
| 3361 // In screen space, the intended position is (10, 50), with size 100 x 5
0. | 3361 // In screen space, the intended position is (10, 50), with size 100 x 5
0. |
| 3362 position = FloatPoint(0, 40); | 3362 position = gfx::PointF(0, 40); |
| 3363 bounds = IntSize(100, 50); | 3363 bounds = gfx::Size(100, 50); |
| 3364 setLayerPropertiesForTesting(grandChild1.get(), identityMatrix, identity
Matrix, anchor, position, bounds, false); | 3364 setLayerPropertiesForTesting(grandChild1.get(), identityMatrix, identity
Matrix, anchor, position, bounds, false); |
| 3365 grandChild1->setDrawsContent(true); | 3365 grandChild1->setDrawsContent(true); |
| 3366 grandChild1->setForceRenderSurface(true); | 3366 grandChild1->setForceRenderSurface(true); |
| 3367 | 3367 |
| 3368 child1->addChild(grandChild1.Pass()); | 3368 child1->addChild(grandChild1.Pass()); |
| 3369 root->addChild(child1.Pass()); | 3369 root->addChild(child1.Pass()); |
| 3370 root->addChild(child2.Pass()); | 3370 root->addChild(child2.Pass()); |
| 3371 } | 3371 } |
| 3372 | 3372 |
| 3373 LayerImpl* child1 = root->children()[0]; | 3373 LayerImpl* child1 = root->children()[0]; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 3389 ASSERT_EQ(3u, root->renderSurface()->layerList().size()); // The root surfac
e has the root layer, and child1's and child2's renderSurfaces. | 3389 ASSERT_EQ(3u, root->renderSurface()->layerList().size()); // The root surfac
e has the root layer, and child1's and child2's renderSurfaces. |
| 3390 ASSERT_EQ(2u, child1->renderSurface()->layerList().size()); // The child1 su
rface has the child1 layer and grandChild1's renderSurface. | 3390 ASSERT_EQ(2u, child1->renderSurface()->layerList().size()); // The child1 su
rface has the child1 layer and grandChild1's renderSurface. |
| 3391 ASSERT_EQ(1u, child2->renderSurface()->layerList().size()); | 3391 ASSERT_EQ(1u, child2->renderSurface()->layerList().size()); |
| 3392 ASSERT_EQ(1u, grandChild1->renderSurface()->layerList().size()); | 3392 ASSERT_EQ(1u, grandChild1->renderSurface()->layerList().size()); |
| 3393 ASSERT_EQ(1, renderSurfaceLayerList[0]->id()); // root layer | 3393 ASSERT_EQ(1, renderSurfaceLayerList[0]->id()); // root layer |
| 3394 ASSERT_EQ(2, renderSurfaceLayerList[1]->id()); // child1 | 3394 ASSERT_EQ(2, renderSurfaceLayerList[1]->id()); // child1 |
| 3395 ASSERT_EQ(4, renderSurfaceLayerList[2]->id()); // grandChild1 | 3395 ASSERT_EQ(4, renderSurfaceLayerList[2]->id()); // grandChild1 |
| 3396 ASSERT_EQ(3, renderSurfaceLayerList[3]->id()); // child2 | 3396 ASSERT_EQ(3, renderSurfaceLayerList[3]->id()); // child2 |
| 3397 | 3397 |
| 3398 // Nothing overlaps the rootLayer at (1, 1), so hit testing there should fin
d the root layer. | 3398 // Nothing overlaps the rootLayer at (1, 1), so hit testing there should fin
d the root layer. |
| 3399 IntPoint testPoint = IntPoint(1, 1); | 3399 gfx::Point testPoint = gfx::Point(1, 1); |
| 3400 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); | 3400 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(test
Point, renderSurfaceLayerList); |
| 3401 ASSERT_TRUE(resultLayer); | 3401 ASSERT_TRUE(resultLayer); |
| 3402 EXPECT_EQ(1, resultLayer->id()); | 3402 EXPECT_EQ(1, resultLayer->id()); |
| 3403 | 3403 |
| 3404 // At (15, 15), child1 and root are the only layers. child1 is expected to b
e on top. | 3404 // At (15, 15), child1 and root are the only layers. child1 is expected to b
e on top. |
| 3405 testPoint = IntPoint(15, 15); | 3405 testPoint = gfx::Point(15, 15); |
| 3406 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3406 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3407 ASSERT_TRUE(resultLayer); | 3407 ASSERT_TRUE(resultLayer); |
| 3408 EXPECT_EQ(2, resultLayer->id()); | 3408 EXPECT_EQ(2, resultLayer->id()); |
| 3409 | 3409 |
| 3410 // At (51, 20), child1 and child2 overlap. child2 is expected to be on top. | 3410 // At (51, 20), child1 and child2 overlap. child2 is expected to be on top. |
| 3411 testPoint = IntPoint(51, 20); | 3411 testPoint = gfx::Point(51, 20); |
| 3412 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3412 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3413 ASSERT_TRUE(resultLayer); | 3413 ASSERT_TRUE(resultLayer); |
| 3414 EXPECT_EQ(3, resultLayer->id()); | 3414 EXPECT_EQ(3, resultLayer->id()); |
| 3415 | 3415 |
| 3416 // At (80, 51), child2 and grandChild1 overlap. child2 is expected to be on
top. | 3416 // At (80, 51), child2 and grandChild1 overlap. child2 is expected to be on
top. |
| 3417 testPoint = IntPoint(80, 51); | 3417 testPoint = gfx::Point(80, 51); |
| 3418 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3418 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3419 ASSERT_TRUE(resultLayer); | 3419 ASSERT_TRUE(resultLayer); |
| 3420 EXPECT_EQ(3, resultLayer->id()); | 3420 EXPECT_EQ(3, resultLayer->id()); |
| 3421 | 3421 |
| 3422 // At (51, 51), all layers overlap each other. child2 is expected to be on t
op of all other layers. | 3422 // At (51, 51), all layers overlap each other. child2 is expected to be on t
op of all other layers. |
| 3423 testPoint = IntPoint(51, 51); | 3423 testPoint = gfx::Point(51, 51); |
| 3424 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3424 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3425 ASSERT_TRUE(resultLayer); | 3425 ASSERT_TRUE(resultLayer); |
| 3426 EXPECT_EQ(3, resultLayer->id()); | 3426 EXPECT_EQ(3, resultLayer->id()); |
| 3427 | 3427 |
| 3428 // At (20, 51), child1 and grandChild1 overlap. grandChild1 is expected to b
e on top. | 3428 // At (20, 51), child1 and grandChild1 overlap. grandChild1 is expected to b
e on top. |
| 3429 testPoint = IntPoint(20, 51); | 3429 testPoint = gfx::Point(20, 51); |
| 3430 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); | 3430 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend
erSurfaceLayerList); |
| 3431 ASSERT_TRUE(resultLayer); | 3431 ASSERT_TRUE(resultLayer); |
| 3432 EXPECT_EQ(4, resultLayer->id()); | 3432 EXPECT_EQ(4, resultLayer->id()); |
| 3433 } | 3433 } |
| 3434 | 3434 |
| 3435 class NoScaleContentLayer : public ContentLayer | 3435 class NoScaleContentLayer : public ContentLayer |
| 3436 { | 3436 { |
| 3437 public: | 3437 public: |
| 3438 static scoped_refptr<NoScaleContentLayer> create(ContentLayerClient* client)
{ return make_scoped_refptr(new NoScaleContentLayer(client)); } | 3438 static scoped_refptr<NoScaleContentLayer> create(ContentLayerClient* client)
{ return make_scoped_refptr(new NoScaleContentLayer(client)); } |
| 3439 | 3439 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3451 return toReturn; | 3451 return toReturn; |
| 3452 } | 3452 } |
| 3453 | 3453 |
| 3454 TEST(LayerTreeHostCommonTest, verifyLayerTransformsInHighDPI) | 3454 TEST(LayerTreeHostCommonTest, verifyLayerTransformsInHighDPI) |
| 3455 { | 3455 { |
| 3456 // Verify draw and screen space transforms of layers not in a surface. | 3456 // Verify draw and screen space transforms of layers not in a surface. |
| 3457 MockContentLayerClient delegate; | 3457 MockContentLayerClient delegate; |
| 3458 WebTransformationMatrix identityMatrix; | 3458 WebTransformationMatrix identityMatrix; |
| 3459 | 3459 |
| 3460 scoped_refptr<ContentLayer> parent = createDrawableContentLayer(&delegate); | 3460 scoped_refptr<ContentLayer> parent = createDrawableContentLayer(&delegate); |
| 3461 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), true); | 3461 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), true); |
| 3462 | 3462 |
| 3463 scoped_refptr<ContentLayer> child = createDrawableContentLayer(&delegate); | 3463 scoped_refptr<ContentLayer> child = createDrawableContentLayer(&delegate); |
| 3464 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(2, 2), IntSize(10, 10), true); | 3464 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(2, 2), gfx::Size(10, 10), true); |
| 3465 | 3465 |
| 3466 scoped_refptr<NoScaleContentLayer> childNoScale = createNoScaleDrawableConte
ntLayer(&delegate); | 3466 scoped_refptr<NoScaleContentLayer> childNoScale = createNoScaleDrawableConte
ntLayer(&delegate); |
| 3467 setLayerPropertiesForTesting(childNoScale.get(), identityMatrix, identityMat
rix, FloatPoint(0, 0), FloatPoint(2, 2), IntSize(10, 10), true); | 3467 setLayerPropertiesForTesting(childNoScale.get(), identityMatrix, identityMat
rix, gfx::PointF(0, 0), gfx::PointF(2, 2), gfx::Size(10, 10), true); |
| 3468 | 3468 |
| 3469 parent->addChild(child); | 3469 parent->addChild(child); |
| 3470 parent->addChild(childNoScale); | 3470 parent->addChild(childNoScale); |
| 3471 | 3471 |
| 3472 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; | 3472 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 3473 int dummyMaxTextureSize = 512; | 3473 int dummyMaxTextureSize = 512; |
| 3474 | 3474 |
| 3475 const double deviceScaleFactor = 2.5; | 3475 const double deviceScaleFactor = 2.5; |
| 3476 const double pageScaleFactor = 1; | 3476 const double pageScaleFactor = 1; |
| 3477 | 3477 |
| 3478 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
deviceScaleFactor, pageScaleFactor, dummyMaxTextureSize, renderSurfaceLayerList
); | 3478 LayerTreeHostCommon::calculateDrawTransforms(parent.get(), parent->bounds(),
deviceScaleFactor, pageScaleFactor, dummyMaxTextureSize, renderSurfaceLayerList
); |
| 3479 | 3479 |
| 3480 EXPECT_EQ(deviceScaleFactor * pageScaleFactor, parent->contentsScale()); | 3480 EXPECT_EQ(deviceScaleFactor * pageScaleFactor, parent->contentsScale()); |
| 3481 EXPECT_EQ(deviceScaleFactor * pageScaleFactor, child->contentsScale()); | 3481 EXPECT_EQ(deviceScaleFactor * pageScaleFactor, child->contentsScale()); |
| 3482 EXPECT_EQ(1, childNoScale->contentsScale()); | 3482 EXPECT_EQ(1, childNoScale->contentsScale()); |
| 3483 | 3483 |
| 3484 EXPECT_EQ(1u, renderSurfaceLayerList.size()); | 3484 EXPECT_EQ(1u, renderSurfaceLayerList.size()); |
| 3485 | 3485 |
| 3486 // Verify parent transforms | 3486 // Verify parent transforms |
| 3487 WebTransformationMatrix expectedParentTransform; | 3487 WebTransformationMatrix expectedParentTransform; |
| 3488 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedParentTransform, parent->screenSpace
Transform()); | 3488 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedParentTransform, parent->screenSpace
Transform()); |
| 3489 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedParentTransform, parent->drawTransfo
rm()); | 3489 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedParentTransform, parent->drawTransfo
rm()); |
| 3490 | 3490 |
| 3491 // Verify results of transformed parent rects | 3491 // Verify results of transformed parent rects |
| 3492 FloatRect parentContentBounds(FloatPoint(), FloatSize(parent->contentBounds(
))); | 3492 gfx::RectF parentContentBounds(gfx::PointF(), gfx::SizeF(parent->contentBoun
ds())); |
| 3493 | 3493 |
| 3494 FloatRect parentDrawRect = MathUtil::mapClippedRect(parent->drawTransform(),
parentContentBounds); | 3494 gfx::RectF parentDrawRect = MathUtil::mapClippedRect(parent->drawTransform()
, parentContentBounds); |
| 3495 FloatRect parentScreenSpaceRect = MathUtil::mapClippedRect(parent->screenSpa
ceTransform(), parentContentBounds); | 3495 gfx::RectF parentScreenSpaceRect = MathUtil::mapClippedRect(parent->screenSp
aceTransform(), parentContentBounds); |
| 3496 | 3496 |
| 3497 FloatRect expectedParentDrawRect(FloatPoint(), parent->bounds()); | 3497 gfx::RectF expectedParentDrawRect(gfx::PointF(), parent->bounds()); |
| 3498 expectedParentDrawRect.scale(deviceScaleFactor); | 3498 expectedParentDrawRect.Scale(deviceScaleFactor); |
| 3499 EXPECT_FLOAT_RECT_EQ(expectedParentDrawRect, parentDrawRect); | 3499 EXPECT_FLOAT_RECT_EQ(expectedParentDrawRect, parentDrawRect); |
| 3500 EXPECT_FLOAT_RECT_EQ(expectedParentDrawRect, parentScreenSpaceRect); | 3500 EXPECT_FLOAT_RECT_EQ(expectedParentDrawRect, parentScreenSpaceRect); |
| 3501 | 3501 |
| 3502 // Verify child transforms | 3502 // Verify child transforms |
| 3503 WebTransformationMatrix expectedChildTransform; | 3503 WebTransformationMatrix expectedChildTransform; |
| 3504 expectedChildTransform.translate(deviceScaleFactor * child->position().x(),
deviceScaleFactor * child->position().y()); | 3504 expectedChildTransform.translate(deviceScaleFactor * child->position().x(),
deviceScaleFactor * child->position().y()); |
| 3505 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedChildTransform, child->drawTransform
()); | 3505 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedChildTransform, child->drawTransform
()); |
| 3506 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedChildTransform, child->screenSpaceTr
ansform()); | 3506 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedChildTransform, child->screenSpaceTr
ansform()); |
| 3507 | 3507 |
| 3508 // Verify results of transformed child rects | 3508 // Verify results of transformed child rects |
| 3509 FloatRect childContentBounds(FloatPoint(), FloatSize(child->contentBounds())
); | 3509 gfx::RectF childContentBounds(gfx::PointF(), gfx::SizeF(child->contentBounds
())); |
| 3510 | 3510 |
| 3511 FloatRect childDrawRect = MathUtil::mapClippedRect(child->drawTransform(), c
hildContentBounds); | 3511 gfx::RectF childDrawRect = MathUtil::mapClippedRect(child->drawTransform(),
childContentBounds); |
| 3512 FloatRect childScreenSpaceRect = MathUtil::mapClippedRect(child->screenSpace
Transform(), childContentBounds); | 3512 gfx::RectF childScreenSpaceRect = MathUtil::mapClippedRect(child->screenSpac
eTransform(), childContentBounds); |
| 3513 | 3513 |
| 3514 FloatRect expectedChildDrawRect(FloatPoint(), child->bounds()); | 3514 gfx::RectF expectedChildDrawRect(gfx::PointF(), child->bounds()); |
| 3515 expectedChildDrawRect.move(child->position().x(), child->position().y()); | 3515 expectedChildDrawRect.Offset(child->position().x(), child->position().y()); |
| 3516 expectedChildDrawRect.scale(deviceScaleFactor); | 3516 expectedChildDrawRect.Scale(deviceScaleFactor); |
| 3517 EXPECT_FLOAT_RECT_EQ(expectedChildDrawRect, childDrawRect); | 3517 EXPECT_FLOAT_RECT_EQ(expectedChildDrawRect, childDrawRect); |
| 3518 EXPECT_FLOAT_RECT_EQ(expectedChildDrawRect, childScreenSpaceRect); | 3518 EXPECT_FLOAT_RECT_EQ(expectedChildDrawRect, childScreenSpaceRect); |
| 3519 | 3519 |
| 3520 // Verify childNoScale transforms | 3520 // Verify childNoScale transforms |
| 3521 WebTransformationMatrix expectedChildNoScaleTransform = child->drawTransform
(); | 3521 WebTransformationMatrix expectedChildNoScaleTransform = child->drawTransform
(); |
| 3522 // All transforms operate on content rects. The child's content rect | 3522 // All transforms operate on content rects. The child's content rect |
| 3523 // incorporates device scale, but the childNoScale does not; add it here. | 3523 // incorporates device scale, but the childNoScale does not; add it here. |
| 3524 expectedChildNoScaleTransform.scale(deviceScaleFactor); | 3524 expectedChildNoScaleTransform.scale(deviceScaleFactor); |
| 3525 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedChildNoScaleTransform, childNoScale-
>drawTransform()); | 3525 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedChildNoScaleTransform, childNoScale-
>drawTransform()); |
| 3526 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedChildNoScaleTransform, childNoScale-
>screenSpaceTransform()); | 3526 EXPECT_TRANSFORMATION_MATRIX_EQ(expectedChildNoScaleTransform, childNoScale-
>screenSpaceTransform()); |
| 3527 } | 3527 } |
| 3528 | 3528 |
| 3529 TEST(LayerTreeHostCommonTest, verifyContentsScale) | 3529 TEST(LayerTreeHostCommonTest, verifyContentsScale) |
| 3530 { | 3530 { |
| 3531 MockContentLayerClient delegate; | 3531 MockContentLayerClient delegate; |
| 3532 WebTransformationMatrix identityMatrix; | 3532 WebTransformationMatrix identityMatrix; |
| 3533 | 3533 |
| 3534 WebTransformationMatrix parentScaleMatrix; | 3534 WebTransformationMatrix parentScaleMatrix; |
| 3535 const double initialParentScale = 1.75; | 3535 const double initialParentScale = 1.75; |
| 3536 parentScaleMatrix.scale(initialParentScale); | 3536 parentScaleMatrix.scale(initialParentScale); |
| 3537 | 3537 |
| 3538 WebTransformationMatrix childScaleMatrix; | 3538 WebTransformationMatrix childScaleMatrix; |
| 3539 const double initialChildScale = 1.25; | 3539 const double initialChildScale = 1.25; |
| 3540 childScaleMatrix.scale(initialChildScale); | 3540 childScaleMatrix.scale(initialChildScale); |
| 3541 | 3541 |
| 3542 float fixedRasterScale = 2.5; | 3542 float fixedRasterScale = 2.5; |
| 3543 | 3543 |
| 3544 scoped_refptr<ContentLayer> parent = createDrawableContentLayer(&delegate); | 3544 scoped_refptr<ContentLayer> parent = createDrawableContentLayer(&delegate); |
| 3545 setLayerPropertiesForTesting(parent.get(), parentScaleMatrix, identityMatrix
, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), true); | 3545 setLayerPropertiesForTesting(parent.get(), parentScaleMatrix, identityMatrix
, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), true); |
| 3546 | 3546 |
| 3547 scoped_refptr<ContentLayer> childScale = createDrawableContentLayer(&delegat
e); | 3547 scoped_refptr<ContentLayer> childScale = createDrawableContentLayer(&delegat
e); |
| 3548 setLayerPropertiesForTesting(childScale.get(), childScaleMatrix, identityMat
rix, FloatPoint(0, 0), FloatPoint(2, 2), IntSize(10, 10), true); | 3548 setLayerPropertiesForTesting(childScale.get(), childScaleMatrix, identityMat
rix, gfx::PointF(0, 0), gfx::PointF(2, 2), gfx::Size(10, 10), true); |
| 3549 | 3549 |
| 3550 scoped_refptr<NoScaleContentLayer> childNoScale = createNoScaleDrawableConte
ntLayer(&delegate); | 3550 scoped_refptr<NoScaleContentLayer> childNoScale = createNoScaleDrawableConte
ntLayer(&delegate); |
| 3551 setLayerPropertiesForTesting(childNoScale.get(), childScaleMatrix, identityM
atrix, FloatPoint(0, 0), FloatPoint(12, 12), IntSize(10, 10), true); | 3551 setLayerPropertiesForTesting(childNoScale.get(), childScaleMatrix, identityM
atrix, gfx::PointF(0, 0), gfx::PointF(12, 12), gfx::Size(10, 10), true); |
| 3552 | 3552 |
| 3553 scoped_refptr<ContentLayer> childNoAutoScale = createDrawableContentLayer(&d
elegate); | 3553 scoped_refptr<ContentLayer> childNoAutoScale = createDrawableContentLayer(&d
elegate); |
| 3554 setLayerPropertiesForTesting(childNoAutoScale.get(), childScaleMatrix, ident
ityMatrix, FloatPoint(0, 0), FloatPoint(22, 22), IntSize(10, 10), true); | 3554 setLayerPropertiesForTesting(childNoAutoScale.get(), childScaleMatrix, ident
ityMatrix, gfx::PointF(0, 0), gfx::PointF(22, 22), gfx::Size(10, 10), true); |
| 3555 childNoAutoScale->setAutomaticallyComputeRasterScale(false); | 3555 childNoAutoScale->setAutomaticallyComputeRasterScale(false); |
| 3556 childNoAutoScale->setRasterScale(fixedRasterScale); | 3556 childNoAutoScale->setRasterScale(fixedRasterScale); |
| 3557 | 3557 |
| 3558 // FIXME: Remove this when pageScaleFactor is applied in the compositor. | 3558 // FIXME: Remove this when pageScaleFactor is applied in the compositor. |
| 3559 // Page scale should not apply to the parent. | 3559 // Page scale should not apply to the parent. |
| 3560 parent->setBoundsContainPageScale(true); | 3560 parent->setBoundsContainPageScale(true); |
| 3561 | 3561 |
| 3562 parent->addChild(childScale); | 3562 parent->addChild(childScale); |
| 3563 parent->addChild(childNoScale); | 3563 parent->addChild(childNoScale); |
| 3564 parent->addChild(childNoAutoScale); | 3564 parent->addChild(childNoAutoScale); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3630 const double initialParentScale = 2; | 3630 const double initialParentScale = 2; |
| 3631 parentScaleMatrix.scale(initialParentScale); | 3631 parentScaleMatrix.scale(initialParentScale); |
| 3632 | 3632 |
| 3633 WebTransformationMatrix childScaleMatrix; | 3633 WebTransformationMatrix childScaleMatrix; |
| 3634 const double initialChildScale = 3; | 3634 const double initialChildScale = 3; |
| 3635 childScaleMatrix.scale(initialChildScale); | 3635 childScaleMatrix.scale(initialChildScale); |
| 3636 | 3636 |
| 3637 float fixedRasterScale = 4; | 3637 float fixedRasterScale = 4; |
| 3638 | 3638 |
| 3639 scoped_refptr<ContentLayer> parent = createDrawableContentLayer(&delegate); | 3639 scoped_refptr<ContentLayer> parent = createDrawableContentLayer(&delegate); |
| 3640 setLayerPropertiesForTesting(parent.get(), parentScaleMatrix, identityMatrix
, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(100, 100), true); | 3640 setLayerPropertiesForTesting(parent.get(), parentScaleMatrix, identityMatrix
, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(100, 100), true); |
| 3641 | 3641 |
| 3642 scoped_refptr<ContentLayer> surfaceScale = createDrawableContentLayer(&deleg
ate); | 3642 scoped_refptr<ContentLayer> surfaceScale = createDrawableContentLayer(&deleg
ate); |
| 3643 setLayerPropertiesForTesting(surfaceScale.get(), childScaleMatrix, identityM
atrix, FloatPoint(0, 0), FloatPoint(2, 2), IntSize(10, 10), true); | 3643 setLayerPropertiesForTesting(surfaceScale.get(), childScaleMatrix, identityM
atrix, gfx::PointF(0, 0), gfx::PointF(2, 2), gfx::Size(10, 10), true); |
| 3644 | 3644 |
| 3645 scoped_refptr<ContentLayer> surfaceScaleChildScale = createDrawableContentLa
yer(&delegate); | 3645 scoped_refptr<ContentLayer> surfaceScaleChildScale = createDrawableContentLa
yer(&delegate); |
| 3646 setLayerPropertiesForTesting(surfaceScaleChildScale.get(), childScaleMatrix,
identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 10), true); | 3646 setLayerPropertiesForTesting(surfaceScaleChildScale.get(), childScaleMatrix,
identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 10), true); |
| 3647 | 3647 |
| 3648 scoped_refptr<NoScaleContentLayer> surfaceScaleChildNoScale = createNoScaleD
rawableContentLayer(&delegate); | 3648 scoped_refptr<NoScaleContentLayer> surfaceScaleChildNoScale = createNoScaleD
rawableContentLayer(&delegate); |
| 3649 setLayerPropertiesForTesting(surfaceScaleChildNoScale.get(), childScaleMatri
x, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 10), true); | 3649 setLayerPropertiesForTesting(surfaceScaleChildNoScale.get(), childScaleMatri
x, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 10), true
); |
| 3650 | 3650 |
| 3651 scoped_refptr<NoScaleContentLayer> surfaceNoScale = createNoScaleDrawableCon
tentLayer(&delegate); | 3651 scoped_refptr<NoScaleContentLayer> surfaceNoScale = createNoScaleDrawableCon
tentLayer(&delegate); |
| 3652 setLayerPropertiesForTesting(surfaceNoScale.get(), childScaleMatrix, identit
yMatrix, FloatPoint(0, 0), FloatPoint(12, 12), IntSize(10, 10), true); | 3652 setLayerPropertiesForTesting(surfaceNoScale.get(), childScaleMatrix, identit
yMatrix, gfx::PointF(0, 0), gfx::PointF(12, 12), gfx::Size(10, 10), true); |
| 3653 | 3653 |
| 3654 scoped_refptr<ContentLayer> surfaceNoScaleChildScale = createDrawableContent
Layer(&delegate); | 3654 scoped_refptr<ContentLayer> surfaceNoScaleChildScale = createDrawableContent
Layer(&delegate); |
| 3655 setLayerPropertiesForTesting(surfaceNoScaleChildScale.get(), childScaleMatri
x, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 10), true); | 3655 setLayerPropertiesForTesting(surfaceNoScaleChildScale.get(), childScaleMatri
x, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 10), true
); |
| 3656 | 3656 |
| 3657 scoped_refptr<NoScaleContentLayer> surfaceNoScaleChildNoScale = createNoScal
eDrawableContentLayer(&delegate); | 3657 scoped_refptr<NoScaleContentLayer> surfaceNoScaleChildNoScale = createNoScal
eDrawableContentLayer(&delegate); |
| 3658 setLayerPropertiesForTesting(surfaceNoScaleChildNoScale.get(), childScaleMat
rix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 10), true); | 3658 setLayerPropertiesForTesting(surfaceNoScaleChildNoScale.get(), childScaleMat
rix, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 10), tr
ue); |
| 3659 | 3659 |
| 3660 scoped_refptr<ContentLayer> surfaceNoAutoScale = createDrawableContentLayer(
&delegate); | 3660 scoped_refptr<ContentLayer> surfaceNoAutoScale = createDrawableContentLayer(
&delegate); |
| 3661 setLayerPropertiesForTesting(surfaceNoAutoScale.get(), childScaleMatrix, ide
ntityMatrix, FloatPoint(0, 0), FloatPoint(22, 22), IntSize(10, 10), true); | 3661 setLayerPropertiesForTesting(surfaceNoAutoScale.get(), childScaleMatrix, ide
ntityMatrix, gfx::PointF(0, 0), gfx::PointF(22, 22), gfx::Size(10, 10), true); |
| 3662 surfaceNoAutoScale->setAutomaticallyComputeRasterScale(false); | 3662 surfaceNoAutoScale->setAutomaticallyComputeRasterScale(false); |
| 3663 surfaceNoAutoScale->setRasterScale(fixedRasterScale); | 3663 surfaceNoAutoScale->setRasterScale(fixedRasterScale); |
| 3664 | 3664 |
| 3665 scoped_refptr<ContentLayer> surfaceNoAutoScaleChildScale = createDrawableCon
tentLayer(&delegate); | 3665 scoped_refptr<ContentLayer> surfaceNoAutoScaleChildScale = createDrawableCon
tentLayer(&delegate); |
| 3666 setLayerPropertiesForTesting(surfaceNoAutoScaleChildScale.get(), childScaleM
atrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 10), true
); | 3666 setLayerPropertiesForTesting(surfaceNoAutoScaleChildScale.get(), childScaleM
atrix, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 10),
true); |
| 3667 | 3667 |
| 3668 scoped_refptr<NoScaleContentLayer> surfaceNoAutoScaleChildNoScale = createNo
ScaleDrawableContentLayer(&delegate); | 3668 scoped_refptr<NoScaleContentLayer> surfaceNoAutoScaleChildNoScale = createNo
ScaleDrawableContentLayer(&delegate); |
| 3669 setLayerPropertiesForTesting(surfaceNoAutoScaleChildNoScale.get(), childScal
eMatrix, identityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 10), tr
ue); | 3669 setLayerPropertiesForTesting(surfaceNoAutoScaleChildNoScale.get(), childScal
eMatrix, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 10)
, true); |
| 3670 | 3670 |
| 3671 // FIXME: Remove this when pageScaleFactor is applied in the compositor. | 3671 // FIXME: Remove this when pageScaleFactor is applied in the compositor. |
| 3672 // Page scale should not apply to the parent. | 3672 // Page scale should not apply to the parent. |
| 3673 parent->setBoundsContainPageScale(true); | 3673 parent->setBoundsContainPageScale(true); |
| 3674 | 3674 |
| 3675 parent->addChild(surfaceScale); | 3675 parent->addChild(surfaceScale); |
| 3676 parent->addChild(surfaceNoScale); | 3676 parent->addChild(surfaceNoScale); |
| 3677 parent->addChild(surfaceNoAutoScale); | 3677 parent->addChild(surfaceNoAutoScale); |
| 3678 | 3678 |
| 3679 surfaceScale->setForceRenderSurface(true); | 3679 surfaceScale->setForceRenderSurface(true); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3765 EXPECT_FLOAT_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * i
nitialChildScale * initialChildScale, surfaceNoAutoScaleChildNoScale->drawTransf
orm().m11()); | 3765 EXPECT_FLOAT_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * i
nitialChildScale * initialChildScale, surfaceNoAutoScaleChildNoScale->drawTransf
orm().m11()); |
| 3766 EXPECT_FLOAT_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * i
nitialChildScale * initialChildScale, surfaceNoAutoScaleChildNoScale->drawTransf
orm().m22()); | 3766 EXPECT_FLOAT_EQ(deviceScaleFactor * pageScaleFactor * initialParentScale * i
nitialChildScale * initialChildScale, surfaceNoAutoScaleChildNoScale->drawTransf
orm().m22()); |
| 3767 } | 3767 } |
| 3768 | 3768 |
| 3769 TEST(LayerTreeHostCommonTest, verifyRenderSurfaceTransformsInHighDPI) | 3769 TEST(LayerTreeHostCommonTest, verifyRenderSurfaceTransformsInHighDPI) |
| 3770 { | 3770 { |
| 3771 MockContentLayerClient delegate; | 3771 MockContentLayerClient delegate; |
| 3772 WebTransformationMatrix identityMatrix; | 3772 WebTransformationMatrix identityMatrix; |
| 3773 | 3773 |
| 3774 scoped_refptr<ContentLayer> parent = createDrawableContentLayer(&delegate); | 3774 scoped_refptr<ContentLayer> parent = createDrawableContentLayer(&delegate); |
| 3775 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, F
loatPoint(0, 0), FloatPoint(0, 0), IntSize(30, 30), true); | 3775 setLayerPropertiesForTesting(parent.get(), identityMatrix, identityMatrix, g
fx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(30, 30), true); |
| 3776 | 3776 |
| 3777 scoped_refptr<ContentLayer> child = createDrawableContentLayer(&delegate); | 3777 scoped_refptr<ContentLayer> child = createDrawableContentLayer(&delegate); |
| 3778 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, Fl
oatPoint(0, 0), FloatPoint(2, 2), IntSize(10, 10), true); | 3778 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, gf
x::PointF(0, 0), gfx::PointF(2, 2), gfx::Size(10, 10), true); |
| 3779 | 3779 |
| 3780 WebTransformationMatrix replicaTransform; | 3780 WebTransformationMatrix replicaTransform; |
| 3781 replicaTransform.scaleNonUniform(1, -1); | 3781 replicaTransform.scaleNonUniform(1, -1); |
| 3782 scoped_refptr<ContentLayer> replica = createDrawableContentLayer(&delegate); | 3782 scoped_refptr<ContentLayer> replica = createDrawableContentLayer(&delegate); |
| 3783 setLayerPropertiesForTesting(replica.get(), replicaTransform, identityMatrix
, FloatPoint(0, 0), FloatPoint(2, 2), IntSize(10, 10), true); | 3783 setLayerPropertiesForTesting(replica.get(), replicaTransform, identityMatrix
, gfx::PointF(0, 0), gfx::PointF(2, 2), gfx::Size(10, 10), true); |
| 3784 | 3784 |
| 3785 // This layer should end up in the same surface as child, with the same draw | 3785 // This layer should end up in the same surface as child, with the same draw |
| 3786 // and screen space transforms. | 3786 // and screen space transforms. |
| 3787 scoped_refptr<ContentLayer> duplicateChildNonOwner = createDrawableContentLa
yer(&delegate); | 3787 scoped_refptr<ContentLayer> duplicateChildNonOwner = createDrawableContentLa
yer(&delegate); |
| 3788 setLayerPropertiesForTesting(duplicateChildNonOwner.get(), identityMatrix, i
dentityMatrix, FloatPoint(0, 0), FloatPoint(0, 0), IntSize(10, 10), true); | 3788 setLayerPropertiesForTesting(duplicateChildNonOwner.get(), identityMatrix, i
dentityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 10), true); |
| 3789 | 3789 |
| 3790 parent->addChild(child); | 3790 parent->addChild(child); |
| 3791 child->addChild(duplicateChildNonOwner); | 3791 child->addChild(duplicateChildNonOwner); |
| 3792 child->setReplicaLayer(replica.get()); | 3792 child->setReplicaLayer(replica.get()); |
| 3793 | 3793 |
| 3794 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; | 3794 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 3795 int dummyMaxTextureSize = 512; | 3795 int dummyMaxTextureSize = 512; |
| 3796 | 3796 |
| 3797 const double deviceScaleFactor = 1.5; | 3797 const double deviceScaleFactor = 1.5; |
| 3798 parent->setContentsScale(deviceScaleFactor); | 3798 parent->setContentsScale(deviceScaleFactor); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3864 int nonexistentId = -1; | 3864 int nonexistentId = -1; |
| 3865 EXPECT_EQ(root, LayerTreeHostCommon::findLayerInSubtree(root.get(), root->id
())); | 3865 EXPECT_EQ(root, LayerTreeHostCommon::findLayerInSubtree(root.get(), root->id
())); |
| 3866 EXPECT_EQ(child, LayerTreeHostCommon::findLayerInSubtree(root.get(), child->
id())); | 3866 EXPECT_EQ(child, LayerTreeHostCommon::findLayerInSubtree(root.get(), child->
id())); |
| 3867 EXPECT_EQ(grandChild, LayerTreeHostCommon::findLayerInSubtree(root.get(), gr
andChild->id())); | 3867 EXPECT_EQ(grandChild, LayerTreeHostCommon::findLayerInSubtree(root.get(), gr
andChild->id())); |
| 3868 EXPECT_EQ(maskLayer, LayerTreeHostCommon::findLayerInSubtree(root.get(), mas
kLayer->id())); | 3868 EXPECT_EQ(maskLayer, LayerTreeHostCommon::findLayerInSubtree(root.get(), mas
kLayer->id())); |
| 3869 EXPECT_EQ(replicaLayer, LayerTreeHostCommon::findLayerInSubtree(root.get(),
replicaLayer->id())); | 3869 EXPECT_EQ(replicaLayer, LayerTreeHostCommon::findLayerInSubtree(root.get(),
replicaLayer->id())); |
| 3870 EXPECT_EQ(0, LayerTreeHostCommon::findLayerInSubtree(root.get(), nonexistent
Id)); | 3870 EXPECT_EQ(0, LayerTreeHostCommon::findLayerInSubtree(root.get(), nonexistent
Id)); |
| 3871 } | 3871 } |
| 3872 | 3872 |
| 3873 } // namespace | 3873 } // namespace |
| OLD | NEW |