| Index: cc/animation/transform_operations_unittest.cc
|
| diff --git a/cc/animation/transform_operations_unittest.cc b/cc/animation/transform_operations_unittest.cc
|
| deleted file mode 100644
|
| index 7aae696db4c15d8ba3bba8c549d7c8ca59a02b92..0000000000000000000000000000000000000000
|
| --- a/cc/animation/transform_operations_unittest.cc
|
| +++ /dev/null
|
| @@ -1,1463 +0,0 @@
|
| -// 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 <limits>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/memory/scoped_vector.h"
|
| -#include "cc/animation/transform_operations.h"
|
| -#include "cc/test/geometry_test_utils.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "ui/gfx/animation/tween.h"
|
| -#include "ui/gfx/geometry/box_f.h"
|
| -#include "ui/gfx/geometry/rect_conversions.h"
|
| -#include "ui/gfx/geometry/vector3d_f.h"
|
| -
|
| -namespace cc {
|
| -namespace {
|
| -
|
| -TEST(TransformOperationTest, TransformTypesAreUnique) {
|
| - ScopedVector<TransformOperations> transforms;
|
| -
|
| - TransformOperations* to_add = new TransformOperations();
|
| - to_add->AppendTranslate(1, 0, 0);
|
| - transforms.push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendRotate(0, 0, 1, 2);
|
| - transforms.push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendScale(2, 2, 2);
|
| - transforms.push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendSkew(1, 0);
|
| - transforms.push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendPerspective(800);
|
| - transforms.push_back(to_add);
|
| -
|
| - for (size_t i = 0; i < transforms.size(); ++i) {
|
| - for (size_t j = 0; j < transforms.size(); ++j) {
|
| - bool matches_type = transforms[i]->MatchesTypes(*transforms[j]);
|
| - EXPECT_TRUE((i == j && matches_type) || !matches_type);
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, MatchTypesSameLength) {
|
| - TransformOperations translates;
|
| - translates.AppendTranslate(1, 0, 0);
|
| - translates.AppendTranslate(1, 0, 0);
|
| - translates.AppendTranslate(1, 0, 0);
|
| -
|
| - TransformOperations skews;
|
| - skews.AppendSkew(0, 2);
|
| - skews.AppendSkew(0, 2);
|
| - skews.AppendSkew(0, 2);
|
| -
|
| - TransformOperations translates2;
|
| - translates2.AppendTranslate(0, 2, 0);
|
| - translates2.AppendTranslate(0, 2, 0);
|
| - translates2.AppendTranslate(0, 2, 0);
|
| -
|
| - TransformOperations translates3 = translates2;
|
| -
|
| - EXPECT_FALSE(translates.MatchesTypes(skews));
|
| - EXPECT_TRUE(translates.MatchesTypes(translates2));
|
| - EXPECT_TRUE(translates.MatchesTypes(translates3));
|
| -}
|
| -
|
| -TEST(TransformOperationTest, MatchTypesDifferentLength) {
|
| - TransformOperations translates;
|
| - translates.AppendTranslate(1, 0, 0);
|
| - translates.AppendTranslate(1, 0, 0);
|
| - translates.AppendTranslate(1, 0, 0);
|
| -
|
| - TransformOperations skews;
|
| - skews.AppendSkew(2, 0);
|
| - skews.AppendSkew(2, 0);
|
| -
|
| - TransformOperations translates2;
|
| - translates2.AppendTranslate(0, 2, 0);
|
| - translates2.AppendTranslate(0, 2, 0);
|
| -
|
| - EXPECT_FALSE(translates.MatchesTypes(skews));
|
| - EXPECT_FALSE(translates.MatchesTypes(translates2));
|
| -}
|
| -
|
| -void GetIdentityOperations(ScopedVector<TransformOperations>* operations) {
|
| - TransformOperations* to_add = new TransformOperations();
|
| - operations->push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendTranslate(0, 0, 0);
|
| - operations->push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendTranslate(0, 0, 0);
|
| - to_add->AppendTranslate(0, 0, 0);
|
| - operations->push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendScale(1, 1, 1);
|
| - operations->push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendScale(1, 1, 1);
|
| - to_add->AppendScale(1, 1, 1);
|
| - operations->push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendSkew(0, 0);
|
| - operations->push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendSkew(0, 0);
|
| - to_add->AppendSkew(0, 0);
|
| - operations->push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendRotate(0, 0, 1, 0);
|
| - operations->push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendRotate(0, 0, 1, 0);
|
| - to_add->AppendRotate(0, 0, 1, 0);
|
| - operations->push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendMatrix(gfx::Transform());
|
| - operations->push_back(to_add);
|
| -
|
| - to_add = new TransformOperations();
|
| - to_add->AppendMatrix(gfx::Transform());
|
| - to_add->AppendMatrix(gfx::Transform());
|
| - operations->push_back(to_add);
|
| -}
|
| -
|
| -TEST(TransformOperationTest, IdentityAlwaysMatches) {
|
| - ScopedVector<TransformOperations> operations;
|
| - GetIdentityOperations(&operations);
|
| -
|
| - for (size_t i = 0; i < operations.size(); ++i) {
|
| - for (size_t j = 0; j < operations.size(); ++j)
|
| - EXPECT_TRUE(operations[i]->MatchesTypes(*operations[j]));
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, ApplyTranslate) {
|
| - SkMScalar x = 1;
|
| - SkMScalar y = 2;
|
| - SkMScalar z = 3;
|
| - TransformOperations operations;
|
| - operations.AppendTranslate(x, y, z);
|
| - gfx::Transform expected;
|
| - expected.Translate3d(x, y, z);
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.Apply());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, ApplyRotate) {
|
| - SkMScalar x = 1;
|
| - SkMScalar y = 2;
|
| - SkMScalar z = 3;
|
| - SkMScalar degrees = 80;
|
| - TransformOperations operations;
|
| - operations.AppendRotate(x, y, z, degrees);
|
| - gfx::Transform expected;
|
| - expected.RotateAbout(gfx::Vector3dF(x, y, z), degrees);
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.Apply());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, ApplyScale) {
|
| - SkMScalar x = 1;
|
| - SkMScalar y = 2;
|
| - SkMScalar z = 3;
|
| - TransformOperations operations;
|
| - operations.AppendScale(x, y, z);
|
| - gfx::Transform expected;
|
| - expected.Scale3d(x, y, z);
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.Apply());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, ApplySkew) {
|
| - SkMScalar x = 1;
|
| - SkMScalar y = 2;
|
| - TransformOperations operations;
|
| - operations.AppendSkew(x, y);
|
| - gfx::Transform expected;
|
| - expected.SkewX(x);
|
| - expected.SkewY(y);
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.Apply());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, ApplyPerspective) {
|
| - SkMScalar depth = 800;
|
| - TransformOperations operations;
|
| - operations.AppendPerspective(depth);
|
| - gfx::Transform expected;
|
| - expected.ApplyPerspectiveDepth(depth);
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.Apply());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, ApplyMatrix) {
|
| - SkMScalar dx = 1;
|
| - SkMScalar dy = 2;
|
| - SkMScalar dz = 3;
|
| - gfx::Transform expected_matrix;
|
| - expected_matrix.Translate3d(dx, dy, dz);
|
| - TransformOperations matrix_transform;
|
| - matrix_transform.AppendMatrix(expected_matrix);
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(expected_matrix, matrix_transform.Apply());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, ApplyOrder) {
|
| - SkMScalar sx = 2;
|
| - SkMScalar sy = 4;
|
| - SkMScalar sz = 8;
|
| -
|
| - SkMScalar dx = 1;
|
| - SkMScalar dy = 2;
|
| - SkMScalar dz = 3;
|
| -
|
| - TransformOperations operations;
|
| - operations.AppendScale(sx, sy, sz);
|
| - operations.AppendTranslate(dx, dy, dz);
|
| -
|
| - gfx::Transform expected_scale_matrix;
|
| - expected_scale_matrix.Scale3d(sx, sy, sz);
|
| -
|
| - gfx::Transform expected_translate_matrix;
|
| - expected_translate_matrix.Translate3d(dx, dy, dz);
|
| -
|
| - gfx::Transform expected_combined_matrix = expected_scale_matrix;
|
| - expected_combined_matrix.PreconcatTransform(expected_translate_matrix);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(expected_combined_matrix, operations.Apply());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendOrder) {
|
| - SkMScalar sx1 = 2;
|
| - SkMScalar sy1 = 4;
|
| - SkMScalar sz1 = 8;
|
| -
|
| - SkMScalar dx1 = 1;
|
| - SkMScalar dy1 = 2;
|
| - SkMScalar dz1 = 3;
|
| -
|
| - SkMScalar sx2 = 4;
|
| - SkMScalar sy2 = 8;
|
| - SkMScalar sz2 = 16;
|
| -
|
| - SkMScalar dx2 = 10;
|
| - SkMScalar dy2 = 20;
|
| - SkMScalar dz2 = 30;
|
| -
|
| - TransformOperations operations_from;
|
| - operations_from.AppendScale(sx1, sy1, sz1);
|
| - operations_from.AppendTranslate(dx1, dy1, dz1);
|
| -
|
| - TransformOperations operations_to;
|
| - operations_to.AppendScale(sx2, sy2, sz2);
|
| - operations_to.AppendTranslate(dx2, dy2, dz2);
|
| -
|
| - gfx::Transform scale_from;
|
| - scale_from.Scale3d(sx1, sy1, sz1);
|
| - gfx::Transform translate_from;
|
| - translate_from.Translate3d(dx1, dy1, dz1);
|
| -
|
| - gfx::Transform scale_to;
|
| - scale_to.Scale3d(sx2, sy2, sz2);
|
| - gfx::Transform translate_to;
|
| - translate_to.Translate3d(dx2, dy2, dz2);
|
| -
|
| - SkMScalar progress = 0.25f;
|
| -
|
| - gfx::Transform blended_scale = scale_to;
|
| - blended_scale.Blend(scale_from, progress);
|
| -
|
| - gfx::Transform blended_translate = translate_to;
|
| - blended_translate.Blend(translate_from, progress);
|
| -
|
| - gfx::Transform expected = blended_scale;
|
| - expected.PreconcatTransform(blended_translate);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations_to.Blend(operations_from, progress));
|
| -}
|
| -
|
| -static void CheckProgress(SkMScalar progress,
|
| - const gfx::Transform& from_matrix,
|
| - const gfx::Transform& to_matrix,
|
| - const TransformOperations& from_transform,
|
| - const TransformOperations& to_transform) {
|
| - gfx::Transform expected_matrix = to_matrix;
|
| - expected_matrix.Blend(from_matrix, progress);
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected_matrix, to_transform.Blend(from_transform, progress));
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendProgress) {
|
| - SkMScalar sx = 2;
|
| - SkMScalar sy = 4;
|
| - SkMScalar sz = 8;
|
| - TransformOperations operations_from;
|
| - operations_from.AppendScale(sx, sy, sz);
|
| -
|
| - gfx::Transform matrix_from;
|
| - matrix_from.Scale3d(sx, sy, sz);
|
| -
|
| - sx = 4;
|
| - sy = 8;
|
| - sz = 16;
|
| - TransformOperations operations_to;
|
| - operations_to.AppendScale(sx, sy, sz);
|
| -
|
| - gfx::Transform matrix_to;
|
| - matrix_to.Scale3d(sx, sy, sz);
|
| -
|
| - CheckProgress(-1, matrix_from, matrix_to, operations_from, operations_to);
|
| - CheckProgress(0, matrix_from, matrix_to, operations_from, operations_to);
|
| - CheckProgress(0.25f, matrix_from, matrix_to, operations_from, operations_to);
|
| - CheckProgress(0.5f, matrix_from, matrix_to, operations_from, operations_to);
|
| - CheckProgress(1, matrix_from, matrix_to, operations_from, operations_to);
|
| - CheckProgress(2, matrix_from, matrix_to, operations_from, operations_to);
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendWhenTypesDoNotMatch) {
|
| - SkMScalar sx1 = 2;
|
| - SkMScalar sy1 = 4;
|
| - SkMScalar sz1 = 8;
|
| -
|
| - SkMScalar dx1 = 1;
|
| - SkMScalar dy1 = 2;
|
| - SkMScalar dz1 = 3;
|
| -
|
| - SkMScalar sx2 = 4;
|
| - SkMScalar sy2 = 8;
|
| - SkMScalar sz2 = 16;
|
| -
|
| - SkMScalar dx2 = 10;
|
| - SkMScalar dy2 = 20;
|
| - SkMScalar dz2 = 30;
|
| -
|
| - TransformOperations operations_from;
|
| - operations_from.AppendScale(sx1, sy1, sz1);
|
| - operations_from.AppendTranslate(dx1, dy1, dz1);
|
| -
|
| - TransformOperations operations_to;
|
| - operations_to.AppendTranslate(dx2, dy2, dz2);
|
| - operations_to.AppendScale(sx2, sy2, sz2);
|
| -
|
| - gfx::Transform from;
|
| - from.Scale3d(sx1, sy1, sz1);
|
| - from.Translate3d(dx1, dy1, dz1);
|
| -
|
| - gfx::Transform to;
|
| - to.Translate3d(dx2, dy2, dz2);
|
| - to.Scale3d(sx2, sy2, sz2);
|
| -
|
| - SkMScalar progress = 0.25f;
|
| -
|
| - gfx::Transform expected = to;
|
| - expected.Blend(from, progress);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations_to.Blend(operations_from, progress));
|
| -}
|
| -
|
| -TEST(TransformOperationTest, LargeRotationsWithSameAxis) {
|
| - TransformOperations operations_from;
|
| - operations_from.AppendRotate(0, 0, 1, 0);
|
| -
|
| - TransformOperations operations_to;
|
| - operations_to.AppendRotate(0, 0, 2, 360);
|
| -
|
| - SkMScalar progress = 0.5f;
|
| -
|
| - gfx::Transform expected;
|
| - expected.RotateAbout(gfx::Vector3dF(0, 0, 1), 180);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations_to.Blend(operations_from, progress));
|
| -}
|
| -
|
| -TEST(TransformOperationTest, LargeRotationsWithSameAxisInDifferentDirection) {
|
| - TransformOperations operations_from;
|
| - operations_from.AppendRotate(0, 0, 1, 180);
|
| -
|
| - TransformOperations operations_to;
|
| - operations_to.AppendRotate(0, 0, -1, 180);
|
| -
|
| - SkMScalar progress = 0.5f;
|
| -
|
| - gfx::Transform expected;
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations_to.Blend(operations_from, progress));
|
| -}
|
| -
|
| -TEST(TransformOperationTest, LargeRotationsWithDifferentAxes) {
|
| - TransformOperations operations_from;
|
| - operations_from.AppendRotate(0, 0, 1, 175);
|
| -
|
| - TransformOperations operations_to;
|
| - operations_to.AppendRotate(0, 1, 0, 175);
|
| -
|
| - SkMScalar progress = 0.5f;
|
| - gfx::Transform matrix_from;
|
| - matrix_from.RotateAbout(gfx::Vector3dF(0, 0, 1), 175);
|
| -
|
| - gfx::Transform matrix_to;
|
| - matrix_to.RotateAbout(gfx::Vector3dF(0, 1, 0), 175);
|
| -
|
| - gfx::Transform expected = matrix_to;
|
| - expected.Blend(matrix_from, progress);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations_to.Blend(operations_from, progress));
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendRotationFromIdentity) {
|
| - ScopedVector<TransformOperations> identity_operations;
|
| - GetIdentityOperations(&identity_operations);
|
| -
|
| - for (size_t i = 0; i < identity_operations.size(); ++i) {
|
| - TransformOperations operations;
|
| - operations.AppendRotate(0, 0, 1, 360);
|
| -
|
| - SkMScalar progress = 0.5f;
|
| -
|
| - gfx::Transform expected;
|
| - expected.RotateAbout(gfx::Vector3dF(0, 0, 1), 180);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations.Blend(*identity_operations[i], progress));
|
| -
|
| - progress = -0.5f;
|
| -
|
| - expected.MakeIdentity();
|
| - expected.RotateAbout(gfx::Vector3dF(0, 0, 1), -180);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations.Blend(*identity_operations[i], progress));
|
| -
|
| - progress = 1.5f;
|
| -
|
| - expected.MakeIdentity();
|
| - expected.RotateAbout(gfx::Vector3dF(0, 0, 1), 540);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations.Blend(*identity_operations[i], progress));
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendTranslationFromIdentity) {
|
| - ScopedVector<TransformOperations> identity_operations;
|
| - GetIdentityOperations(&identity_operations);
|
| -
|
| - for (size_t i = 0; i < identity_operations.size(); ++i) {
|
| - TransformOperations operations;
|
| - operations.AppendTranslate(2, 2, 2);
|
| -
|
| - SkMScalar progress = 0.5f;
|
| -
|
| - gfx::Transform expected;
|
| - expected.Translate3d(1, 1, 1);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations.Blend(*identity_operations[i], progress));
|
| -
|
| - progress = -0.5f;
|
| -
|
| - expected.MakeIdentity();
|
| - expected.Translate3d(-1, -1, -1);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations.Blend(*identity_operations[i], progress));
|
| -
|
| - progress = 1.5f;
|
| -
|
| - expected.MakeIdentity();
|
| - expected.Translate3d(3, 3, 3);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations.Blend(*identity_operations[i], progress));
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendScaleFromIdentity) {
|
| - ScopedVector<TransformOperations> identity_operations;
|
| - GetIdentityOperations(&identity_operations);
|
| -
|
| - for (size_t i = 0; i < identity_operations.size(); ++i) {
|
| - TransformOperations operations;
|
| - operations.AppendScale(3, 3, 3);
|
| -
|
| - SkMScalar progress = 0.5f;
|
| -
|
| - gfx::Transform expected;
|
| - expected.Scale3d(2, 2, 2);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations.Blend(*identity_operations[i], progress));
|
| -
|
| - progress = -0.5f;
|
| -
|
| - expected.MakeIdentity();
|
| - expected.Scale3d(0, 0, 0);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations.Blend(*identity_operations[i], progress));
|
| -
|
| - progress = 1.5f;
|
| -
|
| - expected.MakeIdentity();
|
| - expected.Scale3d(4, 4, 4);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations.Blend(*identity_operations[i], progress));
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendSkewFromIdentity) {
|
| - ScopedVector<TransformOperations> identity_operations;
|
| - GetIdentityOperations(&identity_operations);
|
| -
|
| - for (size_t i = 0; i < identity_operations.size(); ++i) {
|
| - TransformOperations operations;
|
| - operations.AppendSkew(2, 2);
|
| -
|
| - SkMScalar progress = 0.5f;
|
| -
|
| - gfx::Transform expected;
|
| - expected.SkewX(1);
|
| - expected.SkewY(1);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations.Blend(*identity_operations[i], progress));
|
| -
|
| - progress = -0.5f;
|
| -
|
| - expected.MakeIdentity();
|
| - expected.SkewX(-1);
|
| - expected.SkewY(-1);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations.Blend(*identity_operations[i], progress));
|
| -
|
| - progress = 1.5f;
|
| -
|
| - expected.MakeIdentity();
|
| - expected.SkewX(3);
|
| - expected.SkewY(3);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations.Blend(*identity_operations[i], progress));
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendPerspectiveFromIdentity) {
|
| - ScopedVector<TransformOperations> identity_operations;
|
| - GetIdentityOperations(&identity_operations);
|
| -
|
| - for (size_t i = 0; i < identity_operations.size(); ++i) {
|
| - TransformOperations operations;
|
| - operations.AppendPerspective(1000);
|
| -
|
| - SkMScalar progress = 0.5f;
|
| -
|
| - gfx::Transform expected;
|
| - expected.ApplyPerspectiveDepth(2000);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations.Blend(*identity_operations[i], progress));
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendRotationToIdentity) {
|
| - ScopedVector<TransformOperations> identity_operations;
|
| - GetIdentityOperations(&identity_operations);
|
| -
|
| - for (size_t i = 0; i < identity_operations.size(); ++i) {
|
| - TransformOperations operations;
|
| - operations.AppendRotate(0, 0, 1, 360);
|
| -
|
| - SkMScalar progress = 0.5f;
|
| -
|
| - gfx::Transform expected;
|
| - expected.RotateAbout(gfx::Vector3dF(0, 0, 1), 180);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, identity_operations[i]->Blend(operations, progress));
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendTranslationToIdentity) {
|
| - ScopedVector<TransformOperations> identity_operations;
|
| - GetIdentityOperations(&identity_operations);
|
| -
|
| - for (size_t i = 0; i < identity_operations.size(); ++i) {
|
| - TransformOperations operations;
|
| - operations.AppendTranslate(2, 2, 2);
|
| -
|
| - SkMScalar progress = 0.5f;
|
| -
|
| - gfx::Transform expected;
|
| - expected.Translate3d(1, 1, 1);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, identity_operations[i]->Blend(operations, progress));
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendScaleToIdentity) {
|
| - ScopedVector<TransformOperations> identity_operations;
|
| - GetIdentityOperations(&identity_operations);
|
| -
|
| - for (size_t i = 0; i < identity_operations.size(); ++i) {
|
| - TransformOperations operations;
|
| - operations.AppendScale(3, 3, 3);
|
| -
|
| - SkMScalar progress = 0.5f;
|
| -
|
| - gfx::Transform expected;
|
| - expected.Scale3d(2, 2, 2);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, identity_operations[i]->Blend(operations, progress));
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendSkewToIdentity) {
|
| - ScopedVector<TransformOperations> identity_operations;
|
| - GetIdentityOperations(&identity_operations);
|
| -
|
| - for (size_t i = 0; i < identity_operations.size(); ++i) {
|
| - TransformOperations operations;
|
| - operations.AppendSkew(2, 2);
|
| -
|
| - SkMScalar progress = 0.5f;
|
| -
|
| - gfx::Transform expected;
|
| - expected.SkewX(1);
|
| - expected.SkewY(1);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, identity_operations[i]->Blend(operations, progress));
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendPerspectiveToIdentity) {
|
| - ScopedVector<TransformOperations> identity_operations;
|
| - GetIdentityOperations(&identity_operations);
|
| -
|
| - for (size_t i = 0; i < identity_operations.size(); ++i) {
|
| - TransformOperations operations;
|
| - operations.AppendPerspective(1000);
|
| -
|
| - SkMScalar progress = 0.5f;
|
| -
|
| - gfx::Transform expected;
|
| - expected.ApplyPerspectiveDepth(2000);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, identity_operations[i]->Blend(operations, progress));
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, ExtrapolatePerspectiveBlending) {
|
| - TransformOperations operations1;
|
| - operations1.AppendPerspective(1000);
|
| -
|
| - TransformOperations operations2;
|
| - operations2.AppendPerspective(500);
|
| -
|
| - gfx::Transform expected;
|
| - expected.ApplyPerspectiveDepth(400);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations1.Blend(operations2, -0.5));
|
| -
|
| - expected.MakeIdentity();
|
| - expected.ApplyPerspectiveDepth(2000);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations1.Blend(operations2, 1.5));
|
| -}
|
| -
|
| -TEST(TransformOperationTest, ExtrapolateMatrixBlending) {
|
| - gfx::Transform transform1;
|
| - transform1.Translate3d(1, 1, 1);
|
| - TransformOperations operations1;
|
| - operations1.AppendMatrix(transform1);
|
| -
|
| - gfx::Transform transform2;
|
| - transform2.Translate3d(3, 3, 3);
|
| - TransformOperations operations2;
|
| - operations2.AppendMatrix(transform2);
|
| -
|
| - gfx::Transform expected;
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations1.Blend(operations2, 1.5));
|
| -
|
| - expected.Translate3d(4, 4, 4);
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(
|
| - expected, operations1.Blend(operations2, -0.5));
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsWhenTypesDoNotMatch) {
|
| - TransformOperations operations_from;
|
| - operations_from.AppendScale(2.0, 4.0, 8.0);
|
| - operations_from.AppendTranslate(1.0, 2.0, 3.0);
|
| -
|
| - TransformOperations operations_to;
|
| - operations_to.AppendTranslate(10.0, 20.0, 30.0);
|
| - operations_to.AppendScale(4.0, 8.0, 16.0);
|
| -
|
| - gfx::BoxF box(1.f, 1.f, 1.f);
|
| - gfx::BoxF bounds;
|
| -
|
| - SkMScalar min_progress = 0.f;
|
| - SkMScalar max_progress = 1.f;
|
| -
|
| - EXPECT_FALSE(operations_to.BlendedBoundsForBox(
|
| - box, operations_from, min_progress, max_progress, &bounds));
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsForIdentity) {
|
| - TransformOperations operations_from;
|
| - operations_from.AppendIdentity();
|
| - TransformOperations operations_to;
|
| - operations_to.AppendIdentity();
|
| -
|
| - gfx::BoxF box(1.f, 2.f, 3.f);
|
| - gfx::BoxF bounds;
|
| -
|
| - SkMScalar min_progress = 0.f;
|
| - SkMScalar max_progress = 1.f;
|
| -
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, operations_from, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(box.ToString(), bounds.ToString());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsForTranslate) {
|
| - TransformOperations operations_from;
|
| - operations_from.AppendTranslate(3.0, -4.0, 2.0);
|
| - TransformOperations operations_to;
|
| - operations_to.AppendTranslate(7.0, 4.0, -2.0);
|
| -
|
| - gfx::BoxF box(1.f, 2.f, 3.f, 4.f, 4.f, 4.f);
|
| - gfx::BoxF bounds;
|
| -
|
| - SkMScalar min_progress = -0.5f;
|
| - SkMScalar max_progress = 1.5f;
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, operations_from, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(2.f, -6.f, -1.f, 12.f, 20.f, 12.f).ToString(),
|
| - bounds.ToString());
|
| -
|
| - min_progress = 0.f;
|
| - max_progress = 1.f;
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, operations_from, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(4.f, -2.f, 1.f, 8.f, 12.f, 8.f).ToString(),
|
| - bounds.ToString());
|
| -
|
| - TransformOperations identity;
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, identity, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(1.f, 2.f, 1.f, 11.f, 8.f, 6.f).ToString(),
|
| - bounds.ToString());
|
| -
|
| - EXPECT_TRUE(identity.BlendedBoundsForBox(
|
| - box, operations_from, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(1.f, -2.f, 3.f, 7.f, 8.f, 6.f).ToString(),
|
| - bounds.ToString());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsForScale) {
|
| - TransformOperations operations_from;
|
| - operations_from.AppendScale(3.0, 0.5, 2.0);
|
| - TransformOperations operations_to;
|
| - operations_to.AppendScale(7.0, 4.0, -2.0);
|
| -
|
| - gfx::BoxF box(1.f, 2.f, 3.f, 4.f, 4.f, 4.f);
|
| - gfx::BoxF bounds;
|
| -
|
| - SkMScalar min_progress = -0.5f;
|
| - SkMScalar max_progress = 1.5f;
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, operations_from, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(1.f, -7.5f, -28.f, 44.f, 42.f, 56.f).ToString(),
|
| - bounds.ToString());
|
| -
|
| - min_progress = 0.f;
|
| - max_progress = 1.f;
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, operations_from, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(3.f, 1.f, -14.f, 32.f, 23.f, 28.f).ToString(),
|
| - bounds.ToString());
|
| -
|
| - TransformOperations identity;
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, identity, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(1.f, 2.f, -14.f, 34.f, 22.f, 21.f).ToString(),
|
| - bounds.ToString());
|
| -
|
| - EXPECT_TRUE(identity.BlendedBoundsForBox(
|
| - box, operations_from, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(1.f, 1.f, 3.f, 14.f, 5.f, 11.f).ToString(),
|
| - bounds.ToString());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsWithZeroScale) {
|
| - TransformOperations zero_scale;
|
| - zero_scale.AppendScale(0.0, 0.0, 0.0);
|
| - TransformOperations non_zero_scale;
|
| - non_zero_scale.AppendScale(2.0, -4.0, 5.0);
|
| -
|
| - gfx::BoxF box(1.f, 2.f, 3.f, 4.f, 4.f, 4.f);
|
| - gfx::BoxF bounds;
|
| -
|
| - SkMScalar min_progress = 0.f;
|
| - SkMScalar max_progress = 1.f;
|
| - EXPECT_TRUE(zero_scale.BlendedBoundsForBox(
|
| - box, non_zero_scale, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(0.f, -24.f, 0.f, 10.f, 24.f, 35.f).ToString(),
|
| - bounds.ToString());
|
| -
|
| - EXPECT_TRUE(non_zero_scale.BlendedBoundsForBox(
|
| - box, zero_scale, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(0.f, -24.f, 0.f, 10.f, 24.f, 35.f).ToString(),
|
| - bounds.ToString());
|
| -
|
| - EXPECT_TRUE(zero_scale.BlendedBoundsForBox(
|
| - box, zero_scale, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF().ToString(), bounds.ToString());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsForRotationTrivial) {
|
| - TransformOperations operations_from;
|
| - operations_from.AppendRotate(0.f, 0.f, 1.f, 0.f);
|
| - TransformOperations operations_to;
|
| - operations_to.AppendRotate(0.f, 0.f, 1.f, 360.f);
|
| -
|
| - float sqrt_2 = sqrt(2.f);
|
| - gfx::BoxF box(
|
| - -sqrt_2, -sqrt_2, 0.f, sqrt_2, sqrt_2, 0.f);
|
| - gfx::BoxF bounds;
|
| -
|
| - // Since we're rotating 360 degrees, any box with dimensions between 0 and
|
| - // 2 * sqrt(2) should give the same result.
|
| - float sizes[] = { 0.f, 0.1f, sqrt_2, 2.f * sqrt_2 };
|
| - for (size_t i = 0; i < arraysize(sizes); ++i) {
|
| - box.set_size(sizes[i], sizes[i], 0.f);
|
| - SkMScalar min_progress = 0.f;
|
| - SkMScalar max_progress = 1.f;
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, operations_from, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(-2.f, -2.f, 0.f, 4.f, 4.f, 0.f).ToString(),
|
| - bounds.ToString());
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsForRotationAllExtrema) {
|
| - // If the normal is out of the plane, we can have up to 6 extrema (a min/max
|
| - // in each dimension) between the endpoints of the arc. This test ensures that
|
| - // we consider all 6.
|
| - TransformOperations operations_from;
|
| - operations_from.AppendRotate(1.f, 1.f, 1.f, 30.f);
|
| - TransformOperations operations_to;
|
| - operations_to.AppendRotate(1.f, 1.f, 1.f, 390.f);
|
| -
|
| - gfx::BoxF box(1.f, 0.f, 0.f, 0.f, 0.f, 0.f);
|
| - gfx::BoxF bounds;
|
| -
|
| - float min = -1.f / 3.f;
|
| - float max = 1.f;
|
| - float size = max - min;
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, operations_from, 0.f, 1.f, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(min, min, min, size, size, size).ToString(),
|
| - bounds.ToString());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsForRotationDifferentAxes) {
|
| - // We can handle rotations about a single axis. If the axes are different,
|
| - // we revert to matrix interpolation for which inflated bounds cannot be
|
| - // computed.
|
| - TransformOperations operations_from;
|
| - operations_from.AppendRotate(1.f, 1.f, 1.f, 30.f);
|
| - TransformOperations operations_to_same;
|
| - operations_to_same.AppendRotate(1.f, 1.f, 1.f, 390.f);
|
| - TransformOperations operations_to_opposite;
|
| - operations_to_opposite.AppendRotate(-1.f, -1.f, -1.f, 390.f);
|
| - TransformOperations operations_to_different;
|
| - operations_to_different.AppendRotate(1.f, 3.f, 1.f, 390.f);
|
| -
|
| - gfx::BoxF box(1.f, 0.f, 0.f, 0.f, 0.f, 0.f);
|
| - gfx::BoxF bounds;
|
| -
|
| - EXPECT_TRUE(operations_to_same.BlendedBoundsForBox(
|
| - box, operations_from, 0.f, 1.f, &bounds));
|
| - EXPECT_TRUE(operations_to_opposite.BlendedBoundsForBox(
|
| - box, operations_from, 0.f, 1.f, &bounds));
|
| - EXPECT_FALSE(operations_to_different.BlendedBoundsForBox(
|
| - box, operations_from, 0.f, 1.f, &bounds));
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsForRotationPointOnAxis) {
|
| - // Checks that if the point to rotate is sitting on the axis of rotation, that
|
| - // it does not get affected.
|
| - TransformOperations operations_from;
|
| - operations_from.AppendRotate(1.f, 1.f, 1.f, 30.f);
|
| - TransformOperations operations_to;
|
| - operations_to.AppendRotate(1.f, 1.f, 1.f, 390.f);
|
| -
|
| - gfx::BoxF box(1.f, 1.f, 1.f, 0.f, 0.f, 0.f);
|
| - gfx::BoxF bounds;
|
| -
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, operations_from, 0.f, 1.f, &bounds));
|
| - EXPECT_EQ(box.ToString(), bounds.ToString());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsForRotationProblematicAxes) {
|
| - // Zeros in the components of the axis of rotation turned out to be tricky to
|
| - // deal with in practice. This function tests some potentially problematic
|
| - // axes to ensure sane behavior.
|
| -
|
| - // Some common values used in the expected boxes.
|
| - float dim1 = 0.292893f;
|
| - float dim2 = sqrt(2.f);
|
| - float dim3 = 2.f * dim2;
|
| -
|
| - struct {
|
| - float x;
|
| - float y;
|
| - float z;
|
| - gfx::BoxF expected;
|
| - } tests[] = {{0.f, 0.f, 0.f, gfx::BoxF(1.f, 1.f, 1.f, 0.f, 0.f, 0.f)},
|
| - {1.f, 0.f, 0.f, gfx::BoxF(1.f, -dim2, -dim2, 0.f, dim3, dim3)},
|
| - {0.f, 1.f, 0.f, gfx::BoxF(-dim2, 1.f, -dim2, dim3, 0.f, dim3)},
|
| - {0.f, 0.f, 1.f, gfx::BoxF(-dim2, -dim2, 1.f, dim3, dim3, 0.f)},
|
| - {1.f, 1.f, 0.f, gfx::BoxF(dim1, dim1, -1.f, dim2, dim2, 2.f)},
|
| - {0.f, 1.f, 1.f, gfx::BoxF(-1.f, dim1, dim1, 2.f, dim2, dim2)},
|
| - {1.f, 0.f, 1.f, gfx::BoxF(dim1, -1.f, dim1, dim2, 2.f, dim2)}};
|
| -
|
| - for (size_t i = 0; i < arraysize(tests); ++i) {
|
| - float x = tests[i].x;
|
| - float y = tests[i].y;
|
| - float z = tests[i].z;
|
| - TransformOperations operations_from;
|
| - operations_from.AppendRotate(x, y, z, 0.f);
|
| - TransformOperations operations_to;
|
| - operations_to.AppendRotate(x, y, z, 360.f);
|
| - gfx::BoxF box(1.f, 1.f, 1.f, 0.f, 0.f, 0.f);
|
| - gfx::BoxF bounds;
|
| -
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, operations_from, 0.f, 1.f, &bounds));
|
| - EXPECT_EQ(tests[i].expected.ToString(), bounds.ToString());
|
| - }
|
| -}
|
| -
|
| -static void ExpectBoxesApproximatelyEqual(const gfx::BoxF& lhs,
|
| - const gfx::BoxF& rhs,
|
| - float tolerance) {
|
| - EXPECT_NEAR(lhs.x(), rhs.x(), tolerance);
|
| - EXPECT_NEAR(lhs.y(), rhs.y(), tolerance);
|
| - EXPECT_NEAR(lhs.z(), rhs.z(), tolerance);
|
| - EXPECT_NEAR(lhs.width(), rhs.width(), tolerance);
|
| - EXPECT_NEAR(lhs.height(), rhs.height(), tolerance);
|
| - EXPECT_NEAR(lhs.depth(), rhs.depth(), tolerance);
|
| -}
|
| -
|
| -static void EmpiricallyTestBounds(const TransformOperations& from,
|
| - const TransformOperations& to,
|
| - SkMScalar min_progress,
|
| - SkMScalar max_progress,
|
| - bool test_containment_only) {
|
| - gfx::BoxF box(200.f, 500.f, 100.f, 100.f, 300.f, 200.f);
|
| - gfx::BoxF bounds;
|
| - EXPECT_TRUE(
|
| - to.BlendedBoundsForBox(box, from, min_progress, max_progress, &bounds));
|
| -
|
| - bool first_time = true;
|
| - gfx::BoxF empirical_bounds;
|
| - static const size_t kNumSteps = 10;
|
| - for (size_t step = 0; step < kNumSteps; ++step) {
|
| - float t = step / (kNumSteps - 1.f);
|
| - t = gfx::Tween::FloatValueBetween(t, min_progress, max_progress);
|
| - gfx::Transform partial_transform = to.Blend(from, t);
|
| - gfx::BoxF transformed = box;
|
| - partial_transform.TransformBox(&transformed);
|
| -
|
| - if (first_time) {
|
| - empirical_bounds = transformed;
|
| - first_time = false;
|
| - } else {
|
| - empirical_bounds.Union(transformed);
|
| - }
|
| - }
|
| -
|
| - if (test_containment_only) {
|
| - gfx::BoxF unified_bounds = bounds;
|
| - unified_bounds.Union(empirical_bounds);
|
| - // Convert to the screen space rects these boxes represent.
|
| - gfx::Rect bounds_rect = ToEnclosingRect(
|
| - gfx::RectF(bounds.x(), bounds.y(), bounds.width(), bounds.height()));
|
| - gfx::Rect unified_bounds_rect =
|
| - ToEnclosingRect(gfx::RectF(unified_bounds.x(),
|
| - unified_bounds.y(),
|
| - unified_bounds.width(),
|
| - unified_bounds.height()));
|
| - EXPECT_EQ(bounds_rect.ToString(), unified_bounds_rect.ToString());
|
| - } else {
|
| - // Our empirical estimate will be a little rough since we're only doing
|
| - // 100 samples.
|
| - static const float kTolerance = 1e-2f;
|
| - ExpectBoxesApproximatelyEqual(empirical_bounds, bounds, kTolerance);
|
| - }
|
| -}
|
| -
|
| -static void EmpiricallyTestBoundsEquality(const TransformOperations& from,
|
| - const TransformOperations& to,
|
| - SkMScalar min_progress,
|
| - SkMScalar max_progress) {
|
| - EmpiricallyTestBounds(from, to, min_progress, max_progress, false);
|
| -}
|
| -
|
| -static void EmpiricallyTestBoundsContainment(const TransformOperations& from,
|
| - const TransformOperations& to,
|
| - SkMScalar min_progress,
|
| - SkMScalar max_progress) {
|
| - EmpiricallyTestBounds(from, to, min_progress, max_progress, true);
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsForRotationEmpiricalTests) {
|
| - // Sets up various axis angle combinations, computes the bounding box and
|
| - // empirically tests that the transformed bounds are indeed contained by the
|
| - // computed bounding box.
|
| -
|
| - struct {
|
| - float x;
|
| - float y;
|
| - float z;
|
| - } axes[] = {{1.f, 1.f, 1.f},
|
| - {-1.f, -1.f, -1.f},
|
| - {-1.f, 2.f, 3.f},
|
| - {1.f, -2.f, 3.f},
|
| - {1.f, 2.f, -3.f},
|
| - {0.f, 0.f, 0.f},
|
| - {1.f, 0.f, 0.f},
|
| - {0.f, 1.f, 0.f},
|
| - {0.f, 0.f, 1.f},
|
| - {1.f, 1.f, 0.f},
|
| - {0.f, 1.f, 1.f},
|
| - {1.f, 0.f, 1.f},
|
| - {-1.f, 0.f, 0.f},
|
| - {0.f, -1.f, 0.f},
|
| - {0.f, 0.f, -1.f},
|
| - {-1.f, -1.f, 0.f},
|
| - {0.f, -1.f, -1.f},
|
| - {-1.f, 0.f, -1.f}};
|
| -
|
| - struct {
|
| - float theta_from;
|
| - float theta_to;
|
| - } angles[] = {{5.f, 10.f},
|
| - {10.f, 5.f},
|
| - {0.f, 360.f},
|
| - {20.f, 180.f},
|
| - {-20.f, -180.f},
|
| - {180.f, -220.f},
|
| - {220.f, 320.f}};
|
| -
|
| - // We can go beyond the range [0, 1] (the bezier might slide out of this range
|
| - // at either end), but since the first and last knots are at (0, 0) and (1, 1)
|
| - // we will never go within it, so these tests are sufficient.
|
| - struct {
|
| - float min_progress;
|
| - float max_progress;
|
| - } progress[] = {
|
| - {0.f, 1.f}, {-.25f, 1.25f},
|
| - };
|
| -
|
| - for (size_t i = 0; i < arraysize(axes); ++i) {
|
| - for (size_t j = 0; j < arraysize(angles); ++j) {
|
| - for (size_t k = 0; k < arraysize(progress); ++k) {
|
| - float x = axes[i].x;
|
| - float y = axes[i].y;
|
| - float z = axes[i].z;
|
| - TransformOperations operations_from;
|
| - operations_from.AppendRotate(x, y, z, angles[j].theta_from);
|
| - TransformOperations operations_to;
|
| - operations_to.AppendRotate(x, y, z, angles[j].theta_to);
|
| - EmpiricallyTestBoundsContainment(operations_from,
|
| - operations_to,
|
| - progress[k].min_progress,
|
| - progress[k].max_progress);
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, PerspectiveMatrixAndTransformBlendingEquivalency) {
|
| - TransformOperations from_operations;
|
| - from_operations.AppendPerspective(200);
|
| -
|
| - TransformOperations to_operations;
|
| - to_operations.AppendPerspective(1000);
|
| -
|
| - gfx::Transform from_transform;
|
| - from_transform.ApplyPerspectiveDepth(200);
|
| -
|
| - gfx::Transform to_transform;
|
| - to_transform.ApplyPerspectiveDepth(1000);
|
| -
|
| - static const int steps = 20;
|
| - for (int i = 0; i < steps; ++i) {
|
| - double progress = static_cast<double>(i) / (steps - 1);
|
| -
|
| - gfx::Transform blended_matrix = to_transform;
|
| - EXPECT_TRUE(blended_matrix.Blend(from_transform, progress));
|
| -
|
| - gfx::Transform blended_transform =
|
| - to_operations.Blend(from_operations, progress);
|
| -
|
| - EXPECT_TRANSFORMATION_MATRIX_EQ(blended_matrix, blended_transform);
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsForPerspective) {
|
| - struct {
|
| - float from_depth;
|
| - float to_depth;
|
| - } perspective_depths[] = {
|
| - {600.f, 400.f},
|
| - {800.f, 1000.f},
|
| - {800.f, std::numeric_limits<float>::infinity()},
|
| - };
|
| -
|
| - struct {
|
| - float min_progress;
|
| - float max_progress;
|
| - } progress[] = {
|
| - {0.f, 1.f}, {-0.1f, 1.1f},
|
| - };
|
| -
|
| - for (size_t i = 0; i < arraysize(perspective_depths); ++i) {
|
| - for (size_t j = 0; j < arraysize(progress); ++j) {
|
| - TransformOperations operations_from;
|
| - operations_from.AppendPerspective(perspective_depths[i].from_depth);
|
| - TransformOperations operations_to;
|
| - operations_to.AppendPerspective(perspective_depths[i].to_depth);
|
| - EmpiricallyTestBoundsEquality(operations_from,
|
| - operations_to,
|
| - progress[j].min_progress,
|
| - progress[j].max_progress);
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsForSkew) {
|
| - struct {
|
| - float from_x;
|
| - float from_y;
|
| - float to_x;
|
| - float to_y;
|
| - } skews[] = {
|
| - {1.f, 0.5f, 0.5f, 1.f}, {2.f, 1.f, 0.5f, 0.5f},
|
| - };
|
| -
|
| - struct {
|
| - float min_progress;
|
| - float max_progress;
|
| - } progress[] = {
|
| - {0.f, 1.f}, {-0.1f, 1.1f},
|
| - };
|
| -
|
| - for (size_t i = 0; i < arraysize(skews); ++i) {
|
| - for (size_t j = 0; j < arraysize(progress); ++j) {
|
| - TransformOperations operations_from;
|
| - operations_from.AppendSkew(skews[i].from_x, skews[i].from_y);
|
| - TransformOperations operations_to;
|
| - operations_to.AppendSkew(skews[i].to_x, skews[i].to_y);
|
| - EmpiricallyTestBoundsEquality(operations_from,
|
| - operations_to,
|
| - progress[j].min_progress,
|
| - progress[j].max_progress);
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(TransformOperationTest, NonCommutativeRotations) {
|
| - TransformOperations operations_from;
|
| - operations_from.AppendRotate(1.0, 0.0, 0.0, 0.0);
|
| - operations_from.AppendRotate(0.0, 1.0, 0.0, 0.0);
|
| - TransformOperations operations_to;
|
| - operations_to.AppendRotate(1.0, 0.0, 0.0, 45.0);
|
| - operations_to.AppendRotate(0.0, 1.0, 0.0, 135.0);
|
| -
|
| - gfx::BoxF box(0, 0, 0, 1, 1, 1);
|
| - gfx::BoxF bounds;
|
| -
|
| - SkMScalar min_progress = 0.0f;
|
| - SkMScalar max_progress = 1.0f;
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, operations_from, min_progress, max_progress, &bounds));
|
| - gfx::Transform blended_transform =
|
| - operations_to.Blend(operations_from, max_progress);
|
| - gfx::Point3F blended_point(0.9f, 0.9f, 0.0f);
|
| - blended_transform.TransformPoint(&blended_point);
|
| - gfx::BoxF expanded_bounds = bounds;
|
| - expanded_bounds.ExpandTo(blended_point);
|
| - EXPECT_EQ(bounds.ToString(), expanded_bounds.ToString());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, BlendedBoundsForSequence) {
|
| - TransformOperations operations_from;
|
| - operations_from.AppendTranslate(1.0, -5.0, 1.0);
|
| - operations_from.AppendScale(-1.0, 2.0, 3.0);
|
| - operations_from.AppendTranslate(2.0, 4.0, -1.0);
|
| - TransformOperations operations_to;
|
| - operations_to.AppendTranslate(13.0, -1.0, 5.0);
|
| - operations_to.AppendScale(-3.0, -2.0, 5.0);
|
| - operations_to.AppendTranslate(6.0, -2.0, 3.0);
|
| -
|
| - gfx::BoxF box(1.f, 2.f, 3.f, 4.f, 4.f, 4.f);
|
| - gfx::BoxF bounds;
|
| -
|
| - SkMScalar min_progress = -0.5f;
|
| - SkMScalar max_progress = 1.5f;
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, operations_from, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(-57.f, -59.f, -1.f, 76.f, 112.f, 80.f).ToString(),
|
| - bounds.ToString());
|
| -
|
| - min_progress = 0.f;
|
| - max_progress = 1.f;
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, operations_from, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(-32.f, -25.f, 7.f, 42.f, 44.f, 48.f).ToString(),
|
| - bounds.ToString());
|
| -
|
| - TransformOperations identity;
|
| - EXPECT_TRUE(operations_to.BlendedBoundsForBox(
|
| - box, identity, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(-33.f, -13.f, 3.f, 57.f, 19.f, 52.f).ToString(),
|
| - bounds.ToString());
|
| -
|
| - EXPECT_TRUE(identity.BlendedBoundsForBox(
|
| - box, operations_from, min_progress, max_progress, &bounds));
|
| - EXPECT_EQ(gfx::BoxF(-7.f, -3.f, 2.f, 15.f, 23.f, 20.f).ToString(),
|
| - bounds.ToString());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, AffectsScaleWithSingleOperation) {
|
| - TransformOperations empty_operations;
|
| - EXPECT_FALSE(empty_operations.AffectsScale());
|
| -
|
| - TransformOperations identity;
|
| - identity.AppendIdentity();
|
| - EXPECT_FALSE(identity.AffectsScale());
|
| -
|
| - TransformOperations translate;
|
| - translate.AppendTranslate(1.f, 2.f, 3.f);
|
| - EXPECT_FALSE(translate.AffectsScale());
|
| -
|
| - TransformOperations rotate;
|
| - rotate.AppendRotate(1.f, 2.f, 3.f, 4.f);
|
| - EXPECT_FALSE(rotate.AffectsScale());
|
| -
|
| - TransformOperations scale;
|
| - scale.AppendScale(1.f, 2.f, 3.f);
|
| - EXPECT_TRUE(scale.AffectsScale());
|
| -
|
| - TransformOperations skew;
|
| - skew.AppendSkew(1.f, 2.f);
|
| - EXPECT_FALSE(skew.AffectsScale());
|
| -
|
| - TransformOperations perspective;
|
| - perspective.AppendPerspective(1.f);
|
| - EXPECT_FALSE(perspective.AffectsScale());
|
| -
|
| - TransformOperations identity_matrix;
|
| - identity_matrix.AppendMatrix(gfx::Transform());
|
| - EXPECT_FALSE(identity_matrix.AffectsScale());
|
| -
|
| - TransformOperations translation_matrix;
|
| - gfx::Transform translation_transform;
|
| - translation_transform.Translate3d(1.f, 2.f, 3.f);
|
| - translation_matrix.AppendMatrix(translation_transform);
|
| - EXPECT_FALSE(translation_matrix.AffectsScale());
|
| -
|
| - TransformOperations scaling_matrix;
|
| - gfx::Transform scaling_transform;
|
| - scaling_transform.Scale(2.f, 2.f);
|
| - scaling_matrix.AppendMatrix(scaling_transform);
|
| - EXPECT_TRUE(scaling_matrix.AffectsScale());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, AffectsScaleWithMultipleOperations) {
|
| - TransformOperations operations1;
|
| - operations1.AppendSkew(1.f, 2.f);
|
| - operations1.AppendTranslate(1.f, 2.f, 3.f);
|
| - operations1.AppendIdentity();
|
| - EXPECT_FALSE(operations1.AffectsScale());
|
| -
|
| - TransformOperations operations2;
|
| - operations2.AppendPerspective(2.f);
|
| - operations2.AppendScale(1.f, 2.f, 3.f);
|
| - operations2.AppendTranslate(3.f, 2.f, 1.f);
|
| - EXPECT_TRUE(operations2.AffectsScale());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, IsTranslationWithSingleOperation) {
|
| - TransformOperations empty_operations;
|
| - EXPECT_TRUE(empty_operations.IsTranslation());
|
| -
|
| - TransformOperations identity;
|
| - identity.AppendIdentity();
|
| - EXPECT_TRUE(identity.IsTranslation());
|
| -
|
| - TransformOperations translate;
|
| - translate.AppendTranslate(1.f, 2.f, 3.f);
|
| - EXPECT_TRUE(translate.IsTranslation());
|
| -
|
| - TransformOperations rotate;
|
| - rotate.AppendRotate(1.f, 2.f, 3.f, 4.f);
|
| - EXPECT_FALSE(rotate.IsTranslation());
|
| -
|
| - TransformOperations scale;
|
| - scale.AppendScale(1.f, 2.f, 3.f);
|
| - EXPECT_FALSE(scale.IsTranslation());
|
| -
|
| - TransformOperations skew;
|
| - skew.AppendSkew(1.f, 2.f);
|
| - EXPECT_FALSE(skew.IsTranslation());
|
| -
|
| - TransformOperations perspective;
|
| - perspective.AppendPerspective(1.f);
|
| - EXPECT_FALSE(perspective.IsTranslation());
|
| -
|
| - TransformOperations identity_matrix;
|
| - identity_matrix.AppendMatrix(gfx::Transform());
|
| - EXPECT_TRUE(identity_matrix.IsTranslation());
|
| -
|
| - TransformOperations translation_matrix;
|
| - gfx::Transform translation_transform;
|
| - translation_transform.Translate3d(1.f, 2.f, 3.f);
|
| - translation_matrix.AppendMatrix(translation_transform);
|
| - EXPECT_TRUE(translation_matrix.IsTranslation());
|
| -
|
| - TransformOperations scaling_matrix;
|
| - gfx::Transform scaling_transform;
|
| - scaling_transform.Scale(2.f, 2.f);
|
| - scaling_matrix.AppendMatrix(scaling_transform);
|
| - EXPECT_FALSE(scaling_matrix.IsTranslation());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, IsTranslationWithMultipleOperations) {
|
| - TransformOperations operations1;
|
| - operations1.AppendSkew(1.f, 2.f);
|
| - operations1.AppendTranslate(1.f, 2.f, 3.f);
|
| - operations1.AppendIdentity();
|
| - EXPECT_FALSE(operations1.IsTranslation());
|
| -
|
| - TransformOperations operations2;
|
| - operations2.AppendIdentity();
|
| - operations2.AppendTranslate(3.f, 2.f, 1.f);
|
| - gfx::Transform translation_transform;
|
| - translation_transform.Translate3d(1.f, 2.f, 3.f);
|
| - operations2.AppendMatrix(translation_transform);
|
| - EXPECT_TRUE(operations2.IsTranslation());
|
| -}
|
| -
|
| -TEST(TransformOperationTest, ScaleComponent) {
|
| - gfx::Vector3dF scale;
|
| -
|
| - // Scale.
|
| - TransformOperations operations1;
|
| - operations1.AppendScale(-3.f, 2.f, 5.f);
|
| - EXPECT_TRUE(operations1.ScaleComponent(&scale));
|
| - EXPECT_EQ(gfx::Vector3dF(-3.f, 2.f, 5.f), scale);
|
| -
|
| - // Translate + Scale.
|
| - TransformOperations operations5;
|
| - operations5.AppendTranslate(1.f, 2.f, 3.f);
|
| - operations5.AppendScale(2.f, 5.f, 4.f);
|
| - EXPECT_TRUE(operations5.ScaleComponent(&scale));
|
| - EXPECT_EQ(gfx::Vector3dF(2.f, 5.f, 4.f), scale);
|
| -
|
| - // Translate + Scale + Matrix with translate.
|
| - gfx::Transform translation_transform;
|
| - translation_transform.Translate3d(1.f, 2.f, 3.f);
|
| - operations5.AppendMatrix(translation_transform);
|
| - EXPECT_TRUE(operations5.ScaleComponent(&scale));
|
| - EXPECT_EQ(gfx::Vector3dF(2.f, 5.f, 4.f), scale);
|
| -}
|
| -
|
| -TEST(TransformOperationTest, ScaleComponentCannotBeComputed) {
|
| - gfx::Vector3dF scale;
|
| -
|
| - // Scale can.
|
| - TransformOperations operations1;
|
| - operations1.AppendScale(2.f, 2.f, 2.f);
|
| - EXPECT_TRUE(operations1.ScaleComponent(&scale));
|
| - EXPECT_EQ(gfx::Vector3dF(2.f, 2.f, 2.f), scale);
|
| -
|
| - // Translate can.
|
| - TransformOperations operations2;
|
| - operations2.AppendTranslate(1.f, 2.f, 3.f);
|
| - EXPECT_TRUE(operations2.ScaleComponent(&scale));
|
| - EXPECT_EQ(gfx::Vector3dF(1.f, 1.f, 1.f), scale);
|
| -
|
| - // Scale + translate can.
|
| - TransformOperations operations3;
|
| - operations3.AppendScale(2.f, 3.f, 2.f);
|
| - operations3.AppendTranslate(1.f, 2.f, 3.f);
|
| - EXPECT_TRUE(operations3.ScaleComponent(&scale));
|
| - EXPECT_EQ(gfx::Vector3dF(2.f, 3.f, 2.f), scale);
|
| -
|
| - // Two Scales can't.
|
| - TransformOperations operations4;
|
| - operations4.AppendScale(2.f, 3.f, 2.f);
|
| - operations4.AppendScale(3.f, 2.f, 3.f);
|
| - EXPECT_FALSE(operations4.ScaleComponent(&scale));
|
| -
|
| - // Matrix can't.
|
| - TransformOperations operations5;
|
| - operations5.AppendScale(2.f, 2.f, 2.f);
|
| - gfx::Transform scaling_transform;
|
| - scaling_transform.Scale(2.f, 2.f);
|
| - operations5.AppendMatrix(scaling_transform);
|
| - EXPECT_FALSE(operations5.ScaleComponent(&scale));
|
| -
|
| - // Scale + Rotate can't.
|
| - TransformOperations operations7;
|
| - operations7.AppendScale(2.f, 2.f, 2.f);
|
| - operations7.AppendRotate(1.f, 2.f, 3.f, 4.f);
|
| - EXPECT_FALSE(operations7.ScaleComponent(&scale));
|
| -
|
| - // Scale + Skew can't.
|
| - TransformOperations operations9;
|
| - operations9.AppendScale(2.f, 2.f, 2.f);
|
| - operations9.AppendSkew(1.f, 2.f);
|
| - EXPECT_FALSE(operations9.ScaleComponent(&scale));
|
| -
|
| - // Scale + Perspective can't.
|
| - TransformOperations operations11;
|
| - operations11.AppendScale(2.f, 2.f, 2.f);
|
| - operations11.AppendPerspective(1.f);
|
| - EXPECT_FALSE(operations11.ScaleComponent(&scale));
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace cc
|
|
|