Title: [289599] trunk
Revision
289599
Author
nmouchta...@apple.com
Date
2022-02-10 18:27:02 -0800 (Thu, 10 Feb 2022)

Log Message

Web animations- Composite operation accumulation support for transform properties
https://bugs.webkit.org/show_bug.cgi?id=236116

Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

* web-platform-tests/css/css-transforms/animation/transform-matrix-composition-expected.txt:
* web-platform-tests/css/css-transforms/animation/transform-rotate-composition-expected.txt:
* web-platform-tests/css/css-transforms/animation/transform-skew-composition-expected.txt:
* web-platform-tests/css/css-transforms/animation/transform-translate-composition-expected.txt:
* web-platform-tests/web-animations/animation-model/animation-types/accumulation-per-property-002-expected.txt:
* web-platform-tests/web-animations/animation-model/combining-effects/effect-composition-expected.txt:

Source/WebCore:

This patch brings further support for accumulation on transform properties. The main aspect being addressed
is handling accumulation of TransformationMatrices. This involves accumulating on the decomposed functions,
which occurs in blendFloat() and accumulateQuaternion(). Since we need to perform accumulation for one-based
values on certain decomposed functions, (scale, diagonals of matrices, etc), we set the operation to accumulate
only for these cases.

A couple of bugs introduced by this additional support are also addressed. For a property with a
different transform operation than the keyframes given, transformFunctionListsMatch() would return
true when it shouldn't. Addressed by checking in blendByMatchingOperations and falling back on matrix
interpolation. Another bug is that we need to pass the composite operation to TransformationMatrix blend().
Another bug is that we should to use Replace behavior if either of the transform matrices are
non-invertible.

* animation/CSSPropertyAnimation.cpp:
(WebCore::blendFunc):
* platform/graphics/transforms/Matrix3DTransformOperation.cpp:
(WebCore::createOperation):
* platform/graphics/transforms/MatrixTransformOperation.cpp:
(WebCore::MatrixTransformOperation::blend):
* platform/graphics/transforms/RotateTransformOperation.cpp:
(WebCore::RotateTransformOperation::blend):
* platform/graphics/transforms/TransformOperations.cpp:
(WebCore::TransformOperations::blendByMatchingOperations const):
(WebCore::TransformOperations::blendByUsingMatrixInterpolation const):
(WebCore::TransformOperations::blend const):
* platform/graphics/transforms/TransformOperations.h:
(WebCore::TransformOperations::isInvertible const):
* platform/graphics/transforms/TransformationMatrix.cpp:
(WebCore::blendFloat):
(WebCore::TransformationMatrix::blend2):
(WebCore::accumulateQuaternion):
(WebCore::TransformationMatrix::blend4):
(WebCore::TransformationMatrix::blend):

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (289598 => 289599)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2022-02-11 02:27:02 UTC (rev 289599)
@@ -1,3 +1,17 @@
+2022-02-10  Nikolaos Mouchtaris  <nmouchta...@apple.com>
+
+        Web animations- Composite operation accumulation support for transform properties
+        https://bugs.webkit.org/show_bug.cgi?id=236116
+
+        Reviewed by Simon Fraser.
+
+        * web-platform-tests/css/css-transforms/animation/transform-matrix-composition-expected.txt:
+        * web-platform-tests/css/css-transforms/animation/transform-rotate-composition-expected.txt:
+        * web-platform-tests/css/css-transforms/animation/transform-skew-composition-expected.txt:
+        * web-platform-tests/css/css-transforms/animation/transform-translate-composition-expected.txt:
+        * web-platform-tests/web-animations/animation-model/animation-types/accumulation-per-property-002-expected.txt:
+        * web-platform-tests/web-animations/animation-model/combining-effects/effect-composition-expected.txt:
+
 2022-02-10  Chris Dumez  <cdu...@apple.com>
 
         Resync web-platform-tests/service-workers from upstream

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-matrix-composition-expected.txt (289598 => 289599)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-matrix-composition-expected.txt	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-matrix-composition-expected.txt	2022-02-11 02:27:02 UTC (rev 289599)
@@ -27,20 +27,20 @@
 FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0.75) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.97 , 0.32 , - 0.04 , 0.63 , 234.38 , 40.63 ) "
 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (1) should be [matrix(1, 0, 0, 1, 300, 0)]
 FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (1.5) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.99 , - 0.56 , 0.37 , 1.59 , 487.5 , - 137.5 ) "
