Title: [289032] trunk
Revision
289032
Author
[email protected]
Date
2022-02-03 00:35:59 -0800 (Thu, 03 Feb 2022)

Log Message

Transform interpolation should blend between shared transform function primitives
https://bugs.webkit.org/show_bug.cgi?id=235311
<rdar://problem/88012700>

Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

Mark some tests as newly passing.

* web-platform-tests/css/css-transforms/animation/list-interpolation-expected.txt:
* web-platform-tests/css/css-transforms/animation/matrix-interpolation-expected.txt:
* web-platform-tests/css/css-transforms/animation/transform-interpolation-001-expected.txt:
* web-platform-tests/css/css-transforms/animation/transform-interpolation-002-expected.txt:
* web-platform-tests/css/css-transforms/animation/transform-interpolation-inline-value-expected.txt:
* web-platform-tests/css/css-transforms/animation/transform-interpolation-verify-reftests-expected.txt:
* web-platform-tests/css/css-transforms/animation/transform-translate-composition-expected.txt:

Source/WebCore:

No new tests. This is covered by existing WPT tests.

Allow direct interpolation between mismatching transform functions that share a primitive.
This fixes many tests expecting a certain computed transformation matrix in WPT, but also
allows using hardware animations more often for the CoreAnimation backend.

Rotation, scale, and translate are the only functions that have shared primitives, so they
are the only ones in this change to allow for this new behavior.

When determining if a list of keyframes has shared compatible lists of transforms, return
the vector of primitives that can represent them. In addition code for calculating big
rotations has been removed, because it was unused.

* platform/graphics/GraphicsLayer.cpp:
(WebCore::gSharedPrimitivesForTransformKeyframe): Added.
(WebCore::GraphicsLayer::getSharedPrimitivesForTransformKeyframes): Added.
* platform/graphics/GraphicsLayer.h:
* platform/graphics/ca/GraphicsLayerCA.cpp:
(WebCore::GraphicsLayerCA::appendToUncommittedAnimations): Modified to take a vector of shared
primitive types instead of a pointer to an array of operations.
(WebCore::GraphicsLayerCA::createTransformAnimationsFromKeyframes):
* platform/graphics/ca/GraphicsLayerCA.h:
* platform/graphics/texmap/GraphicsLayerTextureMapper.cpp:
(WebCore::GraphicsLayerTextureMapper::addAnimation): Use new method.
* platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp:
(WebCore::CoordinatedGraphicsLayer::addAnimation): Ditto.
* platform/graphics/transforms/Matrix3DTransformOperation.cpp:
(WebCore::Matrix3DTransformOperation::blend): Use the new sharedPrimitiveType method
to determine if the two operations can blend.
* platform/graphics/transforms/MatrixTransformOperation.cpp:
(WebCore::MatrixTransformOperation::blend): Ditto.
* platform/graphics/transforms/PerspectiveTransformOperation.cpp:
(WebCore::PerspectiveTransformOperation::blend): Ditto.
* platform/graphics/transforms/RotateTransformOperation.cpp:
(WebCore::RotateTransformOperation::blend): Ditto.
* platform/graphics/transforms/RotateTransformOperation.h:
* platform/graphics/transforms/ScaleTransformOperation.cpp:
(WebCore::ScaleTransformOperation::blend): Ditto.
* platform/graphics/transforms/ScaleTransformOperation.h:
* platform/graphics/transforms/SkewTransformOperation.cpp:
(WebCore::SkewTransformOperation::blend): Ditto.
* platform/graphics/transforms/TransformOperation.cpp:
(WebCore::TransformOperation::sharedPrimitiveType const):
* platform/graphics/transforms/TransformOperation.h:
(WebCore::TransformOperation::primitiveType const): Added this virtual function which
return the type for the base class. Rotation, scale, and translate specialize this to
return a compatible primitive type.
* platform/graphics/transforms/TransformOperations.cpp:
(WebCore::TransformOperations::operationsMatch const): Modified to check whether operations
share primitives.
* platform/graphics/transforms/TranslateTransformOperation.cpp:
(WebCore::TranslateTransformOperation::blend): Use the new sharedPrimitiveType method.
* platform/graphics/transforms/TranslateTransformOperation.h:

LayoutTests:

Remove a duplicated baseline.

* platform/glib/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-inline-value-expected.txt: Removed.

Modified Paths

Removed Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (289031 => 289032)


--- trunk/LayoutTests/ChangeLog	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/LayoutTests/ChangeLog	2022-02-03 08:35:59 UTC (rev 289032)
@@ -1,3 +1,15 @@
+2022-02-03  Martin Robinson  <[email protected]>
+
+        Transform interpolation should blend between shared transform function primitives
+        https://bugs.webkit.org/show_bug.cgi?id=235311
+        <rdar://problem/88012700>
+
+        Reviewed by Simon Fraser.
+
+        Remove a duplicated baseline.
+
+        * platform/glib/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-inline-value-expected.txt: Removed.
+
 2022-02-02  Carlos Garcia Campos  <[email protected]>
 
         [GTK][a11y] Set platform name to atspi in WTR

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (289031 => 289032)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2022-02-03 08:35:59 UTC (rev 289032)
@@ -1,3 +1,21 @@
+2022-02-03  Martin Robinson  <[email protected]>
+
+        Transform interpolation should blend between shared transform function primitives
+        https://bugs.webkit.org/show_bug.cgi?id=235311
+        <rdar://problem/88012700>
+
+        Reviewed by Simon Fraser.
+
+        Mark some tests as newly passing.
+
+        * web-platform-tests/css/css-transforms/animation/list-interpolation-expected.txt:
+        * web-platform-tests/css/css-transforms/animation/matrix-interpolation-expected.txt:
+        * web-platform-tests/css/css-transforms/animation/transform-interpolation-001-expected.txt:
+        * web-platform-tests/css/css-transforms/animation/transform-interpolation-002-expected.txt:
+        * web-platform-tests/css/css-transforms/animation/transform-interpolation-inline-value-expected.txt:
+        * web-platform-tests/css/css-transforms/animation/transform-interpolation-verify-reftests-expected.txt:
+        * web-platform-tests/css/css-transforms/animation/transform-translate-composition-expected.txt:
+
 2022-02-02  Patrick Griffis  <[email protected]>
 
         CSP: Implement wasm-unsafe-eval

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/list-interpolation-expected.txt (289031 => 289032)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/list-interpolation-expected.txt	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/list-interpolation-expected.txt	2022-02-03 08:35:59 UTC (rev 289032)
@@ -23,26 +23,26 @@
 PASS CSS Transitions with transition: all: property <transform> from [scale(2) rotate(360deg) translate(100px) matrix(1, 0, 0, 1, 100, 0) skew(0deg)] to [scale(3) rotate(1080deg) translate(200px) matrix(1, 0, 0, 1, 0, 200) skew(720deg)] at (0.25) should be [scale(2.25) rotate(540deg) translate(125px) matrix(1, 0, 0, 1, 75, 50) skew(180deg)]
 PASS CSS Animations: property <transform> from [scale(2) rotate(360deg) translate(100px) matrix(1, 0, 0, 1, 100, 0) skew(0deg)] to [scale(3) rotate(1080deg) translate(200px) matrix(1, 0, 0, 1, 0, 200) skew(720deg)] at (0.25) should be [scale(2.25) rotate(540deg) translate(125px) matrix(1, 0, 0, 1, 75, 50) skew(180deg)]
 PASS Web Animations: property <transform> from [scale(2) rotate(360deg) translate(100px) matrix(1, 0, 0, 1, 100, 0) skew(0deg)] to [scale(3) rotate(1080deg) translate(200px) matrix(1, 0, 0, 1, 0, 200) skew(720deg)] at (0.25) should be [scale(2.25) rotate(540deg) translate(125px) matrix(1, 0, 0, 1, 75, 50) skew(180deg)]
