Chromium Code Reviews| Index: webkit/compositor_bindings/web_layer_impl_fixed_bounds_unittest.cc |
| diff --git a/webkit/compositor_bindings/web_layer_impl_fixed_bounds_unittest.cc b/webkit/compositor_bindings/web_layer_impl_fixed_bounds_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e607c5ebcfc3599f484f4232171b3b9713a8aeaf |
| --- /dev/null |
| +++ b/webkit/compositor_bindings/web_layer_impl_fixed_bounds_unittest.cc |
| @@ -0,0 +1,169 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "cc/layer_tree_host_common.h" |
| +#include "cc/picture_image_layer.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| +#include "third_party/WebKit/Source/Platform/chromium/public/WebFloatPoint.h" |
| +#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" |
| +#include "third_party/WebKit/Source/Platform/chromium/public/WebTransformationMatrix.h" |
| +#include "third_party/skia/include/utils/SkMatrix44.h" |
| +#include "ui/gfx/point3_f.h" |
| +#include "webkit/compositor_bindings/web_layer_impl_fixed_bounds.h" |
| + |
| +using namespace WebKit; |
| + |
| +TEST(WebLayerImplFixedBoundsTest, IdentityBounds) |
| +{ |
| + scoped_ptr<WebLayerImplFixedBounds> layer(new WebLayerImplFixedBounds()); |
| + layer->setAnchorPoint(WebFloatPoint(0, 0)); |
| + layer->setFixedBounds(gfx::Size(100, 100)); |
| + layer->setBounds(WebSize(100, 100)); |
| + EXPECT_EQ(WebSize(100, 100), layer->bounds()); |
| + EXPECT_EQ(gfx::Size(100, 100), layer->layer()->bounds()); |
| + EXPECT_EQ(gfx::Transform(), layer->layer()->transform()); |
| +} |
| + |
| +#define EXPECT_POINT3F_EQ(p1, p2) \ |
|
enne (OOO)
2013/02/22 23:53:32
Can you put these in geometry_test_utils.h?
Xianzhu
2013/02/23 00:56:19
Done.
|
| + EXPECT_FLOAT_EQ((p1).x(), (p2).x()); \ |
| + EXPECT_FLOAT_EQ((p1).y(), (p2).y()); \ |
| + EXPECT_FLOAT_EQ((p1).z(), (p2).z()); |
| + |
| +#define EXPECT_RECTF_EQ(r1, r2) \ |
| + EXPECT_FLOAT_EQ((r1).x(), (r2).x()); \ |
| + EXPECT_FLOAT_EQ((r1).y(), (r2).y()); \ |
| + EXPECT_FLOAT_EQ((r1).width(), (r2).width()); \ |
| + EXPECT_FLOAT_EQ((r1).height(), (r2).height()); |
| + |
| +gfx::Point3F transformPoint(const gfx::Transform& transform, const gfx::Point3F& point) |
|
enne (OOO)
2013/02/22 23:53:32
style nits:
80 columns everywhere in this file, p
Xianzhu
2013/02/23 00:05:20
I thought all files under the directory should fol
Xianzhu
2013/02/23 00:56:19
Converted this file into Chromium style.
Still ke
enne (OOO)
2013/02/23 01:10:55
As jamesr says, new code should be Chromium style,
|
| +{ |
| + gfx::Point3F result = point; |
| + transform.TransformPoint(result); |
| + return result; |
| +} |
| + |
| +void checkBoundsScaleSimple(WebLayerImplFixedBounds* layer, |
| + const WebSize& bounds, |
| + const gfx::Size& fixedBounds) |
| +{ |
| + layer->setBounds(bounds); |
| + layer->setFixedBounds(fixedBounds); |
| + |
| + EXPECT_EQ(bounds, layer->bounds()); |
| + EXPECT_EQ(fixedBounds, layer->layer()->bounds()); |
| + EXPECT_TRUE(layer->transform().isIdentity()); |
| + EXPECT_TRUE(layer->sublayerTransform().isIdentity()); |
| + |
| + // An arbitrary point to check the scale and transforms. |
| + gfx::Point3F originalPoint(10, 20, 1); |
| + gfx::Point3F scaledPoint(originalPoint.x() * bounds.width / fixedBounds.width(), |
| + originalPoint.y() * bounds.height / fixedBounds.height(), |
| + originalPoint.z()); |
| + // Test if the bounds scale is correctly applied in transform and sublayerTransform. |
| + EXPECT_POINT3F_EQ(scaledPoint, transformPoint(layer->layer()->transform(), originalPoint)); |
| + EXPECT_POINT3F_EQ(originalPoint, transformPoint(layer->layer()->sublayerTransform(), scaledPoint)); |
| +} |
| + |
| +TEST(WebLayerImplFixedBoundsTest, BoundsScaleSimple) |
| +{ |
| + scoped_ptr<WebLayerImplFixedBounds> layer(new WebLayerImplFixedBounds()); |
| + layer->setAnchorPoint(WebFloatPoint(0, 0)); |
| + // All numbers below are arbitrary values that should not affect the results. |
| + checkBoundsScaleSimple(layer.get(), WebSize(100, 200), gfx::Size(150, 250)); |
| + // Change fixedBounds. |
| + checkBoundsScaleSimple(layer.get(), WebSize(100, 200), gfx::Size(75, 100)); |
| + // Change bounds. |
| + checkBoundsScaleSimple(layer.get(), WebSize(300, 100), gfx::Size(75, 100)); |
| +} |
| + |
| +void compareToWebLayerImpl(const WebFloatPoint& anchorPoint, |
|
enne (OOO)
2013/02/22 23:53:32
This function is great. That's exactly what I was
|
| + const gfx::Transform& transform, |
| + const gfx::Transform& sublayerTransform) |
| +{ |
| + const gfx::Size deviceViewportSize(800, 600); |
| + const float deviceScaleFactor = 1.f; // 2.f; |
| + const float pageScaleFactor = 1.f; // 1.5f; |
| + const int maxTextureSize = 512; |
| + |
| + WebSize bounds(100, 100); // (150, 200); |
| + WebFloatPoint position(20, 30); |
| + WebSize sublayerBounds(88, 99); |
| + WebFloatPoint sublayerPosition(50, 60); |
| + gfx::Size fixedBounds(200, 200); // (160, 70); |
|
enne (OOO)
2013/02/22 23:53:32
Are these debug comments that should be removed?
Xianzhu
2013/02/23 00:56:19
Done.
|
| + |
| + scoped_ptr<WebLayerImplFixedBounds> rootLayer(new WebLayerImplFixedBounds()); |
| + |
| + WebLayerImplFixedBounds* fixedBoundsLayer = new WebLayerImplFixedBounds(cc::PictureImageLayer::create()); |
| + WebLayerImpl* sublayerUnderFixedBoundsLayer = new WebLayerImpl(); |
| + sublayerUnderFixedBoundsLayer->setBounds(sublayerBounds); |
| + sublayerUnderFixedBoundsLayer->setPosition(sublayerPosition); |
| + sublayerUnderFixedBoundsLayer->setDebugName("sublayerUnderFixedBoundsLayer"); |
| + fixedBoundsLayer->setDebugName("fixedBoundsLayer"); |
| + fixedBoundsLayer->addChild(sublayerUnderFixedBoundsLayer); |
| + fixedBoundsLayer->setBounds(bounds); |
| + fixedBoundsLayer->setFixedBounds(fixedBounds); |
| + fixedBoundsLayer->setAnchorPoint(anchorPoint); |
| + fixedBoundsLayer->setTransform(transform.matrix()); |
| + fixedBoundsLayer->setSublayerTransform(sublayerTransform.matrix()); |
| + fixedBoundsLayer->setPosition(position); |
| + rootLayer->addChild(fixedBoundsLayer); |
| + |
| + WebLayerImpl* normalLayer(new WebLayerImpl(cc::PictureImageLayer::create())); |
| + WebLayerImpl* sublayerUnderNormalLayer = new WebLayerImpl(); |
| + sublayerUnderNormalLayer->setBounds(sublayerBounds); |
| + sublayerUnderNormalLayer->setPosition(sublayerPosition); |
| + sublayerUnderNormalLayer->setDebugName("sublayerUnderNormalLayer"); |
| + normalLayer->setDebugName("normalLayer"); |
| + normalLayer->addChild(sublayerUnderNormalLayer); |
| + normalLayer->setBounds(bounds); |
| + normalLayer->setAnchorPoint(anchorPoint); |
| + normalLayer->setTransform(transform.matrix()); |
| + normalLayer->setSublayerTransform(sublayerTransform.matrix()); |
| + normalLayer->setPosition(position); |
| + rootLayer->addChild(normalLayer); |
| + |
| + std::vector<scoped_refptr<cc::Layer> > renderSurfaceLayerList; |
| + cc::LayerTreeHostCommon::calculateDrawProperties(rootLayer->layer(), deviceViewportSize, deviceScaleFactor, pageScaleFactor, maxTextureSize, false, renderSurfaceLayerList); |
| + |
| + gfx::RectF fixedBoundsLayerContentRect(fixedBoundsLayer->layer()->contentBounds()); |
|
enne (OOO)
2013/02/22 23:53:32
Content rects are not guaranteed to be the same.
|
| + fixedBoundsLayer->layer()->drawTransform().TransformRect(&fixedBoundsLayerContentRect); |
| + gfx::RectF normalLayerContentRect(normalLayer->layer()->contentBounds()); |
| + normalLayer->layer()->drawTransform().TransformRect(&normalLayerContentRect); |
|
enne (OOO)
2013/02/22 23:55:44
Oh, scratch my previous comment. Can you not name
Xianzhu
2013/02/23 00:56:19
Done.
|
| + EXPECT_RECTF_EQ(fixedBoundsLayerContentRect, normalLayerContentRect); |
| + |
| + gfx::RectF subLayerUnderFixedBoundsLayerContentRect(sublayerUnderFixedBoundsLayer->layer()->contentBounds()); |
| + sublayerUnderFixedBoundsLayer->layer()->drawTransform().TransformRect(&subLayerUnderFixedBoundsLayerContentRect); |
| + gfx::RectF subLayerUnderNormalLayerContentRect(sublayerUnderNormalLayer->layer()->contentBounds()); |
| + sublayerUnderNormalLayer->layer()->drawTransform().TransformRect(&subLayerUnderNormalLayerContentRect); |
| + EXPECT_RECTF_EQ(subLayerUnderFixedBoundsLayerContentRect, subLayerUnderNormalLayerContentRect); |
| +} |
| + |
| +// A black box test that ensures WebLayerImplFixedBounds won't change final layer geometries. |
| +// Simple case: identity transforms and zero anchor point. |
| +TEST(WebLayerImplFixedBoundsTest, CompareToWebLayerImplSimple) |
| +{ |
| + compareToWebLayerImpl(WebFloatPoint(0, 0), gfx::Transform(), gfx::Transform()); |
| +} |
| + |
| +// A black box test that ensures WebLayerImplFixedBounds won't change final layer geometries. |
| +// Complex case: complex transforms and non-zero anchor point. |
| +TEST(WebLayerImplFixedBoundsTest, CompareToWebLayerImplComplex) |
| +{ |
| + gfx::Transform transform; |
| + // These are arbitrary values that should not affect the results. |
| + transform.Translate3d(50, 60, 70); |
| + transform.Scale3d(1, 1, 1); |
| + transform.RotateAbout(gfx::Vector3dF(33, 44, 55), 99); |
| + |
| + gfx::Transform sublayerTransform; |
| + // These are arbitrary values that should not affect the results. |
| + sublayerTransform.Scale3d(1, 2, 1);// (1.1, 2.2, 3.3); |
| + sublayerTransform.Translate3d(11, 22, 33); |
| + sublayerTransform.RotateAbout(gfx::Vector3dF(10, 30, 20), 88); |
| + |
| + compareToWebLayerImpl(WebFloatPoint(0, 0), transform, sublayerTransform); |
| + |
| + // With non-zero anchor point, WebLayerImplFixedBounds will fall back to WebLayerImpl. |
| + compareToWebLayerImpl(WebFloatPoint(0.4, 0.6), transform, sublayerTransform); |
| +} |