-FAIL Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (-0.5) should be [matrix(0, 1, -1, 0, 150, 0)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 150 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 50 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0) should be [matrix(0, 1, -1, 0, 200, 0)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 200 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 100 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.25) should be [matrix(0, 1, -1, 0, 225, 0)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 225 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 125 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.5) should be [matrix(0, 1, -1, 0, 250, 0)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 250 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 150 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.75) should be [matrix(0, 1, -1, 0, 275, 0)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 275 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 175 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1) should be [matrix(0, 1, -1, 0, 300, 0)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 300 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 200 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1.5) should be [matrix(0, 1, -1, 0, 350, 0)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 350 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 250 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (-0.5) should be [translateX(150px) rotate3d(1, 1, 0, 45deg)] assert_equals: expected "matrix3d ( 0.85 , 0.15 , - 0.5 , 0 , 0.15 , 0.85 , 0.5 , 0 , 0.5 , - 0.5 , 0.71 , 0 , 150 , 0 , 0 , 1 ) " but got "matrix ( 1 , 0 , 0 , 1 , 50 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (0) should be [translateX(200px) rotate3d(1, 1, 0, 45deg)] assert_equals: expected "matrix3d ( 0.85 , 0.15 , - 0.5 , 0 , 0.15 , 0.85 , 0.5 , 0 , 0.5 , - 0.5 , 0.71 , 0 , 200 , 0 , 0 , 1 ) " but got "matrix ( 1 , 0 , 0 , 1 , 100 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (0.25) should be [translateX(225px) rotate3d(1, 1, 0, 45deg)] assert_equals: expected "matrix3d ( 0.85 , 0.15 , - 0.5 , 0 , 0.15 , 0.85 , 0.5 , 0 , 0.5 , - 0.5 , 0.71 , 0 , 225 , 0 , 0 , 1 ) " but got "matrix ( 1 , 0 , 0 , 1 , 125 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (0.5) should be [translateX(250px) rotate3d(1, 1, 0, 45deg)] assert_equals: expected "matrix3d ( 0.85 , 0.15 , - 0.5 , 0 , 0.15 , 0.85 , 0.5 , 0 , 0.5 , - 0.5 , 0.71 , 0 , 250 , 0 , 0 , 1 ) " but got "matrix ( 1 , 0 , 0 , 1 , 150 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (0.75) should be [translateX(275px) rotate3d(1, 1, 0, 45deg)] assert_equals: expected "matrix3d ( 0.85 , 0.15 , - 0.5 , 0 , 0.15 , 0.85 , 0.5 , 0 , 0.5 , - 0.5 , 0.71 , 0 , 275 , 0 , 0 , 1 ) " but got "matrix ( 1 , 0 , 0 , 1 , 175 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (1) should be [translateX(300px) rotate3d(1, 1, 0, 45deg)] assert_equals: expected "matrix3d ( 0.85 , 0.15 , - 0.5 , 0 , 0.15 , 0.85 , 0.5 , 0 , 0.5 , - 0.5 , 0.71 , 0 , 300 , 0 , 0 , 1 ) " but got "matrix ( 1 , 0 , 0 , 1 , 200 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (1.5) should be [translateX(350px) rotate3d(1, 1, 0, 45deg)] assert_equals: expected "matrix3d ( 0.85 , 0.15 , - 0.5 , 0 , 0.15 , 0.85 , 0.5 , 0 , 0.5 , - 0.5 , 0.71 , 0 , 350 , 0 , 0 , 1 ) " but got "matrix ( 1 , 0 , 0 , 1 , 250 , 0 ) "
+PASS Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (-0.5) should be [matrix(0, 1, -1, 0, 150, 0)]
+PASS Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0) should be [matrix(0, 1, -1, 0, 200, 0)]
+PASS Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.25) should be [matrix(0, 1, -1, 0, 225, 0)]
+PASS Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.5) should be [matrix(0, 1, -1, 0, 250, 0)]
+PASS Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.75) should be [matrix(0, 1, -1, 0, 275, 0)]
+PASS Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1) should be [matrix(0, 1, -1, 0, 300, 0)]
+PASS Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1.5) should be [matrix(0, 1, -1, 0, 350, 0)]
+PASS Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (-0.5) should be [translateX(150px) rotate3d(1, 1, 0, 45deg)]
+PASS Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (0) should be [translateX(200px) rotate3d(1, 1, 0, 45deg)]
+PASS Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (0.25) should be [translateX(225px) rotate3d(1, 1, 0, 45deg)]
+PASS Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (0.5) should be [translateX(250px) rotate3d(1, 1, 0, 45deg)]
+PASS Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (0.75) should be [translateX(275px) rotate3d(1, 1, 0, 45deg)]
+PASS Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (1) should be [translateX(300px) rotate3d(1, 1, 0, 45deg)]
+PASS Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to accumulate [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (1.5) should be [translateX(350px) rotate3d(1, 1, 0, 45deg)]
 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (-0.5) should be [matrix(1, 0, 0, 1, 50, 0)]
 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0) should be [matrix(1, 0, 0, 1, 100, 0)]
 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.25) should be [matrix(1, 0, 0, 1, 125, 0)]
@@ -48,11 +48,11 @@
 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.75) should be [matrix(1, 0, 0, 1, 175, 0)]
 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1) should be [matrix(1, 0, 0, 1, 200, 0)]
 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1.5) should be [matrix(1, 0, 0, 1, 250, 0)]
-FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (-0.5) should be [matrix(1, 1, 0, 0, 0, 100)] assert_equals: expected "matrix ( 1 , 1 , 0 , 0 , 0 , 100 ) " but got "matrix ( 1.28 , 0.84 , - 0.03 , 0.3 , 87.5 , - 37.5 ) "
+FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (-0.5) should be [matrix(1, 1, 0, 0, 0, 100)] assert_equals: expected "matrix ( 1 , 1 , 0 , 0 , 0 , 100 ) " but got "matrix ( 1.28 , 0.84 , - 0.03 , 0.3 , 75 , - 75 ) "
 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0) should be [matrix(1, 1, 0, 0, 0, 100)]
-FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.25) should be [matrix(1, 1, 0, 0, 0, 100)] assert_equals: expected "matrix ( 1 , 1 , 0 , 0 , 0 , 100 ) " but got "matrix ( 0.95 , 0.86 , - 0.01 , 0.08 , 59.38 , 65.63 ) "
-FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.5) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.95 , 0.63 , - 0.03 , 0.3 , 87.5 , 62.5 ) "
-FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.75) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.97 , 0.32 , - 0.04 , 0.63 , 134.38 , 40.63 ) "
-FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 200 , 0 ) "
-FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1.5) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.99 , - 0.56 , 0.37 , 1.59 , 387.5 , - 137.5 ) "
+FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.25) should be [matrix(1, 1, 0, 0, 0, 100)] assert_equals: expected "matrix ( 1 , 1 , 0 , 0 , 0 , 100 ) " but got "matrix ( 0.95 , 0.86 , - 0.01 , 0.08 , 75 , 75 ) "
+FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.5) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.95 , 0.63 , - 0.03 , 0.3 , 125 , 75 ) "
+FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.75) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.97 , 0.32 , - 0.04 , 0.63 , 200 , 50 ) "
+PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1) should be [matrix(1, 0, 0, 1, 300, 0)]
+FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1.5) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.99 , - 0.56 , 0.37 , 1.59 , 575 , - 175 ) "
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-rotate-composition-expected.txt (289598 => 289599)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-rotate-composition-expected.txt	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-rotate-composition-expected.txt	2022-02-11 02:27:02 UTC (rev 289599)
@@ -48,13 +48,13 @@
 PASS Compositing: property <transform> underlying [rotateZ(20deg)] from accumulate [rotateZ(40deg)] to accumulate [rotateZ(60deg)] at (0.75) should be [rotateZ(75deg)]
 PASS Compositing: property <transform> underlying [rotateZ(20deg)] from accumulate [rotateZ(40deg)] to accumulate [rotateZ(60deg)] at (1) should be [rotateZ(80deg)]
 PASS Compositing: property <transform> underlying [rotateZ(20deg)] from accumulate [rotateZ(40deg)] to accumulate [rotateZ(60deg)] at (1.5) should be [rotateZ(90deg)]
-FAIL Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (-0.5) should be [rotateX(45deg) rotateY(10deg)] assert_equals: expected "matrix3d ( 0.98 , 0.12 , - 0.12 , 0 , 0 , 0.71 , 0.71 , 0 , 0.17 , - 0.7 , 0.7 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.98 , 0 , - 0.17 , 0 , 0 , 1 , 0 , 0 , 0.17 , 0 , 0.98 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (0) should be [rotateX(45deg) rotateY(30deg)] assert_equals: expected "matrix3d ( 0.87 , 0.35 , - 0.35 , 0 , 0 , 0.71 , 0.71 , 0 , 0.5 , - 0.61 , 0.61 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.87 , 0 , - 0.5 , 0 , 0 , 1 , 0 , 0 , 0.5 , 0 , 0.87 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (0.25) should be [rotateX(45deg) rotateY(40deg)] assert_equals: expected "matrix3d ( 0.77 , 0.45 , - 0.45 , 0 , 0 , 0.71 , 0.71 , 0 , 0.64 , - 0.54 , 0.54 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.77 , 0 , - 0.64 , 0 , 0 , 1 , 0 , 0 , 0.64 , 0 , 0.77 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (0.5) should be [rotateX(45deg) rotateY(50deg)] assert_equals: expected "matrix3d ( 0.64 , 0.54 , - 0.54 , 0 , 0 , 0.71 , 0.71 , 0 , 0.77 , - 0.45 , 0.45 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.64 , 0 , - 0.77 , 0 , 0 , 1 , 0 , 0 , 0.77 , 0 , 0.64 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (0.75) should be [rotateX(45deg) rotateY(60deg)] assert_equals: expected "matrix3d ( 0.5 , 0.61 , - 0.61 , 0 , 0 , 0.71 , 0.71 , 0 , 0.87 , - 0.35 , 0.35 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.5 , 0 , - 0.87 , 0 , 0 , 1 , 0 , 0 , 0.87 , 0 , 0.5 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (1) should be [rotateX(45deg) rotateY(70deg)] assert_equals: expected "matrix3d ( 0.34 , 0.66 , - 0.66 , 0 , 0 , 0.71 , 0.71 , 0 , 0.94 , - 0.24 , 0.24 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.34 , 0 , - 0.94 , 0 , 0 , 1 , 0 , 0 , 0.94 , 0 , 0.34 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (1.5) should be [rotateX(45deg) rotateY(90deg)] assert_equals: expected "matrix3d ( 0 , 0.71 , - 0.71 , 0 , 0 , 0.71 , 0.71 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0 , 0 , - 1 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ) "
+PASS Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (-0.5) should be [rotateX(45deg) rotateY(10deg)]
+PASS Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (0) should be [rotateX(45deg) rotateY(30deg)]
+PASS Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (0.25) should be [rotateX(45deg) rotateY(40deg)]
+PASS Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (0.5) should be [rotateX(45deg) rotateY(50deg)]
+PASS Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (0.75) should be [rotateX(45deg) rotateY(60deg)]
+PASS Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (1) should be [rotateX(45deg) rotateY(70deg)]
+PASS Compositing: property <transform> underlying [rotateX(45deg)] from accumulate [rotateY(30deg)] to accumulate [rotateY(70deg)] at (1.5) should be [rotateX(45deg) rotateY(90deg)]
 PASS Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)] from accumulate [rotate(45deg)] to accumulate [rotate(225deg)] at (-0.5) should be [rotate(0deg) skew(10deg, 20deg)]
 PASS Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)] from accumulate [rotate(45deg)] to accumulate [rotate(225deg)] at (0) should be [rotate(90deg) skew(10deg, 20deg)]
 PASS Compositing: property <transform> underlying [rotate(45deg) skew(10deg, 20deg)] from accumulate [rotate(45deg)] to accumulate [rotate(225deg)] at (0.25) should be [rotate(135deg) skew(10deg, 20deg)]

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-skew-composition-expected.txt (289598 => 289599)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-skew-composition-expected.txt	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-skew-composition-expected.txt	2022-02-11 02:27:02 UTC (rev 289599)
@@ -41,5 +41,5 @@
 PASS Compositing: property <transform> underlying [skew(10deg, 45deg)] from accumulate [skew(20deg, 30deg)] to accumulate [skew(40deg, 70deg)] at (0.75) should be [skew(45deg, 105deg)]
 PASS Compositing: property <transform> underlying [skew(10deg, 45deg)] from accumulate [skew(20deg, 30deg)] to accumulate [skew(40deg, 70deg)] at (1) should be [skew(50deg, 115deg)]
 PASS Compositing: property <transform> underlying [skew(10deg, 45deg)] from accumulate [skew(20deg, 30deg)] to accumulate [skew(40deg, 70deg)] at (1.5) should be [skew(60deg, 135deg)]