-FAIL CSS Transitions: property <transform> from [translateX(100px) scaleX(3) translate(500px) scale(2)] to [translateY(200px) scale(5) translateX(100px) scaleY(3)] at (0.25) should be [translate(75px, 50px) scale(3.5, 2) translate(400px, 0px) scale(1.75, 2.25)] assert_equals: expected "matrix ( 6.13 , 0 , 0 , 4.5 , 1475 , 50 ) " but got "matrix ( 5.75 , 0 , 0 , 5.25 , 1325 , 50 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [translateX(100px) scaleX(3) translate(500px) scale(2)] to [translateY(200px) scale(5) translateX(100px) scaleY(3)] at (0.25) should be [translate(75px, 50px) scale(3.5, 2) translate(400px, 0px) scale(1.75, 2.25)] assert_equals: expected "matrix ( 6.13 , 0 , 0 , 4.5 , 1475 , 50 ) " but got "matrix ( 5.75 , 0 , 0 , 5.25 , 1325 , 50 ) "
-FAIL CSS Animations: property <transform> from [translateX(100px) scaleX(3) translate(500px) scale(2)] to [translateY(200px) scale(5) translateX(100px) scaleY(3)] at (0.25) should be [translate(75px, 50px) scale(3.5, 2) translate(400px, 0px) scale(1.75, 2.25)] assert_equals: expected "matrix ( 6.13 , 0 , 0 , 4.5 , 1475 , 50 ) " but got "matrix ( 5.75 , 0 , 0 , 5.25 , 1325 , 50 ) "
-FAIL Web Animations: property <transform> from [translateX(100px) scaleX(3) translate(500px) scale(2)] to [translateY(200px) scale(5) translateX(100px) scaleY(3)] at (0.25) should be [translate(75px, 50px) scale(3.5, 2) translate(400px, 0px) scale(1.75, 2.25)] assert_equals: expected "matrix ( 6.13 , 0 , 0 , 4.5 , 1475 , 50 ) " but got "matrix ( 5.75 , 0 , 0 , 5.25 , 1325 , 50 ) "
-FAIL CSS Transitions: property <transform> from [rotateX(90deg) translateX(100px)] to [rotate3d(50, 0, 0, 180deg) translateY(200px)] at (0.25) should be [rotateX(112.5deg) translate(75px, 50px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , - 0.38 , 0.92 , 0 , 0 , - 0.92 , - 0.38 , 0 , 75 , - 19.13 , 46.19 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , - 0.38 , 0.92 , 0 , 0 , - 0.92 , - 0.38 , 0 , 75 , - 50 , 0 , 1 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [rotateX(90deg) translateX(100px)] to [rotate3d(50, 0, 0, 180deg) translateY(200px)] at (0.25) should be [rotateX(112.5deg) translate(75px, 50px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , - 0.38 , 0.92 , 0 , 0 , - 0.92 , - 0.38 , 0 , 75 , - 19.13 , 46.19 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , - 0.38 , 0.92 , 0 , 0 , - 0.92 , - 0.38 , 0 , 75 , - 50 , 0 , 1 ) "
-FAIL CSS Animations: property <transform> from [rotateX(90deg) translateX(100px)] to [rotate3d(50, 0, 0, 180deg) translateY(200px)] at (0.25) should be [rotateX(112.5deg) translate(75px, 50px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , - 0.38 , 0.92 , 0 , 0 , - 0.92 , - 0.38 , 0 , 75 , - 19.13 , 46.19 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , - 0.38 , 0.92 , 0 , 0 , - 0.92 , - 0.38 , 0 , 75 , - 50 , 0 , 1 ) "
-FAIL Web Animations: property <transform> from [rotateX(90deg) translateX(100px)] to [rotate3d(50, 0, 0, 180deg) translateY(200px)] at (0.25) should be [rotateX(112.5deg) translate(75px, 50px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , - 0.38 , 0.92 , 0 , 0 , - 0.92 , - 0.38 , 0 , 75 , - 19.13 , 46.19 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , - 0.38 , 0.92 , 0 , 0 , - 0.92 , - 0.38 , 0 , 75 , - 50 , 0 , 1 ) "
-FAIL CSS Transitions: property <transform> from [rotateX(90deg) translateX(100px)] to [rotateY(0deg) translateY(200px)] at (0.25) should be [rotateX(67.5deg) translate(75px, 50px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.38 , 0.92 , 0 , 0 , - 0.92 , 0.38 , 0 , 75 , 19.13 , 46.19 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.38 , 0.92 , 0 , 0 , - 0.92 , 0.38 , 0 , 75 , 50 , 0 , 1 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [rotateX(90deg) translateX(100px)] to [rotateY(0deg) translateY(200px)] at (0.25) should be [rotateX(67.5deg) translate(75px, 50px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.38 , 0.92 , 0 , 0 , - 0.92 , 0.38 , 0 , 75 , 19.13 , 46.19 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.38 , 0.92 , 0 , 0 , - 0.92 , 0.38 , 0 , 75 , 50 , 0 , 1 ) "
-FAIL CSS Animations: property <transform> from [rotateX(90deg) translateX(100px)] to [rotateY(0deg) translateY(200px)] at (0.25) should be [rotateX(67.5deg) translate(75px, 50px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.38 , 0.92 , 0 , 0 , - 0.92 , 0.38 , 0 , 75 , 19.13 , 46.19 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.38 , 0.92 , 0 , 0 , - 0.92 , 0.38 , 0 , 75 , 50 , 0 , 1 ) "
-FAIL Web Animations: property <transform> from [rotateX(90deg) translateX(100px)] to [rotateY(0deg) translateY(200px)] at (0.25) should be [rotateX(67.5deg) translate(75px, 50px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.38 , 0.92 , 0 , 0 , - 0.92 , 0.38 , 0 , 75 , 19.13 , 46.19 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.38 , 0.92 , 0 , 0 , - 0.92 , 0.38 , 0 , 75 , 50 , 0 , 1 ) "
-FAIL CSS Transitions: property <transform> from [rotate3d(1, 1, 1, -60deg) translateX(100px)] to [rotate3d(2, 2, 2, 60deg) translateY(200px)] at (0.25) should be [rotate3d(1, 1, 1, -30deg) translate(75px, 50px)] assert_equals: expected "matrix3d ( 0.91 , - 0.24 , 0.33 , 0 , 0.33 , 0.91 , - 0.24 , 0 , - 0.24 , 0.33 , 0.91 , 0 , 84.97 , 27.23 , 12.8 , 1 ) " but got "matrix3d ( 0.91 , - 0.24 , 0.33 , 0 , 0.33 , 0.91 , - 0.24 , 0 , - 0.24 , 0.33 , 0.91 , 0 , 33.33 , 8.33 , 83.33 , 1 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [rotate3d(1, 1, 1, -60deg) translateX(100px)] to [rotate3d(2, 2, 2, 60deg) translateY(200px)] at (0.25) should be [rotate3d(1, 1, 1, -30deg) translate(75px, 50px)] assert_equals: expected "matrix3d ( 0.91 , - 0.24 , 0.33 , 0 , 0.33 , 0.91 , - 0.24 , 0 , - 0.24 , 0.33 , 0.91 , 0 , 84.97 , 27.23 , 12.8 , 1 ) " but got "matrix3d ( 0.91 , - 0.24 , 0.33 , 0 , 0.33 , 0.91 , - 0.24 , 0 , - 0.24 , 0.33 , 0.91 , 0 , 33.33 , 8.33 , 83.33 , 1 ) "
-FAIL CSS Animations: property <transform> from [rotate3d(1, 1, 1, -60deg) translateX(100px)] to [rotate3d(2, 2, 2, 60deg) translateY(200px)] at (0.25) should be [rotate3d(1, 1, 1, -30deg) translate(75px, 50px)] assert_equals: expected "matrix3d ( 0.91 , - 0.24 , 0.33 , 0 , 0.33 , 0.91 , - 0.24 , 0 , - 0.24 , 0.33 , 0.91 , 0 , 84.97 , 27.23 , 12.8 , 1 ) " but got "matrix3d ( 0.91 , - 0.24 , 0.33 , 0 , 0.33 , 0.91 , - 0.24 , 0 , - 0.24 , 0.33 , 0.91 , 0 , 33.33 , 8.33 , 83.33 , 1 ) "
-FAIL Web Animations: property <transform> from [rotate3d(1, 1, 1, -60deg) translateX(100px)] to [rotate3d(2, 2, 2, 60deg) translateY(200px)] at (0.25) should be [rotate3d(1, 1, 1, -30deg) translate(75px, 50px)] assert_equals: expected "matrix3d ( 0.91 , - 0.24 , 0.33 , 0 , 0.33 , 0.91 , - 0.24 , 0 , - 0.24 , 0.33 , 0.91 , 0 , 84.97 , 27.23 , 12.8 , 1 ) " but got "matrix3d ( 0.91 , - 0.24 , 0.33 , 0 , 0.33 , 0.91 , - 0.24 , 0 , - 0.24 , 0.33 , 0.91 , 0 , 33.33 , 8.33 , 83.33 , 1 ) "
-FAIL CSS Transitions: property <transform> from [rotate3d(1, 0, 0, 360deg) translateX(100px)] to [rotate3d(0, 1, 0, -720deg) translateY(200px)] at (0.25) should be [rotate3d(0, 0, 1, 0deg) translate(75px, 50px)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 75 , 50 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 75 , 50 , 0 , 1 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [rotate3d(1, 0, 0, 360deg) translateX(100px)] to [rotate3d(0, 1, 0, -720deg) translateY(200px)] at (0.25) should be [rotate3d(0, 0, 1, 0deg) translate(75px, 50px)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 75 , 50 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 75 , 50 , 0 , 1 ) "
-FAIL CSS Animations: property <transform> from [rotate3d(1, 0, 0, 360deg) translateX(100px)] to [rotate3d(0, 1, 0, -720deg) translateY(200px)] at (0.25) should be [rotate3d(0, 0, 1, 0deg) translate(75px, 50px)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 75 , 50 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 75 , 50 , 0 , 1 ) "
-FAIL Web Animations: property <transform> from [rotate3d(1, 0, 0, 360deg) translateX(100px)] to [rotate3d(0, 1, 0, -720deg) translateY(200px)] at (0.25) should be [rotate3d(0, 0, 1, 0deg) translate(75px, 50px)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 75 , 50 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 75 , 50 , 0 , 1 ) "
+PASS CSS Transitions: property <transform> from [translateX(100px) scaleX(3) translate(500px) scale(2)] to [translateY(200px) scale(5) translateX(100px) scaleY(3)] at (0.25) should be [translate(75px, 50px) scale(3.5, 2) translate(400px, 0px) scale(1.75, 2.25)]
+PASS CSS Transitions with transition: all: property <transform> from [translateX(100px) scaleX(3) translate(500px) scale(2)] to [translateY(200px) scale(5) translateX(100px) scaleY(3)] at (0.25) should be [translate(75px, 50px) scale(3.5, 2) translate(400px, 0px) scale(1.75, 2.25)]
+PASS CSS Animations: property <transform> from [translateX(100px) scaleX(3) translate(500px) scale(2)] to [translateY(200px) scale(5) translateX(100px) scaleY(3)] at (0.25) should be [translate(75px, 50px) scale(3.5, 2) translate(400px, 0px) scale(1.75, 2.25)]
+PASS Web Animations: property <transform> from [translateX(100px) scaleX(3) translate(500px) scale(2)] to [translateY(200px) scale(5) translateX(100px) scaleY(3)] at (0.25) should be [translate(75px, 50px) scale(3.5, 2) translate(400px, 0px) scale(1.75, 2.25)]
+PASS CSS Transitions: property <transform> from [rotateX(90deg) translateX(100px)] to [rotate3d(50, 0, 0, 180deg) translateY(200px)] at (0.25) should be [rotateX(112.5deg) translate(75px, 50px)]
+PASS CSS Transitions with transition: all: property <transform> from [rotateX(90deg) translateX(100px)] to [rotate3d(50, 0, 0, 180deg) translateY(200px)] at (0.25) should be [rotateX(112.5deg) translate(75px, 50px)]
+PASS CSS Animations: property <transform> from [rotateX(90deg) translateX(100px)] to [rotate3d(50, 0, 0, 180deg) translateY(200px)] at (0.25) should be [rotateX(112.5deg) translate(75px, 50px)]
+PASS Web Animations: property <transform> from [rotateX(90deg) translateX(100px)] to [rotate3d(50, 0, 0, 180deg) translateY(200px)] at (0.25) should be [rotateX(112.5deg) translate(75px, 50px)]
+PASS CSS Transitions: property <transform> from [rotateX(90deg) translateX(100px)] to [rotateY(0deg) translateY(200px)] at (0.25) should be [rotateX(67.5deg) translate(75px, 50px)]
+PASS CSS Transitions with transition: all: property <transform> from [rotateX(90deg) translateX(100px)] to [rotateY(0deg) translateY(200px)] at (0.25) should be [rotateX(67.5deg) translate(75px, 50px)]
+PASS CSS Animations: property <transform> from [rotateX(90deg) translateX(100px)] to [rotateY(0deg) translateY(200px)] at (0.25) should be [rotateX(67.5deg) translate(75px, 50px)]
+PASS Web Animations: property <transform> from [rotateX(90deg) translateX(100px)] to [rotateY(0deg) translateY(200px)] at (0.25) should be [rotateX(67.5deg) translate(75px, 50px)]
+PASS CSS Transitions: property <transform> from [rotate3d(1, 1, 1, -60deg) translateX(100px)] to [rotate3d(2, 2, 2, 60deg) translateY(200px)] at (0.25) should be [rotate3d(1, 1, 1, -30deg) translate(75px, 50px)]
+PASS CSS Transitions with transition: all: property <transform> from [rotate3d(1, 1, 1, -60deg) translateX(100px)] to [rotate3d(2, 2, 2, 60deg) translateY(200px)] at (0.25) should be [rotate3d(1, 1, 1, -30deg) translate(75px, 50px)]
+PASS CSS Animations: property <transform> from [rotate3d(1, 1, 1, -60deg) translateX(100px)] to [rotate3d(2, 2, 2, 60deg) translateY(200px)] at (0.25) should be [rotate3d(1, 1, 1, -30deg) translate(75px, 50px)]
+PASS Web Animations: property <transform> from [rotate3d(1, 1, 1, -60deg) translateX(100px)] to [rotate3d(2, 2, 2, 60deg) translateY(200px)] at (0.25) should be [rotate3d(1, 1, 1, -30deg) translate(75px, 50px)]
+PASS CSS Transitions: property <transform> from [rotate3d(1, 0, 0, 360deg) translateX(100px)] to [rotate3d(0, 1, 0, -720deg) translateY(200px)] at (0.25) should be [rotate3d(0, 0, 1, 0deg) translate(75px, 50px)]
+PASS CSS Transitions with transition: all: property <transform> from [rotate3d(1, 0, 0, 360deg) translateX(100px)] to [rotate3d(0, 1, 0, -720deg) translateY(200px)] at (0.25) should be [rotate3d(0, 0, 1, 0deg) translate(75px, 50px)]
+PASS CSS Animations: property <transform> from [rotate3d(1, 0, 0, 360deg) translateX(100px)] to [rotate3d(0, 1, 0, -720deg) translateY(200px)] at (0.25) should be [rotate3d(0, 0, 1, 0deg) translate(75px, 50px)]
+PASS Web Animations: property <transform> from [rotate3d(1, 0, 0, 360deg) translateX(100px)] to [rotate3d(0, 1, 0, -720deg) translateY(200px)] at (0.25) should be [rotate3d(0, 0, 1, 0deg) translate(75px, 50px)]
 FAIL CSS Transitions: property <transform> from [rotate(0deg) translate(100px)] to [rotate(720deg) scale(2) translate(200px)] at (0.25) should be [rotate(180deg) matrix(1.25, 0, 0, 1.25, 175, 0)] assert_equals: expected "matrix ( - 1.25 , 0 , 0 , - 1.25 , - 175 , 0 ) " but got "matrix ( 1.25 , 0 , 0 , 1.25 , 175 , 0 ) "
 FAIL CSS Transitions with transition: all: property <transform> from [rotate(0deg) translate(100px)] to [rotate(720deg) scale(2) translate(200px)] at (0.25) should be [rotate(180deg) matrix(1.25, 0, 0, 1.25, 175, 0)] assert_equals: expected "matrix ( - 1.25 , 0 , 0 , - 1.25 , - 175 , 0 ) " but got "matrix ( 1.25 , 0 , 0 , 1.25 , 175 , 0 ) "
 FAIL CSS Animations: property <transform> from [rotate(0deg) translate(100px)] to [rotate(720deg) scale(2) translate(200px)] at (0.25) should be [rotate(180deg) matrix(1.25, 0, 0, 1.25, 175, 0)] assert_equals: expected "matrix ( - 1.25 , 0 , 0 , - 1.25 , - 175 , 0 ) " but got "matrix ( 1.25 , 0 , 0 , 1.25 , 175 , 0 ) "

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/matrix-interpolation-expected.txt (289031 => 289032)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/matrix-interpolation-expected.txt	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/matrix-interpolation-expected.txt	2022-02-03 08:35:59 UTC (rev 289032)
@@ -1,6 +1,6 @@
 
-FAIL CSS Transitions: property <transform> from [rotateY(360deg)] to [rotateX(720deg)] at (0.5) should be [matrix(1, 0, 0, 1, 0, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 0 , 0 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [rotateY(360deg)] to [rotateX(720deg)] at (0.5) should be [matrix(1, 0, 0, 1, 0, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 0 , 0 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL CSS Animations: property <transform> from [rotateY(360deg)] to [rotateX(720deg)] at (0.5) should be [matrix(1, 0, 0, 1, 0, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 0 , 0 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL Web Animations: property <transform> from [rotateY(360deg)] to [rotateX(720deg)] at (0.5) should be [matrix(1, 0, 0, 1, 0, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 0 , 0 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 ) "
+PASS CSS Transitions: property <transform> from [rotateY(360deg)] to [rotateX(720deg)] at (0.5) should be [matrix(1, 0, 0, 1, 0, 0)]
+PASS CSS Transitions with transition: all: property <transform> from [rotateY(360deg)] to [rotateX(720deg)] at (0.5) should be [matrix(1, 0, 0, 1, 0, 0)]
+PASS CSS Animations: property <transform> from [rotateY(360deg)] to [rotateX(720deg)] at (0.5) should be [matrix(1, 0, 0, 1, 0, 0)]
+PASS Web Animations: property <transform> from [rotateY(360deg)] to [rotateX(720deg)] at (0.5) should be [matrix(1, 0, 0, 1, 0, 0)]
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-001-expected.txt (289031 => 289032)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-001-expected.txt	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-001-expected.txt	2022-02-03 08:35:59 UTC (rev 289032)
@@ -209,50 +209,50 @@
 PASS Web Animations: property <transform> from [rotateZ(0deg)] to [rotateZ(900deg)] at (2) should be [rotateZ(1800deg)]
 PASS CSS Transitions: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (-1) should be [rotateY(-900deg)]
 PASS CSS Transitions: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0) should be [rotateY(0deg)]
-FAIL CSS Transitions: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.25) should be [rotateY(225deg)] assert_equals: expected "matrix3d ( - 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL CSS Transitions: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.75) should be [rotateY(675deg)] assert_equals: expected "matrix3d ( 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( - 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) "
+PASS CSS Transitions: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.25) should be [rotateY(225deg)]
+PASS CSS Transitions: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.75) should be [rotateY(675deg)]
 PASS CSS Transitions: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (1) should be [rotateY(900deg)]
 PASS CSS Transitions: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (2) should be [rotateY(1800deg)]
 PASS CSS Transitions with transition: all: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (-1) should be [rotateY(-900deg)]
 PASS CSS Transitions with transition: all: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0) should be [rotateY(0deg)]
-FAIL CSS Transitions with transition: all: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.25) should be [rotateY(225deg)] assert_equals: expected "matrix3d ( - 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.75) should be [rotateY(675deg)] assert_equals: expected "matrix3d ( 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( - 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) "
+PASS CSS Transitions with transition: all: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.25) should be [rotateY(225deg)]
+PASS CSS Transitions with transition: all: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.75) should be [rotateY(675deg)]
 PASS CSS Transitions with transition: all: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (1) should be [rotateY(900deg)]
 PASS CSS Transitions with transition: all: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (2) should be [rotateY(1800deg)]
 PASS CSS Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (-1) should be [rotateY(-900deg)]
 PASS CSS Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0) should be [rotateY(0deg)]
-FAIL CSS Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.25) should be [rotateY(225deg)] assert_equals: expected "matrix3d ( - 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL CSS Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.75) should be [rotateY(675deg)] assert_equals: expected "matrix3d ( 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( - 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) "
+PASS CSS Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.25) should be [rotateY(225deg)]
+PASS CSS Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.75) should be [rotateY(675deg)]
 PASS CSS Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (1) should be [rotateY(900deg)]
 PASS CSS Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (2) should be [rotateY(1800deg)]
 PASS Web Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (-1) should be [rotateY(-900deg)]
 PASS Web Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0) should be [rotateY(0deg)]
-FAIL Web Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.25) should be [rotateY(225deg)] assert_equals: expected "matrix3d ( - 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL Web Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.75) should be [rotateY(675deg)] assert_equals: expected "matrix3d ( 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( - 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) "
+PASS Web Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.25) should be [rotateY(225deg)]
+PASS Web Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (0.75) should be [rotateY(675deg)]
 PASS Web Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (1) should be [rotateY(900deg)]
 PASS Web Animations: property <transform> from [rotateX(0deg)] to [rotateY(900deg)] at (2) should be [rotateY(1800deg)]
 PASS CSS Transitions: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (-1) should be [rotateY(1800deg)]
 PASS CSS Transitions: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0) should be [rotateY(900deg)]
-FAIL CSS Transitions: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.25) should be [rotateY(675deg)] assert_equals: expected "matrix3d ( 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( - 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL CSS Transitions: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.75) should be [rotateY(225deg)] assert_equals: expected "matrix3d ( - 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) "
+PASS CSS Transitions: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.25) should be [rotateY(675deg)]
+PASS CSS Transitions: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.75) should be [rotateY(225deg)]
 PASS CSS Transitions: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (1) should be [rotateY(0deg)]
 PASS CSS Transitions: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (2) should be [rotateY(-900deg)]
 PASS CSS Transitions with transition: all: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (-1) should be [rotateY(1800deg)]
 PASS CSS Transitions with transition: all: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0) should be [rotateY(900deg)]
-FAIL CSS Transitions with transition: all: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.25) should be [rotateY(675deg)] assert_equals: expected "matrix3d ( 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( - 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.75) should be [rotateY(225deg)] assert_equals: expected "matrix3d ( - 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) "
+PASS CSS Transitions with transition: all: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.25) should be [rotateY(675deg)]
+PASS CSS Transitions with transition: all: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.75) should be [rotateY(225deg)]
 PASS CSS Transitions with transition: all: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (1) should be [rotateY(0deg)]
 PASS CSS Transitions with transition: all: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (2) should be [rotateY(-900deg)]
 PASS CSS Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (-1) should be [rotateY(1800deg)]
 PASS CSS Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0) should be [rotateY(900deg)]
