Index: webkit/compositor/WebTransformOperationsTest.cpp |
diff --git a/webkit/compositor/WebTransformOperationsTest.cpp b/webkit/compositor/WebTransformOperationsTest.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dac5c84ef5763624f5ee94f584fe73cdfc7cc0fd |
--- /dev/null |
+++ b/webkit/compositor/WebTransformOperationsTest.cpp |
@@ -0,0 +1,619 @@ |
+// Copyright 2012 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 "config.h" |
+ |
+#include <public/WebTransformOperations.h> |
+ |
+#include <public/WebTransformationMatrix.h> |
+ |
+#include "CCLayerTreeTestCommon.h" |
+ |
+#include <gtest/gtest.h> |
+#include <wtf/OwnPtr.h> |
+#include <wtf/PassOwnPtr.h> |
+#include <wtf/Vector.h> |
+ |
+using namespace std; |
+using namespace WebKit; |
+ |
+TEST(WebTransformOperationTest, transformTypesAreUnique) |
+{ |
+ Vector<OwnPtr<WebTransformOperations> > transforms; |
+ |
+ WebTransformOperations* toAdd = new WebTransformOperations(); |
+ toAdd->appendTranslate(1, 0, 0); |
+ transforms.append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendRotate(0, 0, 1, 2); |
+ transforms.append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendScale(2, 2, 2); |
+ transforms.append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendSkew(1, 0); |
+ transforms.append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendPerspective(800); |
+ transforms.append(adoptPtr(toAdd)); |
+ |
+ for (size_t i = 0; i < transforms.size(); ++i) { |
+ for (size_t j = 0; j < transforms.size(); ++j) { |
+ bool matchesType = transforms[i]->matchesTypes(*transforms[j]); |
+ EXPECT_TRUE((i == j && matchesType) || !matchesType); |
+ } |
+ } |
+} |
+ |
+TEST(WebTransformOperationTest, matchTypesSameLength) |
+{ |
+ WebTransformOperations translates; |
+ translates.appendTranslate(1, 0, 0); |
+ translates.appendTranslate(1, 0, 0); |
+ translates.appendTranslate(1, 0, 0); |
+ |
+ WebTransformOperations skews; |
+ skews.appendSkew(0, 2); |
+ skews.appendSkew(0, 2); |
+ skews.appendSkew(0, 2); |
+ |
+ WebTransformOperations translates2; |
+ translates2.appendTranslate(0, 2, 0); |
+ translates2.appendTranslate(0, 2, 0); |
+ translates2.appendTranslate(0, 2, 0); |
+ |
+ WebTransformOperations translates3 = translates2; |
+ |
+ EXPECT_FALSE(translates.matchesTypes(skews)); |
+ EXPECT_TRUE(translates.matchesTypes(translates2)); |
+ EXPECT_TRUE(translates.matchesTypes(translates3)); |
+} |
+ |
+TEST(WebTransformOperationTest, matchTypesDifferentLength) |
+{ |
+ WebTransformOperations translates; |
+ translates.appendTranslate(1, 0, 0); |
+ translates.appendTranslate(1, 0, 0); |
+ translates.appendTranslate(1, 0, 0); |
+ |
+ WebTransformOperations skews; |
+ skews.appendSkew(2, 0); |
+ skews.appendSkew(2, 0); |
+ |
+ WebTransformOperations translates2; |
+ translates2.appendTranslate(0, 2, 0); |
+ translates2.appendTranslate(0, 2, 0); |
+ |
+ EXPECT_FALSE(translates.matchesTypes(skews)); |
+ EXPECT_FALSE(translates.matchesTypes(translates2)); |
+} |
+ |
+void getIdentityOperations(Vector<OwnPtr<WebTransformOperations> >* operations) |
+{ |
+ WebTransformOperations* toAdd = new WebTransformOperations(); |
+ operations->append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendTranslate(0, 0, 0); |
+ operations->append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendTranslate(0, 0, 0); |
+ toAdd->appendTranslate(0, 0, 0); |
+ operations->append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendScale(1, 1, 1); |
+ operations->append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendScale(1, 1, 1); |
+ toAdd->appendScale(1, 1, 1); |
+ operations->append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendSkew(0, 0); |
+ operations->append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendSkew(0, 0); |
+ toAdd->appendSkew(0, 0); |
+ operations->append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendRotate(0, 0, 1, 0); |
+ operations->append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendRotate(0, 0, 1, 0); |
+ toAdd->appendRotate(0, 0, 1, 0); |
+ operations->append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendMatrix(WebTransformationMatrix()); |
+ operations->append(adoptPtr(toAdd)); |
+ |
+ toAdd = new WebTransformOperations(); |
+ toAdd->appendMatrix(WebTransformationMatrix()); |
+ toAdd->appendMatrix(WebTransformationMatrix()); |
+ operations->append(adoptPtr(toAdd)); |
+} |
+ |
+TEST(WebTransformOperationTest, identityAlwaysMatches) |
+{ |
+ Vector<OwnPtr<WebTransformOperations> > 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(WebTransformOperationTest, applyTranslate) |
+{ |
+ double x = 1; |
+ double y = 2; |
+ double z = 3; |
+ WebTransformOperations operations; |
+ operations.appendTranslate(x, y, z); |
+ WebTransformationMatrix expected; |
+ expected.translate3d(x, y, z); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.apply()); |
+} |
+ |
+TEST(WebTransformOperationTest, applyRotate) |
+{ |
+ double x = 1; |
+ double y = 2; |
+ double z = 3; |
+ double degrees = 80; |
+ WebTransformOperations operations; |
+ operations.appendRotate(x, y, z, degrees); |
+ WebTransformationMatrix expected; |
+ expected.rotate3d(x, y, z, degrees); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.apply()); |
+} |
+ |
+TEST(WebTransformOperationTest, applyScale) |
+{ |
+ double x = 1; |
+ double y = 2; |
+ double z = 3; |
+ WebTransformOperations operations; |
+ operations.appendScale(x, y, z); |
+ WebTransformationMatrix expected; |
+ expected.scale3d(x, y, z); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.apply()); |
+} |
+ |
+TEST(WebTransformOperationTest, applySkew) |
+{ |
+ double x = 1; |
+ double y = 2; |
+ WebTransformOperations operations; |
+ operations.appendSkew(x, y); |
+ WebTransformationMatrix expected; |
+ expected.skewX(x); |
+ expected.skewY(y); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.apply()); |
+} |
+ |
+TEST(WebTransformOperationTest, applyPerspective) |
+{ |
+ double depth = 800; |
+ WebTransformOperations operations; |
+ operations.appendPerspective(depth); |
+ WebTransformationMatrix expected; |
+ expected.applyPerspective(depth); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.apply()); |
+} |
+ |
+TEST(WebTransformOperationTest, applyMatrix) |
+{ |
+ double dx = 1; |
+ double dy = 2; |
+ double dz = 3; |
+ WebTransformationMatrix expectedMatrix; |
+ expectedMatrix.translate3d(dx, dy, dz); |
+ WebTransformOperations matrixTransform; |
+ matrixTransform.appendMatrix(expectedMatrix); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expectedMatrix, matrixTransform.apply()); |
+} |
+ |
+TEST(WebTransformOperationTest, applyOrder) |
+{ |
+ double sx = 2; |
+ double sy = 4; |
+ double sz = 8; |
+ |
+ double dx = 1; |
+ double dy = 2; |
+ double dz = 3; |
+ |
+ WebTransformOperations operations; |
+ operations.appendScale(sx, sy, sz); |
+ operations.appendTranslate(dx, dy, dz); |
+ |
+ WebTransformationMatrix expectedScaleMatrix; |
+ expectedScaleMatrix.scale3d(sx, sy, sz); |
+ |
+ WebTransformationMatrix expectedTranslateMatrix; |
+ expectedTranslateMatrix.translate3d(dx, dy, dz); |
+ |
+ WebTransformationMatrix expectedCombinedMatrix = expectedScaleMatrix; |
+ expectedCombinedMatrix.multiply(expectedTranslateMatrix); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expectedCombinedMatrix, operations.apply()); |
+} |
+ |
+TEST(WebTransformOperationTest, blendOrder) |
+{ |
+ double sx1 = 2; |
+ double sy1 = 4; |
+ double sz1 = 8; |
+ |
+ double dx1 = 1; |
+ double dy1 = 2; |
+ double dz1 = 3; |
+ |
+ double sx2 = 4; |
+ double sy2 = 8; |
+ double sz2 = 16; |
+ |
+ double dx2 = 10; |
+ double dy2 = 20; |
+ double dz2 = 30; |
+ |
+ WebTransformOperations operationsFrom; |
+ operationsFrom.appendScale(sx1, sy1, sz1); |
+ operationsFrom.appendTranslate(dx1, dy1, dz1); |
+ |
+ WebTransformOperations operationsTo; |
+ operationsTo.appendScale(sx2, sy2, sz2); |
+ operationsTo.appendTranslate(dx2, dy2, dz2); |
+ |
+ WebTransformationMatrix scaleFrom; |
+ scaleFrom.scale3d(sx1, sy1, sz1); |
+ WebTransformationMatrix translateFrom; |
+ translateFrom.translate3d(dx1, dy1, dz1); |
+ |
+ WebTransformationMatrix scaleTo; |
+ scaleTo.scale3d(sx2, sy2, sz2); |
+ WebTransformationMatrix translateTo; |
+ translateTo.translate3d(dx2, dy2, dz2); |
+ |
+ double progress = 0.25; |
+ |
+ WebTransformationMatrix blendedScale = scaleTo; |
+ blendedScale.blend(scaleFrom, progress); |
+ |
+ WebTransformationMatrix blendedTranslate = translateTo; |
+ blendedTranslate.blend(translateFrom, progress); |
+ |
+ WebTransformationMatrix expected = blendedScale; |
+ expected.multiply(blendedTranslate); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operationsTo.blend(operationsFrom, progress)); |
+} |
+ |
+static void checkProgress(double progress, |
+ const WebTransformationMatrix& fromMatrix, |
+ const WebTransformationMatrix& toMatrix, |
+ const WebTransformOperations& fromTransform, |
+ const WebTransformOperations& toTransform) |
+{ |
+ WebTransformationMatrix expectedMatrix = toMatrix; |
+ expectedMatrix.blend(fromMatrix, progress); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expectedMatrix, toTransform.blend(fromTransform, progress)); |
+} |
+ |
+TEST(WebTransformOperationTest, blendProgress) |
+{ |
+ double sx = 2; |
+ double sy = 4; |
+ double sz = 8; |
+ WebTransformOperations operationsFrom; |
+ operationsFrom.appendScale(sx, sy, sz); |
+ |
+ WebTransformationMatrix matrixFrom; |
+ matrixFrom.scale3d(sx, sy, sz); |
+ |
+ sx = 4; |
+ sy = 8; |
+ sz = 16; |
+ WebTransformOperations operationsTo; |
+ operationsTo.appendScale(sx, sy, sz); |
+ |
+ WebTransformationMatrix matrixTo; |
+ matrixTo.scale3d(sx, sy, sz); |
+ |
+ checkProgress(-1, matrixFrom, matrixTo, operationsFrom, operationsTo); |
+ checkProgress(0, matrixFrom, matrixTo, operationsFrom, operationsTo); |
+ checkProgress(0.25, matrixFrom, matrixTo, operationsFrom, operationsTo); |
+ checkProgress(0.5, matrixFrom, matrixTo, operationsFrom, operationsTo); |
+ checkProgress(1, matrixFrom, matrixTo, operationsFrom, operationsTo); |
+ checkProgress(2, matrixFrom, matrixTo, operationsFrom, operationsTo); |
+} |
+ |
+TEST(WebTransformOperationTest, blendWhenTypesDoNotMatch) |
+{ |
+ double sx1 = 2; |
+ double sy1 = 4; |
+ double sz1 = 8; |
+ |
+ double dx1 = 1; |
+ double dy1 = 2; |
+ double dz1 = 3; |
+ |
+ double sx2 = 4; |
+ double sy2 = 8; |
+ double sz2 = 16; |
+ |
+ double dx2 = 10; |
+ double dy2 = 20; |
+ double dz2 = 30; |
+ |
+ WebTransformOperations operationsFrom; |
+ operationsFrom.appendScale(sx1, sy1, sz1); |
+ operationsFrom.appendTranslate(dx1, dy1, dz1); |
+ |
+ WebTransformOperations operationsTo; |
+ operationsTo.appendTranslate(dx2, dy2, dz2); |
+ operationsTo.appendScale(sx2, sy2, sz2); |
+ |
+ WebTransformationMatrix from; |
+ from.scale3d(sx1, sy1, sz1); |
+ from.translate3d(dx1, dy1, dz1); |
+ |
+ WebTransformationMatrix to; |
+ to.translate3d(dx2, dy2, dz2); |
+ to.scale3d(sx2, sy2, sz2); |
+ |
+ double progress = 0.25; |
+ |
+ WebTransformationMatrix expected = to; |
+ expected.blend(from, progress); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operationsTo.blend(operationsFrom, progress)); |
+} |
+ |
+TEST(WebTransformOperationTest, largeRotationsWithSameAxis) |
+{ |
+ WebTransformOperations operationsFrom; |
+ operationsFrom.appendRotate(0, 0, 1, 0); |
+ |
+ WebTransformOperations operationsTo; |
+ operationsTo.appendRotate(0, 0, 2, 360); |
+ |
+ double progress = 0.5; |
+ |
+ WebTransformationMatrix expected; |
+ expected.rotate3d(0, 0, 1, 180); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operationsTo.blend(operationsFrom, progress)); |
+} |
+ |
+TEST(WebTransformOperationTest, largeRotationsWithSameAxisInDifferentDirection) |
+{ |
+ WebTransformOperations operationsFrom; |
+ operationsFrom.appendRotate(0, 0, 1, 180); |
+ |
+ WebTransformOperations operationsTo; |
+ operationsTo.appendRotate(0, 0, -1, 180); |
+ |
+ double progress = 0.5; |
+ |
+ WebTransformationMatrix expected; |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operationsTo.blend(operationsFrom, progress)); |
+} |
+ |
+TEST(WebTransformOperationTest, largeRotationsWithDifferentAxes) |
+{ |
+ WebTransformOperations operationsFrom; |
+ operationsFrom.appendRotate(0, 0, 1, 180); |
+ |
+ WebTransformOperations operationsTo; |
+ operationsTo.appendRotate(0, 1, 0, 180); |
+ |
+ double progress = 0.5; |
+ WebTransformationMatrix matrixFrom; |
+ matrixFrom.rotate3d(0, 0, 1, 180); |
+ |
+ WebTransformationMatrix matrixTo; |
+ matrixTo.rotate3d(0, 1, 0, 180); |
+ |
+ WebTransformationMatrix expected = matrixTo; |
+ expected.blend(matrixFrom, progress); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operationsTo.blend(operationsFrom, progress)); |
+} |
+ |
+TEST(WebTransformOperationTest, blendRotationFromIdentity) |
+{ |
+ Vector<OwnPtr<WebTransformOperations> > identityOperations; |
+ getIdentityOperations(&identityOperations); |
+ |
+ for (size_t i = 0; i < identityOperations.size(); ++i) { |
+ WebTransformOperations operations; |
+ operations.appendRotate(0, 0, 1, 360); |
+ |
+ double progress = 0.5; |
+ |
+ WebTransformationMatrix expected; |
+ expected.rotate3d(0, 0, 1, 180); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.blend(*identityOperations[i], progress)); |
+ } |
+} |
+ |
+TEST(WebTransformOperationTest, blendTranslationFromIdentity) |
+{ |
+ Vector<OwnPtr<WebTransformOperations> > identityOperations; |
+ getIdentityOperations(&identityOperations); |
+ |
+ for (size_t i = 0; i < identityOperations.size(); ++i) { |
+ WebTransformOperations operations; |
+ operations.appendTranslate(2, 2, 2); |
+ |
+ double progress = 0.5; |
+ |
+ WebTransformationMatrix expected; |
+ expected.translate3d(1, 1, 1); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.blend(*identityOperations[i], progress)); |
+ } |
+} |
+ |
+TEST(WebTransformOperationTest, blendScaleFromIdentity) |
+{ |
+ Vector<OwnPtr<WebTransformOperations> > identityOperations; |
+ getIdentityOperations(&identityOperations); |
+ |
+ for (size_t i = 0; i < identityOperations.size(); ++i) { |
+ WebTransformOperations operations; |
+ operations.appendScale(3, 3, 3); |
+ |
+ double progress = 0.5; |
+ |
+ WebTransformationMatrix expected; |
+ expected.scale3d(2, 2, 2); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.blend(*identityOperations[i], progress)); |
+ } |
+} |
+ |
+TEST(WebTransformOperationTest, blendSkewFromIdentity) |
+{ |
+ Vector<OwnPtr<WebTransformOperations> > identityOperations; |
+ getIdentityOperations(&identityOperations); |
+ |
+ for (size_t i = 0; i < identityOperations.size(); ++i) { |
+ WebTransformOperations operations; |
+ operations.appendSkew(2, 2); |
+ |
+ double progress = 0.5; |
+ |
+ WebTransformationMatrix expected; |
+ expected.skewX(1); |
+ expected.skewY(1); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.blend(*identityOperations[i], progress)); |
+ } |
+} |
+ |
+TEST(WebTransformOperationTest, blendPerspectiveFromIdentity) |
+{ |
+ Vector<OwnPtr<WebTransformOperations> > identityOperations; |
+ getIdentityOperations(&identityOperations); |
+ |
+ for (size_t i = 0; i < identityOperations.size(); ++i) { |
+ WebTransformOperations operations; |
+ operations.appendPerspective(1000); |
+ |
+ double progress = 0.5; |
+ |
+ WebTransformationMatrix expected; |
+ expected.applyPerspective(500 + 0.5 * numeric_limits<double>::max()); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, operations.blend(*identityOperations[i], progress)); |
+ } |
+} |
+ |
+TEST(WebTransformOperationTest, blendRotationToIdentity) |
+{ |
+ Vector<OwnPtr<WebTransformOperations> > identityOperations; |
+ getIdentityOperations(&identityOperations); |
+ |
+ for (size_t i = 0; i < identityOperations.size(); ++i) { |
+ WebTransformOperations operations; |
+ operations.appendRotate(0, 0, 1, 360); |
+ |
+ double progress = 0.5; |
+ |
+ WebTransformationMatrix expected; |
+ expected.rotate3d(0, 0, 1, 180); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, identityOperations[i]->blend(operations, progress)); |
+ } |
+} |
+ |
+TEST(WebTransformOperationTest, blendTranslationToIdentity) |
+{ |
+ Vector<OwnPtr<WebTransformOperations> > identityOperations; |
+ getIdentityOperations(&identityOperations); |
+ |
+ for (size_t i = 0; i < identityOperations.size(); ++i) { |
+ WebTransformOperations operations; |
+ operations.appendTranslate(2, 2, 2); |
+ |
+ double progress = 0.5; |
+ |
+ WebTransformationMatrix expected; |
+ expected.translate3d(1, 1, 1); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, identityOperations[i]->blend(operations, progress)); |
+ } |
+} |
+ |
+TEST(WebTransformOperationTest, blendScaleToIdentity) |
+{ |
+ Vector<OwnPtr<WebTransformOperations> > identityOperations; |
+ getIdentityOperations(&identityOperations); |
+ |
+ for (size_t i = 0; i < identityOperations.size(); ++i) { |
+ WebTransformOperations operations; |
+ operations.appendScale(3, 3, 3); |
+ |
+ double progress = 0.5; |
+ |
+ WebTransformationMatrix expected; |
+ expected.scale3d(2, 2, 2); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, identityOperations[i]->blend(operations, progress)); |
+ } |
+} |
+ |
+TEST(WebTransformOperationTest, blendSkewToIdentity) |
+{ |
+ Vector<OwnPtr<WebTransformOperations> > identityOperations; |
+ getIdentityOperations(&identityOperations); |
+ |
+ for (size_t i = 0; i < identityOperations.size(); ++i) { |
+ WebTransformOperations operations; |
+ operations.appendSkew(2, 2); |
+ |
+ double progress = 0.5; |
+ |
+ WebTransformationMatrix expected; |
+ expected.skewX(1); |
+ expected.skewY(1); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, identityOperations[i]->blend(operations, progress)); |
+ } |
+} |
+ |
+TEST(WebTransformOperationTest, blendPerspectiveToIdentity) |
+{ |
+ Vector<OwnPtr<WebTransformOperations> > identityOperations; |
+ getIdentityOperations(&identityOperations); |
+ |
+ for (size_t i = 0; i < identityOperations.size(); ++i) { |
+ WebTransformOperations operations; |
+ operations.appendPerspective(1000); |
+ |
+ double progress = 0.5; |
+ |
+ WebTransformationMatrix expected; |
+ expected.applyPerspective(500 + 0.5 * numeric_limits<double>::max()); |
+ |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected, identityOperations[i]->blend(operations, progress)); |
+ } |
+} |
+ |