-FAIL Compositing: property <transform> underlying [skewX(45deg)] from accumulate [skewY(45deg)] to accumulate [skewY(45deg)] at (0.5) should be [matrix(1, 1, 0.5, 1.5, 0, 0)] assert_equals: expected "matrix ( 1 , 1 , 0.5 , 1.5 , 0 , 0 ) " but got "matrix ( 1 , 1 , 0 , 1 , 0 , 0 ) "
+FAIL Compositing: property <transform> underlying [skewX(45deg)] from accumulate [skewY(45deg)] to accumulate [skewY(45deg)] at (0.5) should be [matrix(1, 1, 0.5, 1.5, 0, 0)] assert_equals: expected "matrix ( 1 , 1 , 0.5 , 1.5 , 0 , 0 ) " but got "matrix ( 1.71 , 0.71 , 0.71 , 1.12 , 0 , 0 ) "
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-translate-composition-expected.txt (289598 => 289599)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-translate-composition-expected.txt	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-translate-composition-expected.txt	2022-02-11 02:27:02 UTC (rev 289599)
@@ -48,11 +48,11 @@
 PASS Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (0.75) should be [translate3d(100px, 50px, 200px)]
 PASS Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (1) should be [translate3d(100px, 50px, 250px)]
 PASS Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (1.5) should be [translate3d(100px, 50px, 350px)]
-FAIL Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (-0.5) should be [translateX(150px) rotate(90deg)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 150 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 150 , 0 ) "
-FAIL Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (0) should be [translateX(200px) rotate(90deg)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 200 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 200 , 0 ) "
-FAIL Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (0.25) should be [translateX(225px) rotate(90deg)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 225 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 225 , 0 ) "
-FAIL Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (0.5) should be [translateX(250px) rotate(90deg)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 250 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 250 , 0 ) "
-FAIL Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (0.75) should be [translateX(275px) rotate(90deg)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 275 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 275 , 0 ) "
-FAIL Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (1) should be [translateX(300px) rotate(90deg)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 300 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) "
-FAIL Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (1.5) should be [translateX(350px) rotate(90deg)] assert_equals: expected "matrix ( 0 , 1 , - 1 , 0 , 350 , 0 ) " but got "matrix ( 1 , 0 , 0 , 1 , 350 , 0 ) "
+PASS Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (-0.5) should be [translateX(150px) rotate(90deg)]
+PASS Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (0) should be [translateX(200px) rotate(90deg)]
+PASS Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (0.25) should be [translateX(225px) rotate(90deg)]
+PASS Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (0.5) should be [translateX(250px) rotate(90deg)]
+PASS Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (0.75) should be [translateX(275px) rotate(90deg)]
+PASS Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (1) should be [translateX(300px) rotate(90deg)]
+PASS Compositing: property <transform> underlying [translateX(100px) rotate(90deg)] from accumulate [translateX(100px)] to accumulate [translateX(200px)] at (1.5) should be [translateX(350px) rotate(90deg)]
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/animation-types/accumulation-per-property-002-expected.txt (289598 => 289599)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/animation-types/accumulation-per-property-002-expected.txt	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/animation-types/accumulation-per-property-002-expected.txt	2022-02-11 02:27:02 UTC (rev 289599)
@@ -178,20 +178,20 @@
 PASS transform: rotate
 PASS transform: scale
 PASS transform: skew
-FAIL transform: rotate on translate assert_approx_equals: expected matrix(0, 1, -1, 0, 100, 0) but got matrix(0, 1, -1, 0, 0, 0): The value should be matrix(0, 1, -1, 0, 100, 0) at 0ms but got matrix(0, 1, -1, 0, 0, 0) expected 100 +/- 0.0001 but got 0
-FAIL transform: translate on rotate assert_approx_equals: expected matrix(0, 1, -1, 0, 100, 0) but got matrix(1, 0, 0, 1, 100, 0): The value should be matrix(0, 1, -1, 0, 100, 0) at 0ms but got matrix(1, 0, 0, 1, 100, 0) expected 0 +/- 0.0001 but got 1
+PASS transform: rotate on translate
+PASS transform: translate on rotate
 PASS transform: rotate and translate on rotate
 PASS transform: rotate on rotate and translate
-FAIL transform: matrix assert_approx_equals: expected matrix(0, 1, -1, 0, 100, 0) but got matrix(1, 0, 0, 1, 100, 0): The value should be matrix(0, 1, -1, 0, 100, 0) at 0ms but got matrix(1, 0, 0, 1, 100, 0) expected 0 +/- 0.0001 but got 1
+PASS transform: matrix
 PASS transform: rotate3d
-FAIL transform: matrix3d assert_approx_equals: expected matrix3d(0.853553, 0.146447, 0.5, 0, 0.146447, 0.853553, -0.5, 0, -0.5, 0.5, 0.707107, 0, 0, 0, 0, 1) but got matrix3d(0.5, 0.5, 0.707107, 0, 0.5, 0.5, -0.707107, 0, -0.707107, 0.707107, 0, 0, 0, 0, 0, 1): The value should be matrix3d(0.853553, 0.146447, 0.5, 0, 0.146447, 0.853553, -0.5, 0, -0.5, 0.5, 0.707107, 0, 0, 0, 0, 1) at 0ms but got matrix3d(0.5, 0.5, 0.707107, 0, 0.5, 0.5, -0.707107, 0, -0.707107, 0.707107, 0, 0, 0, 0, 0, 1) expected 0.853553 +/- 0.0001 but got 0.5
-FAIL transform: none assert_equals: dimension of the matrix: The value should be matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1) at 0ms but got matrix(1, 0, 0, 1, 0, 0) expected 16 but got 6
+PASS transform: matrix3d
+PASS transform: none
 PASS transform: non-invertible matrices (non-invertible onto invertible)
 PASS transform: non-invertible matrices (invertible onto non-invertible)