-FAIL CSS Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.25) should be [rotateY(675deg)] assert_equals: expected "matrix3d ( 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( - 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL CSS Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.75) should be [rotateY(225deg)] assert_equals: expected "matrix3d ( - 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) "
+PASS CSS Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.25) should be [rotateY(675deg)]
+PASS CSS Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.75) should be [rotateY(225deg)]
 PASS CSS Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (1) should be [rotateY(0deg)]
 PASS CSS Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (2) should be [rotateY(-900deg)]
 PASS Web Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (-1) should be [rotateY(1800deg)]
 PASS Web Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0) should be [rotateY(900deg)]
-FAIL Web Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.25) should be [rotateY(675deg)] assert_equals: expected "matrix3d ( 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( - 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL Web Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.75) should be [rotateY(225deg)] assert_equals: expected "matrix3d ( - 0.71 , 0 , 0.71 , 0 , 0 , 1 , 0 , 0 , - 0.71 , 0 , - 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0.71 , 0 , 0 , 0 , 0 , 1 ) "
+PASS Web Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.25) should be [rotateY(675deg)]
+PASS Web Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (0.75) should be [rotateY(225deg)]
 PASS Web Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (1) should be [rotateY(0deg)]
 PASS Web Animations: property <transform> from [rotateY(900deg)] to [rotateZ(0deg)] at (2) should be [rotateY(-900deg)]
 PASS CSS Transitions: property <transform> from [rotate3d(7, 8, 9, 100deg)] to [rotate3d(7, 8, 9, 260deg)] at (-1) should be [rotate3d(7, 8, 9, -60deg)]

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-002-expected.txt (289031 => 289032)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-002-expected.txt	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-002-expected.txt	2022-02-03 08:35:59 UTC (rev 289032)
@@ -119,30 +119,30 @@
 PASS Web Animations: property <transform> from [scale3d(10, 0.5, 1)] to [scale3d(20, 1, 2)] at (0.75) should be [scale3d(17.5, 0.875, 1.75)]
 PASS Web Animations: property <transform> from [scale3d(10, 0.5, 1)] to [scale3d(20, 1, 2)] at (1) should be [scale3d(20, 1, 2)]
 PASS Web Animations: property <transform> from [scale3d(10, 0.5, 1)] to [scale3d(20, 1, 2)] at (2) should be [scale3d(30, 1.5, 3)]