-FAIL transform: non-invertible matrices in matched transform lists (non-invertible onto invertible) assert_approx_equals: expected matrix(-1, -1, 0, 0, 100, 100) but got matrix(0, 0, 1, 1, 150, 100): The value should be matrix(-1, -1, 0, 0, 100, 100) at 0ms but got matrix(0, 0, 1, 1, 150, 100) expected -1 +/- 0.0001 but got 0
-FAIL transform: non-invertible matrices in matched transform lists (invertible onto non-invertible) assert_approx_equals: expected matrix(0, -1, 1, 0, 250, 0) but got matrix(0, 1, -1, 0, 350, 0): The value should be matrix(0, -1, 1, 0, 250, 0) at 0ms but got matrix(0, 1, -1, 0, 350, 0) expected -1 +/- 0.0001 but got 1
-FAIL transform: non-invertible matrices in mismatched transform lists (non-invertible onto invertible) assert_approx_equals: expected matrix(1, 1, 1, 1, 100, 100) but got matrix(1, 1, 1, 1, 150, 100): The value should be matrix(1, 1, 1, 1, 100, 100) at 0ms but got matrix(1, 1, 1, 1, 150, 100) expected 100 +/- 0.0001 but got 150
-FAIL transform: non-invertible matrices in mismatched transform lists (invertible onto non-invertible) assert_approx_equals: expected matrix(-2, 0, 0, -2, 250, 0) but got matrix(-2, 0, 0, -2, 350, 0): The value should be matrix(-2, 0, 0, -2, 250, 0) at 0ms but got matrix(-2, 0, 0, -2, 350, 0) expected 250 +/- 0.0001 but got 350
+PASS transform: non-invertible matrices in matched transform lists (non-invertible onto invertible)
+PASS transform: non-invertible matrices in matched transform lists (invertible onto non-invertible)
+PASS transform: non-invertible matrices in mismatched transform lists (non-invertible onto invertible)
+PASS transform: non-invertible matrices in mismatched transform lists (invertible onto non-invertible)
 PASS transform-box (type: discrete) has testAccumulation function
 PASS transform-box: "border-box" onto "fill-box"
 PASS transform-box: "fill-box" onto "border-box"

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/combining-effects/effect-composition-expected.txt (289598 => 289599)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/combining-effects/effect-composition-expected.txt	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/combining-effects/effect-composition-expected.txt	2022-02-11 02:27:02 UTC (rev 289599)
@@ -1,8 +1,8 @@
 
 PASS accumulate onto the base value
 PASS accumulate onto an underlying animation value
-FAIL accumulate onto an underlying animation value with implicit from values assert_equals: Animated style at 50% expected "matrix(1, 0, 0, 1, 50, 50)" but got "matrix(1, 0, 0, 1, 25, 50)"
-FAIL accumulate onto an underlying animation value with implicit to values assert_equals: Animated style at 50% expected "matrix(1, 0, 0, 1, 50, 50)" but got "matrix(1, 0, 0, 1, 25, 50)"
+PASS accumulate onto an underlying animation value with implicit from values
+PASS accumulate onto an underlying animation value with implicit to values
 PASS Composite when mixing accumulate and replace
 PASS accumulate specified on a keyframe overrides the composite mode of the effect
 PASS unspecified composite mode on a keyframe is overriden by setting accumulate of the effect

Modified: trunk/Source/WebCore/ChangeLog (289598 => 289599)


--- trunk/Source/WebCore/ChangeLog	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/Source/WebCore/ChangeLog	2022-02-11 02:27:02 UTC (rev 289599)
@@ -1,3 +1,44 @@
+2022-02-10  Nikolaos Mouchtaris  <nmouchta...@apple.com>
+
+        Web animations- Composite operation accumulation support for transform properties
+        https://bugs.webkit.org/show_bug.cgi?id=236116
+
+        Reviewed by Simon Fraser.
+
+        This patch brings further support for accumulation on transform properties. The main aspect being addressed 
+        is handling accumulation of TransformationMatrices. This involves accumulating on the decomposed functions, 
+        which occurs in blendFloat() and accumulateQuaternion(). Since we need to perform accumulation for one-based 
+        values on certain decomposed functions, (scale, diagonals of matrices, etc), we set the operation to accumulate 
+        only for these cases.
+        
+        A couple of bugs introduced by this additional support are also addressed. For a property with a 
+        different transform operation than the keyframes given, transformFunctionListsMatch() would return 
+        true when it shouldn't. Addressed by checking in blendByMatchingOperations and falling back on matrix 
+        interpolation. Another bug is that we need to pass the composite operation to TransformationMatrix blend().
+        Another bug is that we should to use Replace behavior if either of the transform matrices are
+        non-invertible.
+
+        * animation/CSSPropertyAnimation.cpp:
+        (WebCore::blendFunc):
+        * platform/graphics/transforms/Matrix3DTransformOperation.cpp:
+        (WebCore::createOperation):
+        * platform/graphics/transforms/MatrixTransformOperation.cpp:
+        (WebCore::MatrixTransformOperation::blend):
+        * platform/graphics/transforms/RotateTransformOperation.cpp:
+        (WebCore::RotateTransformOperation::blend):
+        * platform/graphics/transforms/TransformOperations.cpp:
+        (WebCore::TransformOperations::blendByMatchingOperations const):
+        (WebCore::TransformOperations::blendByUsingMatrixInterpolation const):
+        (WebCore::TransformOperations::blend const):
+        * platform/graphics/transforms/TransformOperations.h:
+        (WebCore::TransformOperations::isInvertible const):
+        * platform/graphics/transforms/TransformationMatrix.cpp:
+        (WebCore::blendFloat):
+        (WebCore::TransformationMatrix::blend2):
+        (WebCore::accumulateQuaternion):
+        (WebCore::TransformationMatrix::blend4):
+        (WebCore::TransformationMatrix::blend):
+
 2022-02-10  Antoine Quint  <grao...@webkit.org>
 
         [web-animations] accelerated animations should not run accelerated

Modified: trunk/Source/WebCore/animation/CSSPropertyAnimation.cpp (289598 => 289599)


--- trunk/Source/WebCore/animation/CSSPropertyAnimation.cpp	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/Source/WebCore/animation/CSSPropertyAnimation.cpp	2022-02-11 02:27:02 UTC (rev 289599)
@@ -170,10 +170,10 @@
             resultOperations.operations().append(operation);
         return resultOperations;
     }
-
+    auto boxSize = is<RenderBox>(context.client->renderer()) ? downcast<RenderBox>(*context.client->renderer()).borderBoxRect().size() : LayoutSize();
     if (context.client->transformFunctionListsMatch())
-        return to.blendByMatchingOperations(from, context);
-    return to.blendByUsingMatrixInterpolation(from, context, is<RenderBox>(context.client->renderer()) ? downcast<RenderBox>(*context.client->renderer()).borderBoxRect().size() : LayoutSize());
+        return to.blendByMatchingOperations(from, context, boxSize);
+    return to.blendByUsingMatrixInterpolation(from, context, boxSize);
 }
 
 static RefPtr<ScaleTransformOperation> blendFunc(ScaleTransformOperation* from, ScaleTransformOperation* to, const CSSPropertyBlendingContext& context)

Modified: trunk/Source/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp (289598 => 289599)


--- trunk/Source/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/Source/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp	2022-02-11 02:27:02 UTC (rev 289599)
@@ -39,7 +39,7 @@
 
 static Ref<TransformOperation> createOperation(TransformationMatrix& to, TransformationMatrix& from, const BlendingContext& context)
 {
-    to.blend(from, context.progress);
+    to.blend(from, context.progress, context.compositeOperation);
     return Matrix3DTransformOperation::create(to);
 }
 

Modified: trunk/Source/WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp (289598 => 289599)