-FAIL CSS Transitions: property <transform> from [scaleX(0)] to [scaleY(0)] at (-1) should be [scale(-1, 2)] assert_equals: expected "matrix ( - 1 , 0 , 0 , 2 , 0 , 0 ) " but got "matrix ( 1 , 0 , 0 , 4 , 0 , 0 ) "
+PASS CSS Transitions: property <transform> from [scaleX(0)] to [scaleY(0)] at (-1) should be [scale(-1, 2)]
 PASS CSS Transitions: property <transform> from [scaleX(0)] to [scaleY(0)] at (0) should be [scale(0, 1)]
-FAIL CSS Transitions: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.25) should be [scale(0.25, 0.75)] assert_equals: expected "matrix ( 0.25 , 0 , 0 , 0.75 , 0 , 0 ) " but got "matrix ( 0.06 , 0 , 0 , 0.56 , 0 , 0 ) "
-FAIL CSS Transitions: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.75) should be [scale(0.75, 0.25)] assert_equals: expected "matrix ( 0.75 , 0 , 0 , 0.25 , 0 , 0 ) " but got "matrix ( 0.56 , 0 , 0 , 0.06 , 0 , 0 ) "
+PASS CSS Transitions: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.25) should be [scale(0.25, 0.75)]
+PASS CSS Transitions: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.75) should be [scale(0.75, 0.25)]
 PASS CSS Transitions: property <transform> from [scaleX(0)] to [scaleY(0)] at (1) should be [scale(1, 0)]
-FAIL CSS Transitions: property <transform> from [scaleX(0)] to [scaleY(0)] at (2) should be [scale(2, -1)] assert_equals: expected "matrix ( 2 , 0 , 0 , - 1 , 0 , 0 ) " but got "matrix ( 4 , 0 , 0 , 1 , 0 , 0 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [scaleX(0)] to [scaleY(0)] at (-1) should be [scale(-1, 2)] assert_equals: expected "matrix ( - 1 , 0 , 0 , 2 , 0 , 0 ) " but got "matrix ( 1 , 0 , 0 , 4 , 0 , 0 ) "
+PASS CSS Transitions: property <transform> from [scaleX(0)] to [scaleY(0)] at (2) should be [scale(2, -1)]
+PASS CSS Transitions with transition: all: property <transform> from [scaleX(0)] to [scaleY(0)] at (-1) should be [scale(-1, 2)]
 PASS CSS Transitions with transition: all: property <transform> from [scaleX(0)] to [scaleY(0)] at (0) should be [scale(0, 1)]
-FAIL CSS Transitions with transition: all: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.25) should be [scale(0.25, 0.75)] assert_equals: expected "matrix ( 0.25 , 0 , 0 , 0.75 , 0 , 0 ) " but got "matrix ( 0.06 , 0 , 0 , 0.56 , 0 , 0 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.75) should be [scale(0.75, 0.25)] assert_equals: expected "matrix ( 0.75 , 0 , 0 , 0.25 , 0 , 0 ) " but got "matrix ( 0.56 , 0 , 0 , 0.06 , 0 , 0 ) "
+PASS CSS Transitions with transition: all: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.25) should be [scale(0.25, 0.75)]
+PASS CSS Transitions with transition: all: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.75) should be [scale(0.75, 0.25)]
 PASS CSS Transitions with transition: all: property <transform> from [scaleX(0)] to [scaleY(0)] at (1) should be [scale(1, 0)]
-FAIL CSS Transitions with transition: all: property <transform> from [scaleX(0)] to [scaleY(0)] at (2) should be [scale(2, -1)] assert_equals: expected "matrix ( 2 , 0 , 0 , - 1 , 0 , 0 ) " but got "matrix ( 4 , 0 , 0 , 1 , 0 , 0 ) "
-FAIL CSS Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (-1) should be [scale(-1, 2)] assert_equals: expected "matrix ( - 1 , 0 , 0 , 2 , 0 , 0 ) " but got "matrix ( 1 , 0 , 0 , 4 , 0 , 0 ) "
+PASS CSS Transitions with transition: all: property <transform> from [scaleX(0)] to [scaleY(0)] at (2) should be [scale(2, -1)]
+PASS CSS Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (-1) should be [scale(-1, 2)]
 PASS CSS Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (0) should be [scale(0, 1)]
-FAIL CSS Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.25) should be [scale(0.25, 0.75)] assert_equals: expected "matrix ( 0.25 , 0 , 0 , 0.75 , 0 , 0 ) " but got "matrix ( 0.06 , 0 , 0 , 0.56 , 0 , 0 ) "
-FAIL CSS Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.75) should be [scale(0.75, 0.25)] assert_equals: expected "matrix ( 0.75 , 0 , 0 , 0.25 , 0 , 0 ) " but got "matrix ( 0.56 , 0 , 0 , 0.06 , 0 , 0 ) "
+PASS CSS Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.25) should be [scale(0.25, 0.75)]
+PASS CSS Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.75) should be [scale(0.75, 0.25)]
 PASS CSS Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (1) should be [scale(1, 0)]
-FAIL CSS Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (2) should be [scale(2, -1)] assert_equals: expected "matrix ( 2 , 0 , 0 , - 1 , 0 , 0 ) " but got "matrix ( 4 , 0 , 0 , 1 , 0 , 0 ) "
-FAIL Web Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (-1) should be [scale(-1, 2)] assert_equals: expected "matrix ( - 1 , 0 , 0 , 2 , 0 , 0 ) " but got "matrix ( 1 , 0 , 0 , 4 , 0 , 0 ) "
+PASS CSS Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (2) should be [scale(2, -1)]
+PASS Web Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (-1) should be [scale(-1, 2)]
 PASS Web Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (0) should be [scale(0, 1)]
-FAIL Web Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.25) should be [scale(0.25, 0.75)] assert_equals: expected "matrix ( 0.25 , 0 , 0 , 0.75 , 0 , 0 ) " but got "matrix ( 0.06 , 0 , 0 , 0.56 , 0 , 0 ) "
-FAIL Web Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.75) should be [scale(0.75, 0.25)] assert_equals: expected "matrix ( 0.75 , 0 , 0 , 0.25 , 0 , 0 ) " but got "matrix ( 0.56 , 0 , 0 , 0.06 , 0 , 0 ) "
+PASS Web Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.25) should be [scale(0.25, 0.75)]
+PASS Web Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (0.75) should be [scale(0.75, 0.25)]
 PASS Web Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (1) should be [scale(1, 0)]
-FAIL Web Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (2) should be [scale(2, -1)] assert_equals: expected "matrix ( 2 , 0 , 0 , - 1 , 0 , 0 ) " but got "matrix ( 4 , 0 , 0 , 1 , 0 , 0 ) "
+PASS Web Animations: property <transform> from [scaleX(0)] to [scaleY(0)] at (2) should be [scale(2, -1)]
 PASS CSS Transitions: property <transform> from [none] to [scale3d(2, 3, 5)] at (-1) should be [scale3d(0, -1, -3)]
 PASS CSS Transitions: property <transform> from [none] to [scale3d(2, 3, 5)] at (0) should be [scale3d(1, 1, 1)]
 PASS CSS Transitions: property <transform> from [none] to [scale3d(2, 3, 5)] at (0.25) should be [scale3d(1.25, 1.5, 2)]

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-inline-value-expected.txt (289031 => 289032)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-inline-value-expected.txt	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-inline-value-expected.txt	2022-02-03 08:35:59 UTC (rev 289032)
@@ -16,7 +16,7 @@
 FAIL Interpolation between rotateZ(30deg) and rotateZ(90deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "rotateZ(60deg)" but got "matrix(0.5, 0.866025, -0.866025, 0.5, 0, 0)"
 FAIL Interpolation between rotate(0deg) and rotateZ(90deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "rotate3d(0, 0, 1, 45deg)" but got "matrix(0.707107, 0.707107, -0.707107, 0.707107, 0, 0)"
 FAIL Interpolation between rotateX(0deg) and rotateX(90deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "rotateX(45deg)" but got "matrix3d(1, 0, 0, 0, 0, 0.707107, 0.707107, 0, 0, -0.707107, 0.707107, 0, 0, 0, 0, 1)"
-FAIL Interpolation between rotate(0deg) and rotateX(90deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "rotate3d(1, 0, 0, 45deg)" but got "matrix3d(1, 0, 0, 0, 0, 0.5, 0.5, 0, 0, -0.5, 0.5, 0, 0, 0, 0, 1)"
+FAIL Interpolation between rotate(0deg) and rotateX(90deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "rotate3d(1, 0, 0, 45deg)" but got "matrix3d(1, 0, 0, 0, 0, 0.707107, 0.707107, 0, 0, -0.707107, 0.707107, 0, 0, 0, 0, 1)"
 FAIL Interpolation between scale(1) and scale(2) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scale(1.5)" but got "matrix(1.5, 0, 0, 1.5, 0, 0)"
 FAIL Interpolation between scale(1, 3) and scale(2) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scale(1.5, 2.5)" but got "matrix(1.5, 0, 0, 2.5, 0, 0)"
 FAIL Interpolation between scaleX(1) and scaleX(2) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scaleX(1.5)" but got "matrix(1.5, 0, 0, 1, 0, 0)"

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-verify-reftests-expected.txt (289031 => 289032)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-verify-reftests-expected.txt	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-verify-reftests-expected.txt	2022-02-03 08:35:59 UTC (rev 289032)
@@ -71,10 +71,10 @@
 PASS CSS Transitions with transition: all: property <transform> from [rotateX(0deg)] to [rotate(90deg)] at (0.5) should be [rotate(45deg)]
 PASS CSS Animations: property <transform> from [rotateX(0deg)] to [rotate(90deg)] at (0.5) should be [rotate(45deg)]
 PASS Web Animations: property <transform> from [rotateX(0deg)] to [rotate(90deg)] at (0.5) should be [rotate(45deg)]
-FAIL CSS Transitions: property <transform> from [rotateX(90deg)] to [rotate(0deg)] at (0.5) should be [rotateX(45deg)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.71 , 0.71 , 0 , 0 , - 0.71 , 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.5 , 0.5 , 0 , 0 , - 0.5 , 0.5 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [rotateX(90deg)] to [rotate(0deg)] at (0.5) should be [rotateX(45deg)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.71 , 0.71 , 0 , 0 , - 0.71 , 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.5 , 0.5 , 0 , 0 , - 0.5 , 0.5 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL CSS Animations: property <transform> from [rotateX(90deg)] to [rotate(0deg)] at (0.5) should be [rotateX(45deg)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.71 , 0.71 , 0 , 0 , - 0.71 , 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.5 , 0.5 , 0 , 0 , - 0.5 , 0.5 , 0 , 0 , 0 , 0 , 1 ) "
-FAIL Web Animations: property <transform> from [rotateX(90deg)] to [rotate(0deg)] at (0.5) should be [rotateX(45deg)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.71 , 0.71 , 0 , 0 , - 0.71 , 0.71 , 0 , 0 , 0 , 0 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 0.5 , 0.5 , 0 , 0 , - 0.5 , 0.5 , 0 , 0 , 0 , 0 , 1 ) "
+PASS CSS Transitions: property <transform> from [rotateX(90deg)] to [rotate(0deg)] at (0.5) should be [rotateX(45deg)]
+PASS CSS Transitions with transition: all: property <transform> from [rotateX(90deg)] to [rotate(0deg)] at (0.5) should be [rotateX(45deg)]
+PASS CSS Animations: property <transform> from [rotateX(90deg)] to [rotate(0deg)] at (0.5) should be [rotateX(45deg)]
+PASS Web Animations: property <transform> from [rotateX(90deg)] to [rotate(0deg)] at (0.5) should be [rotateX(45deg)]
 FAIL CSS Transitions: property <transform> from [rotateX(360deg)] to [rotateZ(90deg)] at (0.5) should be [rotateZ(45deg)] assert_equals: expected "matrix ( 0.71 , 0.71 , - 0.71 , 0.71 , 0 , 0 ) " but got "matrix3d ( 0.71 , 0.71 , 0 , 0 , - 0.71 , 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 ) "
 FAIL CSS Transitions with transition: all: property <transform> from [rotateX(360deg)] to [rotateZ(90deg)] at (0.5) should be [rotateZ(45deg)] assert_equals: expected "matrix ( 0.71 , 0.71 , - 0.71 , 0.71 , 0 , 0 ) " but got "matrix3d ( 0.71 , 0.71 , 0 , 0 , - 0.71 , 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 ) "
 FAIL CSS Animations: property <transform> from [rotateX(360deg)] to [rotateZ(90deg)] at (0.5) should be [rotateZ(45deg)] assert_equals: expected "matrix ( 0.71 , 0.71 , - 0.71 , 0.71 , 0 , 0 ) " but got "matrix3d ( 0.71 , 0.71 , 0 , 0 , - 0.71 , 0.71 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 ) "

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


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-translate-composition-expected.txt	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-translate-composition-expected.txt	2022-02-03 08:35:59 UTC (rev 289032)
@@ -41,13 +41,13 @@
 PASS Compositing: property <transform> underlying [translateZ(100px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (0.75) should be [translateZ(300px)]
 PASS Compositing: property <transform> underlying [translateZ(100px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (1) should be [translateZ(350px)]
 PASS Compositing: property <transform> underlying [translateZ(100px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (1.5) should be [translateZ(450px)]
-FAIL Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (-0.5) should be [translate3d(100px, 50px, -50px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 100 , 50 , - 50 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , - 50 , 1 ) "
-FAIL Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (0) should be [translate3d(100px, 50px, 50px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 100 , 50 , 50 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 50 , 1 ) "
-FAIL Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (0.25) should be [translate3d(100px, 50px, 100px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 100 , 50 , 100 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 100 , 1 ) "
-FAIL Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (0.5) should be [translate3d(100px, 50px, 150px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 100 , 50 , 150 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 150 , 1 ) "
-FAIL Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (0.75) should be [translate3d(100px, 50px, 200px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 100 , 50 , 200 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 200 , 1 ) "
-FAIL Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (1) should be [translate3d(100px, 50px, 250px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 100 , 50 , 250 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 250 , 1 ) "
-FAIL Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (1.5) should be [translate3d(100px, 50px, 350px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 100 , 50 , 350 , 1 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 350 , 1 ) "
+PASS Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (-0.5) should be [translate3d(100px, 50px, -50px)]
+PASS Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (0) should be [translate3d(100px, 50px, 50px)]
+PASS Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (0.25) should be [translate3d(100px, 50px, 100px)]
+PASS Compositing: property <transform> underlying [translate(100px, 50px)] from accumulate [translateZ(50px)] to accumulate [translateZ(250px)] at (0.5) should be [translate3d(100px, 50px, 150px)]
+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 ) "

Deleted: trunk/LayoutTests/platform/glib/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-inline-value-expected.txt (289031 => 289032)


--- trunk/LayoutTests/platform/glib/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-inline-value-expected.txt	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/LayoutTests/platform/glib/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-inline-value-expected.txt	2022-02-03 08:35:59 UTC (rev 289032)
@@ -1,43 +0,0 @@
-
-FAIL Interpolation between translateX(0px) and translateX(50px) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "translateX(25px)" but got "matrix(1, 0, 0, 1, 25, 0)"
-FAIL Interpolation between translateX(0%) and translateX(50%) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "translateX(25%)" but got "matrix(1, 0, 0, 1, 0, 0)"
-FAIL Interpolation between translateY(0%) and translateX(50%) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "translate(25%)" but got "matrix(1, 0, 0, 1, 0, 0)"
-FAIL Interpolation between translateX(50px) and translateY(50px) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "translate(25px, 25px)" but got "matrix(1, 0, 0, 1, 25, 25)"
-FAIL Interpolation between translateX(50px) and translateZ(50px) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "translate3d(25px, 0px, 25px)" but got "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 25, 0, 25, 1)"
-FAIL Interpolation between translateZ(50px) and translateX(50px) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "translate3d(25px, 0px, 25px)" but got "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 25, 0, 25, 1)"
-FAIL Interpolation between translateZ(-50px) and translateZ(50px) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "translateZ(0px)" but got "matrix(1, 0, 0, 1, 0, 0)"
-FAIL Interpolation between translate(0%) and translate(50%) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "translate(25%)" but got "matrix(1, 0, 0, 1, 0, 0)"
-FAIL Interpolation between translate(50%) and translate(100%, 50%) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "translate(75%, 25%)" but got "matrix(1, 0, 0, 1, 0, 0)"
-FAIL Interpolation between translate(0%, 50%) and translate(50%, 100%) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "translate(25%, 75%)" but got "matrix(1, 0, 0, 1, 0, 0)"
-FAIL Interpolation between translate3d(0,0,-50px) and translateZ(50px) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "translate3d(0px, 0px, 0px)" but got "matrix(1, 0, 0, 1, 0, 0)"
-FAIL Interpolation between translate(50px, 0px) and translate(100px, 0px) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "translate(75px)" but got "matrix(1, 0, 0, 1, 75, 0)"
-FAIL Interpolation between translate(50px, -50px) and translate(100px, 50px) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "translate(75px)" but got "matrix(1, 0, 0, 1, 75, 0)"
-FAIL Interpolation between rotate(30deg) and rotate(90deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "rotate(60deg)" but got "matrix(0.5, 0.866025, -0.866025, 0.5, 0, 0)"
-FAIL Interpolation between rotateZ(30deg) and rotateZ(90deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "rotateZ(60deg)" but got "matrix(0.5, 0.866025, -0.866025, 0.5, 0, 0)"
-FAIL Interpolation between rotate(0deg) and rotateZ(90deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "rotate3d(0, 0, 1, 45deg)" but got "matrix(0.707107, 0.707107, -0.707107, 0.707107, 0, 0)"
-FAIL Interpolation between rotateX(0deg) and rotateX(90deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "rotateX(45deg)" but got "matrix3d(1, 0, 0, 0, 0, 0.707107, 0.707107, 0, 0, -0.707107, 0.707107, 0, 0, 0, 0, 1)"
-FAIL Interpolation between rotate(0deg) and rotateX(90deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "rotate3d(1, 0, 0, 45deg)" but got "matrix3d(1, 0, 0, 0, 0, 0.5, 0.5, 0, 0, -0.5, 0.5, 0, 0, 0, 0, 1)"
-FAIL Interpolation between scale(1) and scale(2) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scale(1.5)" but got "matrix(1.5, 0, 0, 1.5, 0, 0)"
-FAIL Interpolation between scale(1, 3) and scale(2) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scale(1.5, 2.5)" but got "matrix(1.5, 0, 0, 2.5, 0, 0)"
-FAIL Interpolation between scaleX(1) and scaleX(2) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scaleX(1.5)" but got "matrix(1.5, 0, 0, 1, 0, 0)"
-FAIL Interpolation between scaleY(1) and scaleY(2) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scaleY(1.5)" but got "matrix(1, 0, 0, 1.5, 0, 0)"
-FAIL Interpolation between scaleZ(1) and scaleZ(2) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scaleZ(1.5)" but got "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1.5, 0, 0, 0, 0, 1)"
-FAIL Interpolation between scaleX(2) and scaleY(2) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scale(1.5)" but got "matrix(1.5, 0, 0, 1.5, 0, 0)"
-FAIL Interpolation between scaleX(2) and scaleY(3) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scale(1.5, 2)" but got "matrix(1.5, 0, 0, 2, 0, 0)"
-FAIL Interpolation between scaleZ(1) and scale(2) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scale3d(1.5, 1.5, 1)" but got "matrix(1.5, 0, 0, 1.5, 0, 0)"
-FAIL Interpolation between scale(1, 2) and scale(3, 4) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scale(2, 3)" but got "matrix(2, 0, 0, 3, 0, 0)"
-FAIL Interpolation between scale3d(1, 2, 3) and scale3d(4, 5, 6) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scale3d(2.5, 3.5, 4.5)" but got "matrix3d(2.5, 0, 0, 0, 0, 3.5, 0, 0, 0, 0, 4.5, 0, 0, 0, 0, 1)"
-FAIL Interpolation between scale3d(1, 2, 3) and scale(4, 5) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scale3d(2.5, 3.5, 2)" but got "matrix3d(2.5, 0, 0, 0, 0, 3.5, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1)"
-FAIL Interpolation between scale(1, 2) and scale3d(3, 4, 5) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "scale3d(2, 3, 3)" but got "matrix3d(2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1)"
-FAIL Interpolation between skewX(0deg) and skewX(60deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "skewX(30deg)" but got "matrix(1, 0, 0.57735, 1, 0, 0)"
-FAIL Interpolation between skewX(0deg) and skewX(90deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "skewX(45deg)" but got "matrix(1, 0, 1, 1, 0, 0)"
-FAIL Interpolation between skewX(0deg) and skewX(180deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "skewX(90deg)" but got "matrix(1, 0, 16331239353195370, 1, 0, 0)"
-FAIL Interpolation between skew(0deg, 0deg) and skew(60deg, 60deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "skew(30deg, 30deg)" but got "matrix(1, 0.57735, 0.57735, 1, 0, 0)"
-FAIL Interpolation between skew(45deg, 0deg) and skew(0deg, 45deg) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "skew(22.5deg, 22.5deg)" but got "matrix(1, 0.414214, 0.414214, 1, 0, 0)"
-FAIL Interpolation between perspective(10px) and perspective(2.5px) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "perspective(4px)" but got "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -0.25, 0, 0, 0, 1)"
-FAIL Interpolation between perspective(10px) and perspective(none) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "perspective(20px)" but got "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -0.05, 0, 0, 0, 1)"
-FAIL Interpolation between perspective(none) and perspective(none) gives the correct computed value halfway according to commitStyles. assert_equals: The value at 50% progress is as expected expected "perspective(none)" but got "matrix(1, 0, 0, 1, 0, 0)"
-PASS Interpolation between matrix(2, 0, 0, 2, 10, 30) and matrix(4, 0, 0, 6, 14, 10) gives the correct computed value halfway according to commitStyles.
-PASS Interpolation between matrix3d(1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 1, 0, 5, 10, 4, 1) and matrix3d(3, 0, 0, 0, 0, 2, 0, 0, 0, 0, 3, 0, -11, 2, 2, 1) gives the correct computed value halfway according to commitStyles.
-PASS Interpolation between matrix3d(1, 0, 0, 3, 0, 1, 0, 2, 0, 0, 1, 8, 0, 0, 0, 1) and matrix3d(1, 0, 0, 5, 0, 1, 0, 8, 0, 0, 1, 14, 0, 0, 0, 1) gives the correct computed value halfway according to commitStyles.
-

Modified: trunk/Source/WebCore/ChangeLog (289031 => 289032)


--- trunk/Source/WebCore/ChangeLog	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/ChangeLog	2022-02-03 08:35:59 UTC (rev 289032)
@@ -1,3 +1,65 @@
+2022-02-03  Martin Robinson  <[email protected]>
+
+        Transform interpolation should blend between shared transform function primitives
+        https://bugs.webkit.org/show_bug.cgi?id=235311
+        <rdar://problem/88012700>
+
+        Reviewed by Simon Fraser.
+
+        No new tests. This is covered by existing WPT tests.
+
+        Allow direct interpolation between mismatching transform functions that share a primitive.
+        This fixes many tests expecting a certain computed transformation matrix in WPT, but also
+        allows using hardware animations more often for the CoreAnimation backend.
+
+        Rotation, scale, and translate are the only functions that have shared primitives, so they
+        are the only ones in this change to allow for this new behavior.
+
+        When determining if a list of keyframes has shared compatible lists of transforms, return
+        the vector of primitives that can represent them. In addition code for calculating big
+        rotations has been removed, because it was unused.
+
+        * platform/graphics/GraphicsLayer.cpp:
+        (WebCore::gSharedPrimitivesForTransformKeyframe): Added.
+        (WebCore::GraphicsLayer::getSharedPrimitivesForTransformKeyframes): Added.
+        * platform/graphics/GraphicsLayer.h:
+        * platform/graphics/ca/GraphicsLayerCA.cpp:
+        (WebCore::GraphicsLayerCA::appendToUncommittedAnimations): Modified to take a vector of shared
+        primitive types instead of a pointer to an array of operations.
+        (WebCore::GraphicsLayerCA::createTransformAnimationsFromKeyframes):
+        * platform/graphics/ca/GraphicsLayerCA.h:
+        * platform/graphics/texmap/GraphicsLayerTextureMapper.cpp:
+        (WebCore::GraphicsLayerTextureMapper::addAnimation): Use new method.
+        * platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp:
+        (WebCore::CoordinatedGraphicsLayer::addAnimation): Ditto.
+        * platform/graphics/transforms/Matrix3DTransformOperation.cpp:
+        (WebCore::Matrix3DTransformOperation::blend): Use the new sharedPrimitiveType method
+        to determine if the two operations can blend.
+        * platform/graphics/transforms/MatrixTransformOperation.cpp:
+        (WebCore::MatrixTransformOperation::blend): Ditto.
+        * platform/graphics/transforms/PerspectiveTransformOperation.cpp:
+        (WebCore::PerspectiveTransformOperation::blend): Ditto.
+        * platform/graphics/transforms/RotateTransformOperation.cpp:
+        (WebCore::RotateTransformOperation::blend): Ditto.
+        * platform/graphics/transforms/RotateTransformOperation.h:
+        * platform/graphics/transforms/ScaleTransformOperation.cpp:
+        (WebCore::ScaleTransformOperation::blend): Ditto.
+        * platform/graphics/transforms/ScaleTransformOperation.h:
+        * platform/graphics/transforms/SkewTransformOperation.cpp:
+        (WebCore::SkewTransformOperation::blend): Ditto.
+        * platform/graphics/transforms/TransformOperation.cpp:
+        (WebCore::TransformOperation::sharedPrimitiveType const):
+        * platform/graphics/transforms/TransformOperation.h:
+        (WebCore::TransformOperation::primitiveType const): Added this virtual function which
+        return the type for the base class. Rotation, scale, and translate specialize this to
+        return a compatible primitive type.
+        * platform/graphics/transforms/TransformOperations.cpp:
+        (WebCore::TransformOperations::operationsMatch const): Modified to check whether operations
+        share primitives.
+        * platform/graphics/transforms/TranslateTransformOperation.cpp:
+        (WebCore::TranslateTransformOperation::blend): Use the new sharedPrimitiveType method.
+        * platform/graphics/transforms/TranslateTransformOperation.h:
+
 2022-02-03  Tim Nguyen  <[email protected]>
 
         Create PDFDocument stub

Modified: trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp	2022-02-03 08:35:59 UTC (rev 289032)
@@ -710,79 +710,70 @@
     return firstIndex;
 }
 
-// An "invalid" list is one whose functions don't match, and therefore has to be animated as a Matrix
-// The hasBigRotation flag will always return false if isValid is false. Otherwise hasBigRotation is 
-// true if the rotation between any two keyframes is >= 180 degrees.
-
 static inline const TransformOperations& operationsAt(const KeyframeValueList& valueList, size_t index)
 {
     return static_cast<const TransformAnimationValue&>(valueList.at(index)).value();
 }
 
-int GraphicsLayer::validateTransformOperations(const KeyframeValueList& valueList, bool& hasBigRotation)
+// A sequence of keyframes with a list of transforms can be represented without matrix interpolation
+// if each transform is compatible with all other transforms at the same index in other keyframes.
+// Two transforms are compatible if they share a primitive defined by the CSS Transforms Level 2
+// specification. For instance, the shared primitive of a translateX and translate3D operation is
+// TransformOperation::TRANSLATE_3D. This function returns true if the TransformOperations in each
+// keyframe share a primitive operation type and stores the compatible OperationTypes in
+// sharedPrimitives. If the keyframes do not share a list of compatible primitives, false is
+// returned.
+bool GraphicsLayer::getSharedPrimitivesForTransformKeyframes(const KeyframeValueList& valueList, Vector<TransformOperation::OperationType>& sharedPrimitives)
 {
     ASSERT(animatedPropertyIsTransformOrRelated(valueList.property()));
 
-    hasBigRotation = false;
-    
     if (valueList.size() < 2)
-        return -1;
-    
-    // Empty transforms match anything, so find the first non-empty entry as the reference.
-    size_t firstIndex = 0;
-    for ( ; firstIndex < valueList.size(); ++firstIndex) {
-        if (!operationsAt(valueList, firstIndex).operations().isEmpty())
-            break;
-    }
-    
-    if (firstIndex >= valueList.size())
-        return -1;
-        
-    const TransformOperations& firstVal = operationsAt(valueList, firstIndex);
-    
-    // See if the keyframes are valid.
-    for (size_t i = firstIndex + 1; i < valueList.size(); ++i) {
-        const TransformOperations& val = operationsAt(valueList, i);
-        
-        // An empty transform list matches anything.
-        if (val.operations().isEmpty())
-            continue;
-            
-        if (!firstVal.operationsMatch(val))
-            return -1;
-    }
+        return false;
 
-    // Keyframes are valid, check for big rotations.    
-    double lastRotationAngle = 0.0;
-    double maxRotationAngle = -1.0;
-        
-    for (size_t j = 0; j < firstVal.operations().size(); ++j) {
-        TransformOperation::OperationType type = firstVal.operations().at(j)->type();
-        
-        // if this is a rotation entry, we need to see if any angle differences are >= 180 deg
-        if (type == TransformOperation::ROTATE_X ||
-            type == TransformOperation::ROTATE_Y ||
-            type == TransformOperation::ROTATE_Z ||
-            type == TransformOperation::ROTATE_3D) {
-            lastRotationAngle = downcast<RotateTransformOperation>(*firstVal.operations().at(j)).angle();
-            
-            if (maxRotationAngle < 0)
-                maxRotationAngle = fabs(lastRotationAngle);
-            
-            for (size_t i = firstIndex + 1; i < valueList.size(); ++i) {
-                const TransformOperations& val = operationsAt(valueList, i);
-                double rotationAngle = val.operations().isEmpty() ? 0 : downcast<RotateTransformOperation>(*val.operations().at(j)).angle();
-                double diffAngle = fabs(rotationAngle - lastRotationAngle);
-                if (diffAngle > maxRotationAngle)
-                    maxRotationAngle = diffAngle;
-                lastRotationAngle = rotationAngle;
+    sharedPrimitives.clear();
+    sharedPrimitives.reserveInitialCapacity(operationsAt(valueList, 0).size());
+
+    // Find a list of transform primitives for the given TransformOperations which are compatible with the primitives
+    // stored in sharedPrimitives. The results are written back into sharedPrimitives. This returns false if any element
+    // of TransformOperation does not have a shared primitive, otherwise it returns true.
+    auto updateSharedPrimitives = [&](const TransformOperations& operations) {
+        // Empty transform lists are implicitly a list of identity transforms.
+        if (!operations.size())
+            return true;
+
+        // If we have seen a non-empty list already and this list's size doesn't match, then we can't use shared
+        // primitives. FIXME: This should handle prefix matches and then fall back to matrix interpolation for the rest
+        // of the list.
+        // See: https://bugs.webkit.org/show_bug.cgi?id=235757
+        if (sharedPrimitives.size() && sharedPrimitives.size() != operations.size())
+            return false;
+
+        for (size_t i = 0; i < operations.size(); ++i) {
+            const auto* operation = operations.at(i);
+
+            // If we haven't seen an operation at this index before, we can simply use our primitive type.
+            if (i >= sharedPrimitives.size()) {
+                ASSERT(i == sharedPrimitives.size());
+                sharedPrimitives.append(operation->primitiveType());
+                continue;
             }
+
+            if (auto sharedPrimitive = operation->sharedPrimitiveType(sharedPrimitives[i]))
+                sharedPrimitives[i] = *sharedPrimitive;
+            else
+                return false;
         }
+
+        return true;
+    };
+
+    for (size_t i = 0; i < valueList.size(); ++i) {
+        const TransformOperations& operations = operationsAt(valueList, i);
+        if (!updateSharedPrimitives(operations))
+            return false;
     }
-    
-    hasBigRotation = maxRotationAngle >= 180.0;
-    
-    return firstIndex;
+
+    return true;
 }
 
 double GraphicsLayer::backingStoreMemoryEstimate() const

Modified: trunk/Source/WebCore/platform/graphics/GraphicsLayer.h (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/GraphicsLayer.h	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/GraphicsLayer.h	2022-02-03 08:35:59 UTC (rev 289032)
@@ -664,12 +664,10 @@
     // Given a KeyframeValueList containing filterOperations, return true if the operations are valid.
     static int validateFilterOperations(const KeyframeValueList&);
 
-    // Given a list of TransformAnimationValues, see if all the operations for each keyframe match. If so
-    // return the index of the KeyframeValueList entry that has that list of operations (it may not be
-    // the first entry because some keyframes might have an empty transform and those match any list).
-    // If the lists don't match return -1. On return, if hasBigRotation is true, functions contain 
-    // rotations of >= 180 degrees
-    static int validateTransformOperations(const KeyframeValueList&, bool& hasBigRotation);
+    // Given a list of TransformAnimationValues keyframes, place a list of primitive operations which can
+    // represent the transform functions of every keyframe in the sharedPrimitives out parameter and return
+    // true. If the keyframes do not share compatible functions, return false.
+    static bool getSharedPrimitivesForTransformKeyframes(const KeyframeValueList&, Vector<TransformOperation::OperationType>& sharedPrimitives);
 
     virtual bool shouldRepaintOnSizeChange() const { return drawsContent(); }
 

Modified: trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp	2022-02-03 08:35:59 UTC (rev 289032)
@@ -3458,9 +3458,10 @@
     return true;
 }
 
-bool GraphicsLayerCA::appendToUncommittedAnimations(const KeyframeValueList& valueList, const TransformOperations* operations, const Animation* animation, const String& animationName, const FloatSize& boxSize, int animationIndex, Seconds timeOffset, bool isMatrixAnimation, bool keyframesShouldUseAnimationWideTimingFunction)
+bool GraphicsLayerCA::appendToUncommittedAnimations(const KeyframeValueList& valueList, const Vector<TransformOperation::OperationType>& operations, const Animation* animation, const String& animationName, const FloatSize& boxSize, unsigned animationIndex, Seconds timeOffset, bool isMatrixAnimation, bool keyframesShouldUseAnimationWideTimingFunction)
 {
-    TransformOperation::OperationType transformOp = isMatrixAnimation ? TransformOperation::MATRIX_3D : operations->operations().at(animationIndex)->type();
+    // If function lists don't match we do a matrix animation, otherwise we do a component hardware animation.
+    auto transformOp = isMatrixAnimation ? TransformOperation::MATRIX_3D : operations[animationIndex];
 
     RefPtr<PlatformCAAnimation> caAnimation;
     bool validMatrices = true;
@@ -3486,18 +3487,13 @@
 {
     ASSERT(animatedPropertyIsTransformOrRelated(valueList.property()));
 
-    bool hasBigRotation;
-    int listIndex = validateTransformOperations(valueList, hasBigRotation);
-    const TransformOperations* operations = (listIndex >= 0) ? &static_cast<const TransformAnimationValue&>(valueList.at(listIndex)).value() : 0;
+    Vector<TransformOperation::OperationType> sharedPrimitives;
+    bool isMatrixAnimation = !getSharedPrimitivesForTransformKeyframes(valueList, sharedPrimitives);
+    unsigned numOperations = !isMatrixAnimation ? sharedPrimitives.size() : 1;
 
     bool validMatrices = true;
-
-    // If function lists don't match we do a matrix animation, otherwise we do a component hardware animation.
-    bool isMatrixAnimation = valueList.property() == AnimatedPropertyTransform ? listIndex < 0 : true;
-    int numAnimations = isMatrixAnimation ? 1 : operations->size();
-
-    for (int animationIndex = 0; animationIndex < numAnimations; ++animationIndex) {
-        if (!appendToUncommittedAnimations(valueList, operations, animation, animationName, boxSize, animationIndex, timeOffset, isMatrixAnimation, keyframesShouldUseAnimationWideTimingFunction)) {
+    for (unsigned animationIndex = 0; animationIndex < numOperations; ++animationIndex) {
+        if (!appendToUncommittedAnimations(valueList, sharedPrimitives, animation, animationName, boxSize, animationIndex, timeOffset, isMatrixAnimation, keyframesShouldUseAnimationWideTimingFunction)) {
             validMatrices = false;
             break;
         }

Modified: trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h	2022-02-03 08:35:59 UTC (rev 289032)
@@ -530,7 +530,7 @@
         moveOrCopyAnimations(Copy, fromLayer, toLayer);
     }
 
-    bool appendToUncommittedAnimations(const KeyframeValueList&, const TransformOperations*, const Animation*, const String& animationName, const FloatSize& boxSize, int animationIndex, Seconds timeOffset, bool isMatrixAnimation, bool keyframesShouldUseAnimationWideTimingFunction);
+    bool appendToUncommittedAnimations(const KeyframeValueList&, const Vector<TransformOperation::OperationType>& operations, const Animation*, const String& animationName, const FloatSize& boxSize, unsigned animationIndex, Seconds timeOffset, bool isMatrixAnimation, bool keyframesShouldUseAnimationWideTimingFunction);
     bool appendToUncommittedAnimations(const KeyframeValueList&, const FilterOperation*, const Animation*, const String& animationName, int animationIndex, Seconds timeOffset, bool keyframesShouldUseAnimationWideTimingFunction);
 
     enum LayerChange : uint64_t {

Modified: trunk/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.cpp (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.cpp	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/texmap/GraphicsLayerTextureMapper.cpp	2022-02-03 08:35:59 UTC (rev 289032)
@@ -24,6 +24,7 @@
 #include "GraphicsLayerFactory.h"
 #include "ImageBuffer.h"
 #include "NicosiaAnimation.h"
+#include "TransformOperation.h"
 
 #if !USE(COORDINATED_GRAPHICS)
 
@@ -611,11 +612,11 @@
     }
 
     bool listsMatch = false;
-    bool hasBigRotation;
+    if (valueList.property() == AnimatedPropertyTransform) {
+        Vector<TransformOperation::OperationType> unusedOperations;
+        listsMatch = !!getSharedPrimitivesForTransformKeyframes(valueList, unusedOperations);
+    }
 
-    if (valueList.property() == AnimatedPropertyTransform)
-        listsMatch = validateTransformOperations(valueList, hasBigRotation) >= 0;
-
     const MonotonicTime currentTime = MonotonicTime::now();
     m_animations.add(Nicosia::Animation(keyframesName, valueList, boxSize, *anim, listsMatch, currentTime - Seconds(timeOffset), 0_s, Nicosia::Animation::AnimationState::Playing));
     // m_animationStartTime is the time of the first real frame of animation, now or delayed by a negative offset.

Modified: trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp	2022-02-03 08:35:59 UTC (rev 289032)
@@ -40,6 +40,7 @@
 #include "ScrollableArea.h"
 #include "TextureMapperPlatformLayerProxyProvider.h"
 #include "TiledBackingStore.h"
+#include "TransformOperation.h"
 #ifndef NDEBUG
 #include <wtf/SetForScope.h>
 #endif
@@ -1414,8 +1415,8 @@
         break;
     }
     case AnimatedPropertyTransform: {
-        bool ignoredHasBigRotation;
-        listsMatch = validateTransformOperations(valueList, ignoredHasBigRotation) >= 0;
+        Vector<TransformOperation::OperationType> unusedOperations;
+        listsMatch = !!getSharedPrimitivesForTransformKeyframes(valueList, unusedOperations);
         break;
     }
     case AnimatedPropertyOpacity:

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


--- trunk/Source/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp	2022-02-03 08:35:59 UTC (rev 289032)
@@ -45,7 +45,7 @@
 
 Ref<TransformOperation> Matrix3DTransformOperation::blend(const TransformOperation* from, const BlendingContext& context, bool blendToIdentity)
 {
-    if (from && !from->isSameType(*this))
+    if (!sharedPrimitiveType(from))
         return *this;
 
     // Convert the TransformOperations into matrices

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


--- trunk/Source/WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp	2022-02-03 08:35:59 UTC (rev 289032)
@@ -43,7 +43,7 @@
         return MatrixTransformOperation::create(to);
     };
 
-    if (from && !from->isSameType(*this))
+    if (!sharedPrimitiveType(from))
         return *this;
 
     // convert the TransformOperations into matrices

Modified: trunk/Source/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.cpp (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.cpp	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.cpp	2022-02-03 08:35:59 UTC (rev 289032)
@@ -41,7 +41,7 @@
 
 Ref<TransformOperation> PerspectiveTransformOperation::blend(const TransformOperation* from, const BlendingContext& context, bool blendToIdentity)
 {
-    if (from && !from->isSameType(*this))
+    if (!sharedPrimitiveType(from))
         return *this;
 
     // https://drafts.csswg.org/css-transforms-2/#interpolation-of-transform-functions

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


--- trunk/Source/WebCore/platform/graphics/transforms/RotateTransformOperation.cpp	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/transforms/RotateTransformOperation.cpp	2022-02-03 08:35:59 UTC (rev 289032)
@@ -39,12 +39,13 @@
 
 Ref<TransformOperation> RotateTransformOperation::blend(const TransformOperation* from, const BlendingContext& context, bool blendToIdentity)
 {
-    if (from && !from->isSameType(*this))
-        return *this;
-    
     if (blendToIdentity)
         return RotateTransformOperation::create(m_x, m_y, m_z, m_angle - m_angle * context.progress, type());
-    
+
+    auto outputType = sharedPrimitiveType(from);
+    if (!outputType)
+        return *this;
+
     const RotateTransformOperation* fromOp = downcast<RotateTransformOperation>(from);
     const RotateTransformOperation* toOp = this;
 
@@ -69,7 +70,7 @@
     auto toNormalizedVector = normalizedVector(*toOp);
     if (!fromAngle || !toAngle || fromNormalizedVector == toNormalizedVector) {
         auto vector = (!fromAngle && toAngle) ? toNormalizedVector : fromNormalizedVector;
-        return RotateTransformOperation::create(vector.x(), vector.y(), vector.z(), WebCore::blend(fromAngle, toAngle, context), type());
+        return RotateTransformOperation::create(vector.x(), vector.y(), vector.z(), WebCore::blend(fromAngle, toAngle, context), *outputType);
     }
 
     // Create the 2 rotation matrices

Modified: trunk/Source/WebCore/platform/graphics/transforms/RotateTransformOperation.h (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/transforms/RotateTransformOperation.h	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/transforms/RotateTransformOperation.h	2022-02-03 08:35:59 UTC (rev 289032)
@@ -53,6 +53,10 @@
     double z() const { return m_z; }
     double angle() const { return m_angle; }
 
+    // The 2D rotation primitive doesn't handle any direction vectors other than [0, 0, 1],
+    // so even if the rotation is representable in 2D, it might be a 3D rotation.
+    OperationType primitiveType() const final { return (isRepresentableIn2D() && z() == 1.0) ? ROTATE : ROTATE_3D; }
+
     bool operator==(const RotateTransformOperation& other) const { return operator==(static_cast<const TransformOperation&>(other)); }
     bool operator==(const TransformOperation&) const override;
 

Modified: trunk/Source/WebCore/platform/graphics/transforms/ScaleTransformOperation.cpp (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/transforms/ScaleTransformOperation.cpp	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/transforms/ScaleTransformOperation.cpp	2022-02-03 08:35:59 UTC (rev 289032)
@@ -52,21 +52,18 @@
 
 Ref<TransformOperation> ScaleTransformOperation::blend(const TransformOperation* from, const BlendingContext& context, bool blendToIdentity)
 {
-    if (from && !is<ScaleTransformOperation>(from))
+    if (blendToIdentity)
+        return ScaleTransformOperation::create(blendScaleComponent(m_x, 1.0, context), blendScaleComponent(m_y, 1.0, context), blendScaleComponent(m_z, 1.0, context), type());
+
+    auto outputType = sharedPrimitiveType(from);
+    if (!outputType)
         return *this;
 
-    if (blendToIdentity)
-        return ScaleTransformOperation::create(blendScaleComponent(m_x, 1.0, context),
-                                               blendScaleComponent(m_y, 1.0, context),
-                                               blendScaleComponent(m_z, 1.0, context), type());
-    
     const ScaleTransformOperation* fromOp = downcast<ScaleTransformOperation>(from);
     double fromX = fromOp ? fromOp->m_x : 1.0;
     double fromY = fromOp ? fromOp->m_y : 1.0;
     double fromZ = fromOp ? fromOp->m_z : 1.0;
-    return ScaleTransformOperation::create(blendScaleComponent(fromX, m_x, context),
-                                           blendScaleComponent(fromY, m_y, context),
-                                           blendScaleComponent(fromZ, m_z, context), type());
+    return ScaleTransformOperation::create(blendScaleComponent(fromX, m_x, context), blendScaleComponent(fromY, m_y, context), blendScaleComponent(fromZ, m_z, context), *outputType);
 }
 
 void ScaleTransformOperation::dump(TextStream& ts) const

Modified: trunk/Source/WebCore/platform/graphics/transforms/ScaleTransformOperation.h (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/transforms/ScaleTransformOperation.h	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/transforms/ScaleTransformOperation.h	2022-02-03 08:35:59 UTC (rev 289032)
@@ -52,6 +52,8 @@
     double y() const { return m_y; }
     double z() const { return m_z; }
 
+    OperationType primitiveType() const final { return isRepresentableIn2D() ? SCALE : SCALE_3D; }
+
     bool operator==(const ScaleTransformOperation& other) const { return operator==(static_cast<const TransformOperation&>(other)); }
     bool operator==(const TransformOperation&) const final;
 

Modified: trunk/Source/WebCore/platform/graphics/transforms/SkewTransformOperation.cpp (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/transforms/SkewTransformOperation.cpp	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/transforms/SkewTransformOperation.cpp	2022-02-03 08:35:59 UTC (rev 289032)
@@ -37,16 +37,17 @@
 
 Ref<TransformOperation> SkewTransformOperation::blend(const TransformOperation* from, const BlendingContext& context, bool blendToIdentity)
 {
-    if (from && !from->isSameType(*this))
-        return *this;
-    
     if (blendToIdentity)
         return SkewTransformOperation::create(WebCore::blend(m_angleX, 0.0, context), WebCore::blend(m_angleY, 0.0, context), type());
-    
+
+    auto outputType = sharedPrimitiveType(from);
+    if (!outputType)
+        return *this;
+
     const SkewTransformOperation* fromOp = downcast<SkewTransformOperation>(from);
     double fromAngleX = fromOp ? fromOp->m_angleX : 0;
     double fromAngleY = fromOp ? fromOp->m_angleY : 0;
-    return SkewTransformOperation::create(WebCore::blend(fromAngleX, m_angleX, context), WebCore::blend(fromAngleY, m_angleY, context), type());
+    return SkewTransformOperation::create(WebCore::blend(fromAngleX, m_angleX, context), WebCore::blend(fromAngleY, m_angleY, context), *outputType);
 }
 
 void SkewTransformOperation::dump(TextStream& ts) const

Modified: trunk/Source/WebCore/platform/graphics/transforms/TransformOperation.cpp (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/transforms/TransformOperation.cpp	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/transforms/TransformOperation.cpp	2022-02-03 08:35:59 UTC (rev 289032)
@@ -72,4 +72,31 @@
     return ts;
 }
 
+std::optional<TransformOperation::OperationType> TransformOperation::sharedPrimitiveType(OperationType other) const
+{
+    // https://drafts.csswg.org/css-transforms-2/#interpolation-of-transform-functions
+    // "If both transform functions share a primitive in the two-dimensional space, both transform
+    // functions get converted to the two-dimensional primitive. If one or both transform functions
+    // are three-dimensional transform functions, the common three-dimensional primitive is used."
+    auto type = primitiveType();
+    if (type == other)
+        return type;
+    static constexpr OperationType sharedPrimitives[][2] = {
+        { ROTATE, ROTATE_3D },
+        { SCALE, SCALE_3D },
+        { TRANSLATE, TRANSLATE_3D }
+    };
+    for (auto typePair : sharedPrimitives) {
+        if ((type == typePair[0] || type == typePair[1]) && (other == typePair[0] || other == typePair[1]))
+            return typePair[1];
+    }
+    return std::nullopt;
+}
+
+std::optional<TransformOperation::OperationType> TransformOperation::sharedPrimitiveType(const TransformOperation* other) const
+{
+    // Blending with a null operation is always supported via blending with identity.
+    return other ? sharedPrimitiveType(other->primitiveType()) : primitiveType();
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/graphics/transforms/TransformOperation.h (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/transforms/TransformOperation.h	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/transforms/TransformOperation.h	2022-02-03 08:35:59 UTC (rev 289032)
@@ -73,6 +73,10 @@
     OperationType type() const { return m_type; }
     bool isSameType(const TransformOperation& other) const { return type() == other.type(); }
 
+    virtual OperationType primitiveType() const { return m_type; }
+    std::optional<OperationType> sharedPrimitiveType(OperationType other) const;
+    std::optional<OperationType> sharedPrimitiveType(const TransformOperation* other) const;
+
     virtual bool isAffectedByTransformOrigin() const { return false; }
     
     bool is3DOperation() const

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


--- trunk/Source/WebCore/platform/graphics/transforms/TransformOperations.cpp	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/transforms/TransformOperations.cpp	2022-02-03 08:35:59 UTC (rev 289032)
@@ -59,7 +59,7 @@
     
     // If the types of each function are not the same, the lists don't match
     for (size_t i = 0; i < numOperations; ++i) {
-        if (!operations()[i]->isSameType(*other.operations()[i]))
+        if (!operations()[i]->sharedPrimitiveType(other.operations()[i].get()))
             return false;
     }
     return true;

Modified: trunk/Source/WebCore/platform/graphics/transforms/TranslateTransformOperation.cpp (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/transforms/TranslateTransformOperation.cpp	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/transforms/TranslateTransformOperation.cpp	2022-02-03 08:35:59 UTC (rev 289032)
@@ -38,18 +38,19 @@
 
 Ref<TransformOperation> TranslateTransformOperation::blend(const TransformOperation* from, const BlendingContext& context, bool blendToIdentity)
 {
-    if (from && !from->isSameType(*this))
-        return *this;
-
     Length zeroLength(0, LengthType::Fixed);
     if (blendToIdentity)
         return TranslateTransformOperation::create(WebCore::blend(m_x, zeroLength, context), WebCore::blend(m_y, zeroLength, context), WebCore::blend(m_z, zeroLength, context), type());
 
+    auto outputType = sharedPrimitiveType(from);
+    if (!outputType)
+        return *this;
+
     const TranslateTransformOperation* fromOp = downcast<TranslateTransformOperation>(from);
     Length fromX = fromOp ? fromOp->m_x : zeroLength;
     Length fromY = fromOp ? fromOp->m_y : zeroLength;
     Length fromZ = fromOp ? fromOp->m_z : zeroLength;
-    return TranslateTransformOperation::create(WebCore::blend(fromX, x(), context), WebCore::blend(fromY, y(), context), WebCore::blend(fromZ, z(), context), type());
+    return TranslateTransformOperation::create(WebCore::blend(fromX, x(), context), WebCore::blend(fromY, y(), context), WebCore::blend(fromZ, z(), context), *outputType);
 }
 
 void TranslateTransformOperation::dump(TextStream& ts) const

Modified: trunk/Source/WebCore/platform/graphics/transforms/TranslateTransformOperation.h (289031 => 289032)


--- trunk/Source/WebCore/platform/graphics/transforms/TranslateTransformOperation.h	2022-02-03 08:15:36 UTC (rev 289031)
+++ trunk/Source/WebCore/platform/graphics/transforms/TranslateTransformOperation.h	2022-02-03 08:35:59 UTC (rev 289032)
@@ -58,6 +58,8 @@
     Length y() const { return m_y; }
     Length z() const { return m_z; }
 
+    OperationType primitiveType() const final { return isRepresentableIn2D() ? TRANSLATE : TRANSLATE_3D; }
+
     bool apply(TransformationMatrix& transform, const FloatSize& borderBoxSize) const final
     {
         transform.translate3d(xAsFloat(borderBoxSize), yAsFloat(borderBoxSize), zAsFloat());
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to