--- trunk/Source/WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/Source/WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp	2022-02-11 02:27:02 UTC (rev 289599)
@@ -39,7 +39,7 @@
 Ref<TransformOperation> MatrixTransformOperation::blend(const TransformOperation* from, const BlendingContext& context, bool blendToIdentity)
 {
     auto createOperation = [] (TransformationMatrix& to, TransformationMatrix& from, const BlendingContext& context) {
-        to.blend(from, context.progress);
+        to.blend(from, context.progress, context.compositeOperation);
         return MatrixTransformOperation::create(to);
     };
 

Modified: trunk/Source/WebCore/platform/graphics/transforms/RotateTransformOperation.cpp (289598 => 289599)


--- trunk/Source/WebCore/platform/graphics/transforms/RotateTransformOperation.cpp	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/Source/WebCore/platform/graphics/transforms/RotateTransformOperation.cpp	2022-02-11 02:27:02 UTC (rev 289599)
@@ -39,9 +39,11 @@
 
 Ref<TransformOperation> RotateTransformOperation::blend(const TransformOperation* from, const BlendingContext& context, bool blendToIdentity)
 {
-    if (blendToIdentity)
+    if (blendToIdentity) {
+        if (context.compositeOperation == CompositeOperation::Accumulate)
+            return RotateTransformOperation::create(m_x, m_y, m_z, m_angle, type());
         return RotateTransformOperation::create(m_x, m_y, m_z, m_angle - m_angle * context.progress, type());
-
+    }
     auto outputType = sharedPrimitiveType(from);
     if (!outputType)
         return *this;

Modified: trunk/Source/WebCore/platform/graphics/transforms/TransformOperations.cpp (289598 => 289599)


--- trunk/Source/WebCore/platform/graphics/transforms/TransformOperations.cpp	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/Source/WebCore/platform/graphics/transforms/TransformOperations.cpp	2022-02-11 02:27:02 UTC (rev 289599)
@@ -74,16 +74,22 @@
     return false;
 }
 
-TransformOperations TransformOperations::blendByMatchingOperations(const TransformOperations& from, const BlendingContext& context) const
+TransformOperations TransformOperations::blendByMatchingOperations(const TransformOperations& from, const BlendingContext& context, const LayoutSize& boxSize) const
 {
     TransformOperations result;
 
-    unsigned fromSize = from.operations().size();
-    unsigned toSize = operations().size();
-    unsigned size = std::max(fromSize, toSize);
-    for (unsigned i = 0; i < size; i++) {
-        RefPtr<TransformOperation> fromOperation = (i < fromSize) ? from.operations()[i].get() : nullptr;
-        RefPtr<TransformOperation> toOperation = (i < toSize) ? operations()[i].get() : nullptr;
+    unsigned fromOperationCount = from.operations().size();
+    unsigned toOperationCount = operations().size();
+    unsigned maxOperationCount = std::max(fromOperationCount, toOperationCount);
+    
+    if (context.compositeOperation == CompositeOperation::Accumulate && (!from.isInvertible(boxSize) || !isInvertible(boxSize)))
+        return blendByUsingMatrixInterpolation(from, context, boxSize);
+    
+    for (unsigned i = 0; i < maxOperationCount; i++) {
+        RefPtr<TransformOperation> fromOperation = (i < fromOperationCount) ? from.operations()[i].get() : nullptr;
+        RefPtr<TransformOperation> toOperation = (i < toOperationCount) ? operations()[i].get() : nullptr;
+        if (fromOperation && toOperation && !fromOperation->sharedPrimitiveType(toOperation.get()))
+            return blendByUsingMatrixInterpolation(from, context, boxSize);
         RefPtr<TransformOperation> blendedOperation = toOperation ? toOperation->blend(fromOperation.get(), context) : (fromOperation ? RefPtr<TransformOperation>(fromOperation->blend(nullptr, context, true)) : nullptr);
         if (blendedOperation)
             result.operations().append(blendedOperation);
@@ -99,7 +105,7 @@
     return result;
 }
 
-TransformOperations TransformOperations::blendByUsingMatrixInterpolation(const TransformOperations& from, const BlendingContext& context, const LayoutSize& size) const
+TransformOperations TransformOperations::blendByUsingMatrixInterpolation(const TransformOperations& from, const BlendingContext& context, const LayoutSize& boxSize) const
 {
     TransformOperations result;
 
@@ -106,11 +112,9 @@
     // Convert the TransformOperations into matrices
     TransformationMatrix fromTransform;
     TransformationMatrix toTransform;
-    from.apply(size, fromTransform);
-    apply(size, toTransform);
-
-    toTransform.blend(fromTransform, context.progress);
-
+    from.apply(boxSize, fromTransform);
+    apply(boxSize, toTransform);
+    toTransform.blend(fromTransform, context.progress, context.compositeOperation);
     // Append the result
     result.operations().append(Matrix3DTransformOperation::create(toTransform));
 
@@ -123,7 +127,7 @@
         return *this;
 
     if (from.size() && from.operationsMatch(*this))
-        return blendByMatchingOperations(from, context);
+        return blendByMatchingOperations(from, context, size);
 
     return blendByUsingMatrixInterpolation(from, context, size);
 }

Modified: trunk/Source/WebCore/platform/graphics/transforms/TransformOperations.h (289598 => 289599)


--- trunk/Source/WebCore/platform/graphics/transforms/TransformOperations.h	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/Source/WebCore/platform/graphics/transforms/TransformOperations.h	2022-02-11 02:27:02 UTC (rev 289599)
@@ -84,8 +84,14 @@
 
     size_t size() const { return m_operations.size(); }
     const TransformOperation* at(size_t index) const { return index < m_operations.size() ? m_operations.at(index).get() : 0; }
-
-    TransformOperations blendByMatchingOperations(const TransformOperations& from, const BlendingContext&) const;
+    bool isInvertible(const LayoutSize& size) const
+    {
+        TransformationMatrix transform;
+        apply(size, transform);
+        return transform.isInvertible();
+    }
+    
+    TransformOperations blendByMatchingOperations(const TransformOperations& from, const BlendingContext&, const LayoutSize&) const;
     TransformOperations blendByUsingMatrixInterpolation(const TransformOperations& from, const BlendingContext&, const LayoutSize&) const;
     TransformOperations blend(const TransformOperations& from, const BlendingContext&, const LayoutSize&) const;
 

Modified: trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp (289598 => 289599)


--- trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp	2022-02-11 02:03:18 UTC (rev 289598)
+++ trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp	2022-02-11 02:27:02 UTC (rev 289599)
@@ -1637,10 +1637,17 @@
 
 static inline void blendFloat(double& from, double to, double progress, CompositeOperation compositeOperation)
 {
-    if (compositeOperation == CompositeOperation::Replace)
+    switch (compositeOperation) {
+    case CompositeOperation::Replace:
         from = from + (to - from) * progress;
-    else
+        break;
+    case CompositeOperation::Accumulate:
+        from += from + (to - from - 1) * progress;
+        break;
+    case CompositeOperation::Add:
         from += from + (to - from) * progress;
+        break;
+    }
 }
 
 void TransformationMatrix::blend2(const TransformationMatrix& from, double progress, CompositeOperation compositeOperation)
@@ -1672,20 +1679,46 @@
         else
             toDecomp.angle -= 360;
     }
-
+    
+    // When compositeOperation is accumulate, if the decomposed function is a 1-based value (for affine matrix these properties are
+    // m11, m22, scaleX and scaleY), use one based accumulation. Otherwise, use behavior for add.
+    auto operationForNonOneBasedValues = compositeOperation == CompositeOperation::Accumulate ? CompositeOperation::Add : compositeOperation;
     blendFloat(fromDecomp.m11, toDecomp.m11, progress, compositeOperation);
-    blendFloat(fromDecomp.m12, toDecomp.m12, progress, compositeOperation);
-    blendFloat(fromDecomp.m21, toDecomp.m21, progress, compositeOperation);
+    blendFloat(fromDecomp.m12, toDecomp.m12, progress, operationForNonOneBasedValues);
+    blendFloat(fromDecomp.m21, toDecomp.m21, progress, operationForNonOneBasedValues);
     blendFloat(fromDecomp.m22, toDecomp.m22, progress, compositeOperation);
-    blendFloat(fromDecomp.translateX, toDecomp.translateX, progress, compositeOperation);
-    blendFloat(fromDecomp.translateY, toDecomp.translateY, progress, compositeOperation);
+    blendFloat(fromDecomp.translateX, toDecomp.translateX, progress, operationForNonOneBasedValues);
+    blendFloat(fromDecomp.translateY, toDecomp.translateY, progress, operationForNonOneBasedValues);
     blendFloat(fromDecomp.scaleX, toDecomp.scaleX, progress, compositeOperation);
     blendFloat(fromDecomp.scaleY, toDecomp.scaleY, progress, compositeOperation);
-    blendFloat(fromDecomp.angle, toDecomp.angle, progress, compositeOperation);
-
+    blendFloat(fromDecomp.angle, toDecomp.angle, progress, operationForNonOneBasedValues);
     recompose2(fromDecomp);
 }
 
+// Compute quaternion multiplication
+static void accumulateQuaternion(double qa[4], const double qb[4])
+{
+    auto qx = (qb[3] * qa[0]) + (qb[0] * qa[3]) + (qb[1] * qa[2]) - (qb[2] * qa[1]);
+    auto qy = (qb[3] * qa[1]) + (qb[1] * qa[3]) + (qb[2] * qa[0]) - (qb[0] * qa[2]);
+    auto qz = (qb[3] * qa[2]) + (qb[2] * qa[3]) + (qb[0] * qa[1]) - (qb[1] * qa[0]);
+    auto qw = (qb[3] * qa[3]) - (qb[0] * qa[0]) - (qb[1] * qa[1]) - (qb[2] * qa[2]);
+    qa[0] = qx; qa[1] = qy; qa[2] = qz; qa[3] = qw;
+}
+
+static void interpolateQuaternion(TransformationMatrix::Decomposed4Type& fromDecomp, TransformationMatrix::Decomposed4Type& toDecomp, double progress, CompositeOperation compositeOperation)
+{
+    double qa[4] = { fromDecomp.quaternionX, fromDecomp.quaternionY, fromDecomp.quaternionZ, fromDecomp.quaternionW };
+    double qb[4] = { toDecomp.quaternionX, toDecomp.quaternionY, toDecomp.quaternionZ, toDecomp.quaternionW };
+    if (compositeOperation == CompositeOperation::Accumulate)
+        accumulateQuaternion(qa, qb);
+    else
+        slerp(qa, qb, progress);
+    fromDecomp.quaternionX = qa[0];
+    fromDecomp.quaternionY = qa[1];
+    fromDecomp.quaternionZ = qa[2];
+    fromDecomp.quaternionW = qa[3];
+    
+}
 void TransformationMatrix::blend4(const TransformationMatrix& from, double progress, CompositeOperation compositeOperation)
 {
     Decomposed4Type fromDecomp;
@@ -1695,28 +1728,34 @@
             *this = from;
         return;
     }
+    
+    // When compositeOperation is accumulate, if the decomposed function is a 1-based value (for non-affine matrix these properties are
+    // scaleX, scaleY, scaleZ, and perspectiveW), use one based accumulation. Otherwise, use behavior for add.
+    auto operationForNonOneBasedValues = compositeOperation == CompositeOperation::Accumulate ? CompositeOperation::Add : compositeOperation;
 
     blendFloat(fromDecomp.scaleX, toDecomp.scaleX, progress, compositeOperation);
     blendFloat(fromDecomp.scaleY, toDecomp.scaleY, progress, compositeOperation);
     blendFloat(fromDecomp.scaleZ, toDecomp.scaleZ, progress, compositeOperation);
-    blendFloat(fromDecomp.skewXY, toDecomp.skewXY, progress, compositeOperation);
-    blendFloat(fromDecomp.skewXZ, toDecomp.skewXZ, progress, compositeOperation);
-    blendFloat(fromDecomp.skewYZ, toDecomp.skewYZ, progress, compositeOperation);
-    blendFloat(fromDecomp.translateX, toDecomp.translateX, progress, compositeOperation);
-    blendFloat(fromDecomp.translateY, toDecomp.translateY, progress, compositeOperation);
-    blendFloat(fromDecomp.translateZ, toDecomp.translateZ, progress, compositeOperation);
-    blendFloat(fromDecomp.perspectiveX, toDecomp.perspectiveX, progress, compositeOperation);
-    blendFloat(fromDecomp.perspectiveY, toDecomp.perspectiveY, progress, compositeOperation);
-    blendFloat(fromDecomp.perspectiveZ, toDecomp.perspectiveZ, progress, compositeOperation);
+    blendFloat(fromDecomp.skewXY, toDecomp.skewXY, progress, operationForNonOneBasedValues);
+    blendFloat(fromDecomp.skewXZ, toDecomp.skewXZ, progress, operationForNonOneBasedValues);
+    blendFloat(fromDecomp.skewYZ, toDecomp.skewYZ, progress, operationForNonOneBasedValues);
+    blendFloat(fromDecomp.translateX, toDecomp.translateX, progress, operationForNonOneBasedValues);
+    blendFloat(fromDecomp.translateY, toDecomp.translateY, progress, operationForNonOneBasedValues);
+    blendFloat(fromDecomp.translateZ, toDecomp.translateZ, progress, operationForNonOneBasedValues);
+    blendFloat(fromDecomp.perspectiveX, toDecomp.perspectiveX, progress, operationForNonOneBasedValues);
+    blendFloat(fromDecomp.perspectiveY, toDecomp.perspectiveY, progress, operationForNonOneBasedValues);
+    blendFloat(fromDecomp.perspectiveZ, toDecomp.perspectiveZ, progress, operationForNonOneBasedValues);
     blendFloat(fromDecomp.perspectiveW, toDecomp.perspectiveW, progress, compositeOperation);
+    interpolateQuaternion(fromDecomp, toDecomp, progress, compositeOperation);
 
-    slerp(&fromDecomp.quaternionX, &toDecomp.quaternionX, progress);
-
     recompose4(fromDecomp);
 }
 
 void TransformationMatrix::blend(const TransformationMatrix& from, double progress, CompositeOperation compositeOperation)
 {
+    if (compositeOperation == CompositeOperation::Accumulate && (!from.isInvertible() || !isInvertible()))
+        compositeOperation = CompositeOperation::Replace;
+    
     if (!progress && compositeOperation == CompositeOperation::Replace) {
         *this = from;
         return;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to