diff options
9 files changed, 898 insertions, 157 deletions
diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/svg-d-interpolation-expected.txt b/third_party/WebKit/LayoutTests/animations/interpolation/svg-d-interpolation-expected.txt new file mode 100644 index 0000000..4714f0e --- /dev/null +++ b/third_party/WebKit/LayoutTests/animations/interpolation/svg-d-interpolation-expected.txt @@ -0,0 +1,553 @@ +This is a testharness.js-based test. +PASS This test uses interpolation-test.js. +PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (-0.3) is [path('m 0 0 h 3')] +PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0) is [path('m 0 0 h 3')] +PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.3) is [path('m 0 0 h 3')] +PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.5) is [path('m 0 0 h 3')] +PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.6) is [path('m 0 0 h 3')] +PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (1) is [path('m 0 0 h 3')] +PASS CSS Transitions: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (1.5) is [path('m 0 0 h 3')] +PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (-0.3) is [path('m 20 0 v 2')] +PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0) is [path('m 20 0 v 2')] +PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.3) is [path('m 20 0 v 2')] +PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.5) is [path('m 20 0 v 2')] +PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.6) is [path('m 20 0 v 2')] +PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (1) is [path('m 20 0 v 2')] +PASS CSS Transitions: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (1.5) is [path('m 20 0 v 2')] +PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (-0.3) is [path('m 1 2 l 3 4')] +PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0) is [path('m 1 2 l 3 4')] +PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.3) is [path('m 1 2 l 3 4')] +PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.5) is [path('m 1 2 l 3 4')] +PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.6) is [path('m 1 2 l 3 4')] +PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (1) is [path('m 1 2 l 3 4')] +PASS CSS Transitions: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (1.5) is [path('m 1 2 l 3 4')] +PASS CSS Transitions: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (-0.4) is [path('m 0 0 Z')] +PASS CSS Transitions: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0) is [path('m 0 0 Z')] +PASS CSS Transitions: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0.2) is [path('m 0 0 Z')] +PASS CSS Transitions: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0.6) is [path('m 0 0 Z')] +PASS CSS Transitions: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (1) is [path('m 0 0 Z')] +PASS CSS Transitions: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (1.4) is [path('m 0 0 Z')] +PASS CSS Transitions: property <d> from [path('M 20 50')] to [path('M 30 70')] at (-0.4) is [path('M 16 42')] +PASS CSS Transitions: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0) is [path('M 20 50')] +PASS CSS Transitions: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0.2) is [path('M 22 54')] +PASS CSS Transitions: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0.6) is [path('M 26 62')] +PASS CSS Transitions: property <d> from [path('M 20 50')] to [path('M 30 70')] at (1) is [path('M 30 70')] +PASS CSS Transitions: property <d> from [path('M 20 50')] to [path('M 30 70')] at (1.4) is [path('M 34 78')] +PASS CSS Transitions: property <d> from [path('m 20 50')] to [path('m 30 70')] at (-0.4) is [path('m 16 42')] +PASS CSS Transitions: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0) is [path('m 20 50')] +PASS CSS Transitions: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0.2) is [path('m 22 54')] +PASS CSS Transitions: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0.6) is [path('m 26 62')] +PASS CSS Transitions: property <d> from [path('m 20 50')] to [path('m 30 70')] at (1) is [path('m 30 70')] +PASS CSS Transitions: property <d> from [path('m 20 50')] to [path('m 30 70')] at (1.4) is [path('m 34 78')] +PASS CSS Transitions: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (-0.4) is [path('m 0 0 L 16 42')] +PASS CSS Transitions: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0) is [path('m 0 0 L 20 50')] +PASS CSS Transitions: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0.2) is [path('m 0 0 L 22 54')] +PASS CSS Transitions: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0.6) is [path('m 0 0 L 26 62')] +PASS CSS Transitions: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (1) is [path('m 0 0 L 30 70')] +PASS CSS Transitions: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (1.4) is [path('m 0 0 L 34 78')] +PASS CSS Transitions: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (-0.4) is [path('m 0 0 l 16 42')] +PASS CSS Transitions: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0) is [path('m 0 0 l 20 50')] +PASS CSS Transitions: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0.2) is [path('m 0 0 l 22 54')] +PASS CSS Transitions: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0.6) is [path('m 0 0 l 26 62')] +PASS CSS Transitions: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (1) is [path('m 0 0 l 30 70')] +PASS CSS Transitions: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (1.4) is [path('m 0 0 l 34 78')] +PASS CSS Transitions: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (-0.4) is [path('m 0 0 C 30 40 50 60 10 20')] +PASS CSS Transitions: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0) is [path('m 0 0 C 32 42 52 62 12 22')] +PASS CSS Transitions: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0.2) is [path('m 0 0 C 33 43 53 63 13 23')] +PASS CSS Transitions: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0.6) is [path('m 0 0 C 35 45 55 65 15 25')] +PASS CSS Transitions: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (1) is [path('m 0 0 C 37 47 57 67 17 27')] +PASS CSS Transitions: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (1.4) is [path('m 0 0 C 39 49 59 69 19 29')] +PASS CSS Transitions: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (-0.4) is [path('m 0 0 c 30 40 50 60 10 20')] +PASS CSS Transitions: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0) is [path('m 0 0 c 32 42 52 62 12 22')] +PASS CSS Transitions: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0.2) is [path('m 0 0 c 33 43 53 63 13 23')] +PASS CSS Transitions: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0.6) is [path('m 0 0 c 35 45 55 65 15 25')] +PASS CSS Transitions: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (1) is [path('m 0 0 c 37 47 57 67 17 27')] +PASS CSS Transitions: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (1.4) is [path('m 0 0 c 39 49 59 69 19 29')] +PASS CSS Transitions: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (-0.4) is [path('m 0 0 Q 30 40 50 60')] +PASS CSS Transitions: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0) is [path('m 0 0 Q 32 42 52 62')] +PASS CSS Transitions: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0.2) is [path('m 0 0 Q 33 43 53 63')] +PASS CSS Transitions: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0.6) is [path('m 0 0 Q 35 45 55 65')] +PASS CSS Transitions: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (1) is [path('m 0 0 Q 37 47 57 67')] +PASS CSS Transitions: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (1.4) is [path('m 0 0 Q 39 49 59 69')] +PASS CSS Transitions: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (-0.4) is [path('m 0 0 q 30 40 50 60')] +PASS CSS Transitions: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0) is [path('m 0 0 q 32 42 52 62')] +PASS CSS Transitions: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0.2) is [path('m 0 0 q 33 43 53 63')] +PASS CSS Transitions: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0.6) is [path('m 0 0 q 35 45 55 65')] +PASS CSS Transitions: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (1) is [path('m 0 0 q 37 47 57 67')] +PASS CSS Transitions: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (1.4) is [path('m 0 0 q 39 49 59 69')] +PASS CSS Transitions: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (-0.4) is [path('m 0 0 A -10 -2.98023e-7 10 1 0 20 30')] +PASS CSS Transitions: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0) is [path('m 0 0 A 10 20 30 1 0 40 50')] +PASS CSS Transitions: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0.2) is [path('m 0 0 A 20 30 40 1 0 50 60')] +PASS CSS Transitions: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0.6) is [path('m 0 0 A 40 50 60 0 1 70 80')] +PASS CSS Transitions: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (1) is [path('m 0 0 A 60 70 80 0 1 90 100')] +PASS CSS Transitions: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (1.4) is [path('m 0 0 A 80 90 100 0 1 110 120')] +PASS CSS Transitions: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (-0.4) is [path('m 0 0 a -10 -2.98023e-7 10 1 0 20 30')] +PASS CSS Transitions: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0) is [path('m 0 0 a 10 20 30 1 0 40 50')] +PASS CSS Transitions: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0.2) is [path('m 0 0 a 20 30 40 1 0 50 60')] +PASS CSS Transitions: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0.6) is [path('m 0 0 a 40 50 60 0 1 70 80')] +PASS CSS Transitions: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (1) is [path('m 0 0 a 60 70 80 0 1 90 100')] +PASS CSS Transitions: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (1.4) is [path('m 0 0 a 80 90 100 0 1 110 120')] +PASS CSS Transitions: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (-0.4) is [path('m 0 0 H -10')] +PASS CSS Transitions: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0) is [path('m 0 0 H 10')] +PASS CSS Transitions: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0.2) is [path('m 0 0 H 20')] +PASS CSS Transitions: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0.6) is [path('m 0 0 H 40')] +PASS CSS Transitions: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (1) is [path('m 0 0 H 60')] +PASS CSS Transitions: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (1.4) is [path('m 0 0 H 80')] +PASS CSS Transitions: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (-0.4) is [path('m 0 0 h -10')] +PASS CSS Transitions: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0) is [path('m 0 0 h 10')] +PASS CSS Transitions: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0.2) is [path('m 0 0 h 20')] +PASS CSS Transitions: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0.6) is [path('m 0 0 h 40')] +PASS CSS Transitions: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (1) is [path('m 0 0 h 60')] +PASS CSS Transitions: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (1.4) is [path('m 0 0 h 80')] +PASS CSS Transitions: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (-0.4) is [path('m 0 0 V -10')] +PASS CSS Transitions: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0) is [path('m 0 0 V 10')] +PASS CSS Transitions: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0.2) is [path('m 0 0 V 20')] +PASS CSS Transitions: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0.6) is [path('m 0 0 V 40')] +PASS CSS Transitions: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (1) is [path('m 0 0 V 60')] +PASS CSS Transitions: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (1.4) is [path('m 0 0 V 80')] +PASS CSS Transitions: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (-0.4) is [path('m 0 0 v -10')] +PASS CSS Transitions: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0) is [path('m 0 0 v 10')] +PASS CSS Transitions: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0.2) is [path('m 0 0 v 20')] +PASS CSS Transitions: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0.6) is [path('m 0 0 v 40')] +PASS CSS Transitions: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (1) is [path('m 0 0 v 60')] +PASS CSS Transitions: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (1.4) is [path('m 0 0 v 80')] +PASS CSS Transitions: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (-0.4) is [path('m 0 0 S 30 40 50 60')] +PASS CSS Transitions: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0) is [path('m 0 0 S 32 42 52 62')] +PASS CSS Transitions: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0.2) is [path('m 0 0 S 33 43 53 63')] +PASS CSS Transitions: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0.6) is [path('m 0 0 S 35 45 55 65')] +PASS CSS Transitions: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (1) is [path('m 0 0 S 37 47 57 67')] +PASS CSS Transitions: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (1.4) is [path('m 0 0 S 39 49 59 69')] +PASS CSS Transitions: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (-0.4) is [path('m 0 0 s 30 40 50 60')] +PASS CSS Transitions: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0) is [path('m 0 0 s 32 42 52 62')] +PASS CSS Transitions: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0.2) is [path('m 0 0 s 33 43 53 63')] +PASS CSS Transitions: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0.6) is [path('m 0 0 s 35 45 55 65')] +PASS CSS Transitions: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (1) is [path('m 0 0 s 37 47 57 67')] +PASS CSS Transitions: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (1.4) is [path('m 0 0 s 39 49 59 69')] +PASS CSS Transitions: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (-0.4) is [path('m 0 0 T 16 42')] +PASS CSS Transitions: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0) is [path('m 0 0 T 20 50')] +PASS CSS Transitions: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0.2) is [path('m 0 0 T 22 54')] +PASS CSS Transitions: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0.6) is [path('m 0 0 T 26 62')] +PASS CSS Transitions: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (1) is [path('m 0 0 T 30 70')] +PASS CSS Transitions: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (1.4) is [path('m 0 0 T 34 78')] +PASS CSS Transitions: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (-0.4) is [path('m 0 0 t 16 42')] +PASS CSS Transitions: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0) is [path('m 0 0 t 20 50')] +PASS CSS Transitions: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0.2) is [path('m 0 0 t 22 54')] +PASS CSS Transitions: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0.6) is [path('m 0 0 t 26 62')] +PASS CSS Transitions: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (1) is [path('m 0 0 t 30 70')] +PASS CSS Transitions: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (1.4) is [path('m 0 0 t 34 78')] +FAIL CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (-0.4) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 120 20 Z')] assert_equals: expected "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 60 - 180 Z ' ) " but got "path ( ' M 0 0 L 100 100 M 100 200 L 200 200 Z L 120 20 Z ' ) " +PASS CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] +FAIL CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0.2) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 240 140 Z')] assert_equals: expected "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 120 - 60 Z ' ) " but got "path ( ' M 0 0 L 100 100 M 100 200 L 200 200 Z L 240 140 Z ' ) " +FAIL CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0.6) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 120 20 Z')] assert_equals: expected "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 160 20 Z ' ) " but got "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 120 20 Z ' ) " +PASS CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (1) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 200 100 Z')] +FAIL CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (1.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 280 180 Z')] assert_equals: expected "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 240 180 Z ' ) " but got "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 280 180 Z ' ) " +FAIL CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (-0.4) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 160 100 Z')] assert_equals: expected "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 - 100 Z ' ) " but got "path ( ' M 0 0 L 100 100 M 100 200 L 200 200 Z L 160 100 Z ' ) " +PASS CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] +FAIL CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0.2) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 220 100 Z')] assert_equals: expected "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 - 100 Z ' ) " but got "path ( ' M 0 0 L 100 100 M 100 200 L 200 200 Z L 220 100 Z ' ) " +FAIL CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0.6) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 60 -100 Z')] assert_equals: expected "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 - 100 Z ' ) " but got "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 60 - 100 Z ' ) " +PASS CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (1) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] +FAIL CSS Transitions: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (1.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 140 -100 Z')] assert_equals: expected "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 - 100 Z ' ) " but got "path ( ' M 0 0 L 100 100 m 0 100 l 100 0 Z l 140 - 100 Z ' ) " +FAIL CSS Transitions: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (-0.4) is [path('m -30 -20 l 20 30 Z l 90 100 Z m 90 100 l 90 60 Z t 90 160')] assert_equals: expected "path ( ' M - 30 - 20 L - 10 10 Z L 52 68 Z M 72 84 L 162 144 Z T 126 220 ' ) " but got "path ( ' m - 30 - 20 l 20 30 Z l 90 100 Z m 90 100 l 90 60 Z t 90 160 ' ) " +PASS CSS Transitions: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0) is [path('m 10 20 l 20 30 Z l 50 60 Z m 70 80 l 90 60 Z t 70 120')] +FAIL CSS Transitions: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0.2) is [path('m 30 40 l 20 30 Z l 30 40 Z m 60 70 l 90 60 Z t 60 100')] assert_equals: expected "path ( ' M 30 40 L 50 70 Z L 64 86 Z M 84 108 L 174 168 Z T 162 220 ' ) " but got "path ( ' m 30 40 l 20 30 Z l 30 40 Z m 60 70 l 90 60 Z t 60 100 ' ) " +FAIL CSS Transitions: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0.6) is [path('M 70 80 L 90 110 Z L 80 110 Z M 120 160 L 210 220 Z T 250 280')] assert_equals: expected "path ( ' M 70 80 L 90 110 Z L 72 98 Z M 92 124 L 182 184 Z T 186 220 ' ) " but got "path ( ' M 70 80 L 90 110 Z L 80 110 Z M 120 160 L 210 220 Z T 250 280 ' ) " +PASS CSS Transitions: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (1) is [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] +FAIL CSS Transitions: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (1.4) is [path('M 150 160 L 170 190 Z L 80 110 Z M 80 120 L 170 180 Z T 170 160')] assert_equals: expected "path ( ' M 150 160 L 170 190 Z L 88 122 Z M 108 156 L 198 216 Z T 234 220 ' ) " but got "path ( ' M 150 160 L 170 190 Z L 80 110 Z M 80 120 L 170 180 Z T 170 160 ' ) " +FAIL CSS Transitions: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (-0.4) is [path('m -30 -20 c 44 58 34 68 84 78 c 82 88 132 98 112 118')] assert_equals: expected "path ( ' M - 30 - 20 C 14 38 4 48 54 58 C 136 146 186 156 166 176 ' ) " but got "path ( ' m - 30 - 20 c 44 58 34 68 84 78 c 82 88 132 98 112 118 ' ) " +PASS CSS Transitions: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0) is [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] +FAIL CSS Transitions: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0.2) is [path('m 30 40 c 38 46 28 56 78 66 c 94 106 144 116 124 136')] assert_equals: expected "path ( ' M 30 40 C 68 86 58 96 108 106 C 202 212 252 222 232 242 ' ) " but got "path ( ' m 30 40 c 38 46 28 56 78 66 c 94 106 144 116 124 136 ' ) " +PASS CSS Transitions: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0.6) is [path('M 70 80 C 104 118 94 128 144 138 C 246 256 296 266 276 286')] +PASS CSS Transitions: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (1) is [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] +PASS CSS Transitions: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (1.4) is [path('M 150 160 C 176 182 166 192 216 202 C 334 344 384 354 364 374')] +FAIL CSS Transitions: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (-0.4) is [path('m -30 -20 q 34 68 44 58 q 116 90 106 100')] assert_equals: expected "path ( ' M - 30 - 20 Q 4 48 14 38 Q 130 128 120 138 ' ) " but got "path ( ' m - 30 - 20 q 34 68 44 58 q 116 90 106 100 ' ) " +PASS CSS Transitions: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0) is [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] +FAIL CSS Transitions: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0.2) is [path('m 30 40 q 28 56 38 46 q 92 60 82 70')] assert_equals: expected "path ( ' M 30 40 Q 58 96 68 86 Q 160 146 150 156 ' ) " but got "path ( ' m 30 40 q 28 56 38 46 q 92 60 82 70 ' ) " +PASS CSS Transitions: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0.6) is [path('M 70 80 Q 94 128 104 118 Q 180 158 170 168')] +PASS CSS Transitions: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (1) is [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] +PASS CSS Transitions: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (1.4) is [path('M 150 160 Q 166 192 176 182 Q 220 182 210 192')] +FAIL CSS Transitions: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (-0.4) is [path('m -30 -20 s 34 68 44 58 s 116 90 106 100')] assert_equals: expected "path ( ' M - 30 - 20 S 4 48 14 38 S 130 128 120 138 ' ) " but got "path ( ' m - 30 - 20 s 34 68 44 58 s 116 90 106 100 ' ) " +PASS CSS Transitions: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0) is [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] +FAIL CSS Transitions: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0.2) is [path('m 30 40 s 28 56 38 46 s 92 60 82 70')] assert_equals: expected "path ( ' M 30 40 S 58 96 68 86 S 160 146 150 156 ' ) " but got "path ( ' m 30 40 s 28 56 38 46 s 92 60 82 70 ' ) " +PASS CSS Transitions: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0.6) is [path('M 70 80 S 94 128 104 118 S 180 158 170 168')] +PASS CSS Transitions: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (1) is [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] +PASS CSS Transitions: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (1.4) is [path('M 150 160 S 166 192 176 182 S 220 182 210 192')] +FAIL CSS Transitions: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (-0.4) is [path('m -30 -20 h 34 v 48 h 22 v 36 l 90 104')] assert_equals: expected "path ( ' M - 30 - 20 H 4 V 28 H 26 V 64 L 116 168 ' ) " but got "path ( ' m - 30 - 20 h 34 v 48 h 22 v 36 l 90 104 ' ) " +PASS CSS Transitions: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0) is [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] +FAIL CSS Transitions: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0.2) is [path('m 30 40 h 28 v 36 h 64 v 72 l 60 68')] assert_equals: expected "path ( ' M 30 40 H 58 V 76 H 122 V 148 L 182 216 ' ) " but got "path ( ' m 30 40 h 28 v 36 h 64 v 72 l 60 68 ' ) " +PASS CSS Transitions: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0.6) is [path('M 70 80 H 94 V 108 H 186 V 204 L 226 248')] +PASS CSS Transitions: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (1) is [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] +PASS CSS Transitions: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (1.4) is [path('M 150 160 H 166 V 172 H 314 V 316 L 314 312')] +FAIL CSS Transitions: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (-0.4) is [path('m 6 16 a -10 -2.98023e-7 10 1 0 28 42 a 90 100 10 1 1 196 70')] assert_equals: expected "path ( ' M 6 16 A - 10 0 10 1 0 34 58 A 90 100 10 1 1 230 128 ' ) " but got "path ( ' m 6 16 a - 10 0 10 1 0 28 42 a 90 100 10 1 1 196 70 ' ) " +PASS CSS Transitions: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0) is [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] +FAIL CSS Transitions: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0.2) is [path('m 12 22 a 20 30 40 1 0 46 54 a 120 130 40 1 1 112 40')] assert_equals: expected "path ( ' M 12 22 A 20 30 40 1 0 58 76 A 120 130 40 1 1 170 116 ' ) " but got "path ( ' m 12 22 a 20 30 40 1 0 46 54 a 120 130 40 1 1 112 40 ' ) " +PASS CSS Transitions: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0.6) is [path('M 16 26 A 40 50 60 0 1 74 88 A 140 150 60 0 1 130 108')] +PASS CSS Transitions: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (1) is [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] +PASS CSS Transitions: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (1.4) is [path('M 24 34 A 80 90 100 0 1 106 112 A 180 190 100 0 1 50 92')] +PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (-0.3) is [path('m 0 0 h 1 h 2')] +PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0) is [path('m 0 0 h 1 h 2')] +PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.3) is [path('m 0 0 h 1 h 2')] +PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.5) is [path('m 0 0 h 3')] +PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.6) is [path('m 0 0 h 3')] +PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (1) is [path('m 0 0 h 3')] +PASS CSS Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (1.5) is [path('m 0 0 h 3')] +PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (-0.3) is [path('m 10 0 h 1')] +PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0) is [path('m 10 0 h 1')] +PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.3) is [path('m 10 0 h 1')] +PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.5) is [path('m 20 0 v 2')] +PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.6) is [path('m 20 0 v 2')] +PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (1) is [path('m 20 0 v 2')] +PASS CSS Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (1.5) is [path('m 20 0 v 2')] +PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (-0.3) is [path('m 1 2 l 3 4 Z')] +PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0) is [path('m 1 2 l 3 4 Z')] +PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.3) is [path('m 1 2 l 3 4 Z')] +PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.5) is [path('m 1 2 l 3 4')] +PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.6) is [path('m 1 2 l 3 4')] +PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (1) is [path('m 1 2 l 3 4')] +PASS CSS Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (1.5) is [path('m 1 2 l 3 4')] +PASS CSS Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (-0.4) is [path('m 0 0 Z')] +PASS CSS Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0) is [path('m 0 0 Z')] +PASS CSS Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0.2) is [path('m 0 0 Z')] +PASS CSS Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0.6) is [path('m 0 0 Z')] +PASS CSS Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (1) is [path('m 0 0 Z')] +PASS CSS Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (1.4) is [path('m 0 0 Z')] +PASS CSS Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (-0.4) is [path('M 16 42')] +PASS CSS Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0) is [path('M 20 50')] +PASS CSS Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0.2) is [path('M 22 54')] +PASS CSS Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0.6) is [path('M 26 62')] +PASS CSS Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (1) is [path('M 30 70')] +PASS CSS Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (1.4) is [path('M 34 78')] +PASS CSS Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (-0.4) is [path('m 16 42')] +PASS CSS Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0) is [path('m 20 50')] +PASS CSS Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0.2) is [path('m 22 54')] +PASS CSS Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0.6) is [path('m 26 62')] +PASS CSS Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (1) is [path('m 30 70')] +PASS CSS Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (1.4) is [path('m 34 78')] +PASS CSS Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (-0.4) is [path('m 0 0 L 16 42')] +PASS CSS Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0) is [path('m 0 0 L 20 50')] +PASS CSS Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0.2) is [path('m 0 0 L 22 54')] +PASS CSS Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0.6) is [path('m 0 0 L 26 62')] +PASS CSS Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (1) is [path('m 0 0 L 30 70')] +PASS CSS Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (1.4) is [path('m 0 0 L 34 78')] +PASS CSS Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (-0.4) is [path('m 0 0 l 16 42')] +PASS CSS Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0) is [path('m 0 0 l 20 50')] +PASS CSS Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0.2) is [path('m 0 0 l 22 54')] +PASS CSS Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0.6) is [path('m 0 0 l 26 62')] +PASS CSS Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (1) is [path('m 0 0 l 30 70')] +PASS CSS Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (1.4) is [path('m 0 0 l 34 78')] +PASS CSS Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (-0.4) is [path('m 0 0 C 30 40 50 60 10 20')] +PASS CSS Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0) is [path('m 0 0 C 32 42 52 62 12 22')] +PASS CSS Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0.2) is [path('m 0 0 C 33 43 53 63 13 23')] +PASS CSS Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0.6) is [path('m 0 0 C 35 45 55 65 15 25')] +PASS CSS Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (1) is [path('m 0 0 C 37 47 57 67 17 27')] +PASS CSS Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (1.4) is [path('m 0 0 C 39 49 59 69 19 29')] +PASS CSS Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (-0.4) is [path('m 0 0 c 30 40 50 60 10 20')] +PASS CSS Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0) is [path('m 0 0 c 32 42 52 62 12 22')] +PASS CSS Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0.2) is [path('m 0 0 c 33 43 53 63 13 23')] +PASS CSS Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0.6) is [path('m 0 0 c 35 45 55 65 15 25')] +PASS CSS Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (1) is [path('m 0 0 c 37 47 57 67 17 27')] +PASS CSS Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (1.4) is [path('m 0 0 c 39 49 59 69 19 29')] +PASS CSS Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (-0.4) is [path('m 0 0 Q 30 40 50 60')] +PASS CSS Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0) is [path('m 0 0 Q 32 42 52 62')] +PASS CSS Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0.2) is [path('m 0 0 Q 33 43 53 63')] +PASS CSS Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0.6) is [path('m 0 0 Q 35 45 55 65')] +PASS CSS Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (1) is [path('m 0 0 Q 37 47 57 67')] +PASS CSS Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (1.4) is [path('m 0 0 Q 39 49 59 69')] +PASS CSS Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (-0.4) is [path('m 0 0 q 30 40 50 60')] +PASS CSS Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0) is [path('m 0 0 q 32 42 52 62')] +PASS CSS Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0.2) is [path('m 0 0 q 33 43 53 63')] +PASS CSS Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0.6) is [path('m 0 0 q 35 45 55 65')] +PASS CSS Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (1) is [path('m 0 0 q 37 47 57 67')] +PASS CSS Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (1.4) is [path('m 0 0 q 39 49 59 69')] +PASS CSS Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (-0.4) is [path('m 0 0 A -10 0 10 1 0 20 30')] +PASS CSS Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0) is [path('m 0 0 A 10 20 30 1 0 40 50')] +PASS CSS Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0.2) is [path('m 0 0 A 20 30 40 1 0 50 60')] +PASS CSS Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0.6) is [path('m 0 0 A 40 50 60 0 1 70 80')] +PASS CSS Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (1) is [path('m 0 0 A 60 70 80 0 1 90 100')] +PASS CSS Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (1.4) is [path('m 0 0 A 80 90 100 0 1 110 120')] +PASS CSS Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (-0.4) is [path('m 0 0 a -10 0 10 1 0 20 30')] +PASS CSS Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0) is [path('m 0 0 a 10 20 30 1 0 40 50')] +PASS CSS Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0.2) is [path('m 0 0 a 20 30 40 1 0 50 60')] +PASS CSS Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0.6) is [path('m 0 0 a 40 50 60 0 1 70 80')] +PASS CSS Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (1) is [path('m 0 0 a 60 70 80 0 1 90 100')] +PASS CSS Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (1.4) is [path('m 0 0 a 80 90 100 0 1 110 120')] +PASS CSS Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (-0.4) is [path('m 0 0 H -10')] +PASS CSS Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0) is [path('m 0 0 H 10')] +PASS CSS Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0.2) is [path('m 0 0 H 20')] +PASS CSS Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0.6) is [path('m 0 0 H 40')] +PASS CSS Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (1) is [path('m 0 0 H 60')] +PASS CSS Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (1.4) is [path('m 0 0 H 80')] +PASS CSS Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (-0.4) is [path('m 0 0 h -10')] +PASS CSS Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0) is [path('m 0 0 h 10')] +PASS CSS Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0.2) is [path('m 0 0 h 20')] +PASS CSS Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0.6) is [path('m 0 0 h 40')] +PASS CSS Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (1) is [path('m 0 0 h 60')] +PASS CSS Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (1.4) is [path('m 0 0 h 80')] +PASS CSS Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (-0.4) is [path('m 0 0 V -10')] +PASS CSS Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0) is [path('m 0 0 V 10')] +PASS CSS Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0.2) is [path('m 0 0 V 20')] +PASS CSS Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0.6) is [path('m 0 0 V 40')] +PASS CSS Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (1) is [path('m 0 0 V 60')] +PASS CSS Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (1.4) is [path('m 0 0 V 80')] +PASS CSS Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (-0.4) is [path('m 0 0 v -10')] +PASS CSS Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0) is [path('m 0 0 v 10')] +PASS CSS Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0.2) is [path('m 0 0 v 20')] +PASS CSS Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0.6) is [path('m 0 0 v 40')] +PASS CSS Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (1) is [path('m 0 0 v 60')] +PASS CSS Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (1.4) is [path('m 0 0 v 80')] +PASS CSS Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (-0.4) is [path('m 0 0 S 30 40 50 60')] +PASS CSS Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0) is [path('m 0 0 S 32 42 52 62')] +PASS CSS Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0.2) is [path('m 0 0 S 33 43 53 63')] +PASS CSS Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0.6) is [path('m 0 0 S 35 45 55 65')] +PASS CSS Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (1) is [path('m 0 0 S 37 47 57 67')] +PASS CSS Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (1.4) is [path('m 0 0 S 39 49 59 69')] +PASS CSS Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (-0.4) is [path('m 0 0 s 30 40 50 60')] +PASS CSS Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0) is [path('m 0 0 s 32 42 52 62')] +PASS CSS Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0.2) is [path('m 0 0 s 33 43 53 63')] +PASS CSS Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0.6) is [path('m 0 0 s 35 45 55 65')] +PASS CSS Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (1) is [path('m 0 0 s 37 47 57 67')] +PASS CSS Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (1.4) is [path('m 0 0 s 39 49 59 69')] +PASS CSS Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (-0.4) is [path('m 0 0 T 16 42')] +PASS CSS Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0) is [path('m 0 0 T 20 50')] +PASS CSS Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0.2) is [path('m 0 0 T 22 54')] +PASS CSS Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0.6) is [path('m 0 0 T 26 62')] +PASS CSS Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (1) is [path('m 0 0 T 30 70')] +PASS CSS Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (1.4) is [path('m 0 0 T 34 78')] +PASS CSS Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (-0.4) is [path('m 0 0 t 16 42')] +PASS CSS Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0) is [path('m 0 0 t 20 50')] +PASS CSS Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0.2) is [path('m 0 0 t 22 54')] +PASS CSS Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0.6) is [path('m 0 0 t 26 62')] +PASS CSS Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (1) is [path('m 0 0 t 30 70')] +PASS CSS Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (1.4) is [path('m 0 0 t 34 78')] +PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (-0.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 60 -180 Z')] +PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] +PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0.2) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 120 -60 Z')] +PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0.6) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 160 20 Z')] +PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (1) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 200 100 Z')] +PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (1.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 240 180 Z')] +PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (-0.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] +PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] +PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0.2) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] +PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0.6) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] +PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (1) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] +PASS CSS Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (1.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] +PASS CSS Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (-0.4) is [path('M -30 -20 L -10 10 Z L 52 68 Z M 72 84 L 162 144 Z T 126 220')] +PASS CSS Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0) is [path('m 10 20 l 20 30 Z l 50 60 Z m 70 80 l 90 60 Z t 70 120')] +PASS CSS Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0.2) is [path('M 30 40 L 50 70 Z L 64 86 Z M 84 108 L 174 168 Z T 162 220')] +PASS CSS Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0.6) is [path('M 70 80 L 90 110 Z L 72 98 Z M 92 124 L 182 184 Z T 186 220')] +PASS CSS Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (1) is [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] +PASS CSS Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (1.4) is [path('M 150 160 L 170 190 Z L 88 122 Z M 108 156 L 198 216 Z T 234 220')] +PASS CSS Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (-0.4) is [path('M -30 -20 C 14 38 4 48 54 58 C 136 146 186 156 166 176')] +PASS CSS Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0) is [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] +PASS CSS Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0.2) is [path('M 30 40 C 68 86 58 96 108 106 C 202 212 252 222 232 242')] +PASS CSS Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0.6) is [path('M 70 80 C 104 118 94 128 144 138 C 246 256 296 266 276 286')] +PASS CSS Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (1) is [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] +PASS CSS Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (1.4) is [path('M 150 160 C 176 182 166 192 216 202 C 334 344 384 354 364 374')] +PASS CSS Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (-0.4) is [path('M -30 -20 Q 4 48 14 38 Q 130 128 120 138')] +PASS CSS Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0) is [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] +PASS CSS Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0.2) is [path('M 30 40 Q 58 96 68 86 Q 160 146 150 156')] +PASS CSS Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0.6) is [path('M 70 80 Q 94 128 104 118 Q 180 158 170 168')] +PASS CSS Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (1) is [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] +PASS CSS Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (1.4) is [path('M 150 160 Q 166 192 176 182 Q 220 182 210 192')] +PASS CSS Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (-0.4) is [path('M -30 -20 S 4 48 14 38 S 130 128 120 138')] +PASS CSS Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0) is [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] +PASS CSS Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0.2) is [path('M 30 40 S 58 96 68 86 S 160 146 150 156')] +PASS CSS Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0.6) is [path('M 70 80 S 94 128 104 118 S 180 158 170 168')] +PASS CSS Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (1) is [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] +PASS CSS Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (1.4) is [path('M 150 160 S 166 192 176 182 S 220 182 210 192')] +PASS CSS Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (-0.4) is [path('M -30 -20 H 4 V 28 H 26 V 64 L 116 168')] +PASS CSS Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0) is [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] +PASS CSS Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0.2) is [path('M 30 40 H 58 V 76 H 122 V 148 L 182 216')] +PASS CSS Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0.6) is [path('M 70 80 H 94 V 108 H 186 V 204 L 226 248')] +PASS CSS Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (1) is [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] +PASS CSS Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (1.4) is [path('M 150 160 H 166 V 172 H 314 V 316 L 314 312')] +PASS CSS Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (-0.4) is [path('M 6 16 A -10 0 10 1 0 34 58 A 90 100 10 1 1 230 128')] +PASS CSS Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0) is [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] +PASS CSS Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0.2) is [path('M 12 22 A 20 30 40 1 0 58 76 A 120 130 40 1 1 170 116')] +PASS CSS Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0.6) is [path('M 16 26 A 40 50 60 0 1 74 88 A 140 150 60 0 1 130 108')] +PASS CSS Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (1) is [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] +PASS CSS Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (1.4) is [path('M 24 34 A 80 90 100 0 1 106 112 A 180 190 100 0 1 50 92')] +PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (-0.3) is [path('m 0 0 h 1 h 2')] +PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0) is [path('m 0 0 h 1 h 2')] +PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.3) is [path('m 0 0 h 1 h 2')] +PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.5) is [path('m 0 0 h 3')] +PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (0.6) is [path('m 0 0 h 3')] +PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (1) is [path('m 0 0 h 3')] +PASS Web Animations: property <d> from [path('m 0 0 h 1 h 2')] to [path('m 0 0 h 3')] at (1.5) is [path('m 0 0 h 3')] +PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (-0.3) is [path('m 10 0 h 1')] +PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0) is [path('m 10 0 h 1')] +PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.3) is [path('m 10 0 h 1')] +PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.5) is [path('m 20 0 v 2')] +PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (0.6) is [path('m 20 0 v 2')] +PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (1) is [path('m 20 0 v 2')] +PASS Web Animations: property <d> from [path('m 10 0 h 1')] to [path('m 20 0 v 2')] at (1.5) is [path('m 20 0 v 2')] +PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (-0.3) is [path('m 1 2 l 3 4 Z')] +PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0) is [path('m 1 2 l 3 4 Z')] +PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.3) is [path('m 1 2 l 3 4 Z')] +PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.5) is [path('m 1 2 l 3 4')] +PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (0.6) is [path('m 1 2 l 3 4')] +PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (1) is [path('m 1 2 l 3 4')] +PASS Web Animations: property <d> from [path('m 1 2 l 3 4 Z')] to [path('m 1 2 l 3 4')] at (1.5) is [path('m 1 2 l 3 4')] +PASS Web Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (-0.4) is [path('m 0 0 Z')] +PASS Web Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0) is [path('m 0 0 Z')] +PASS Web Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0.2) is [path('m 0 0 Z')] +PASS Web Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (0.6) is [path('m 0 0 Z')] +PASS Web Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (1) is [path('m 0 0 Z')] +PASS Web Animations: property <d> from [path('m 0 0 Z')] to [path('m 0 0 Z')] at (1.4) is [path('m 0 0 Z')] +PASS Web Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (-0.4) is [path('M 16 42')] +PASS Web Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0) is [path('M 20 50')] +PASS Web Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0.2) is [path('M 22 54')] +PASS Web Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (0.6) is [path('M 26 62')] +PASS Web Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (1) is [path('M 30 70')] +PASS Web Animations: property <d> from [path('M 20 50')] to [path('M 30 70')] at (1.4) is [path('M 34 78')] +PASS Web Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (-0.4) is [path('m 16 42')] +PASS Web Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0) is [path('m 20 50')] +PASS Web Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0.2) is [path('m 22 54')] +PASS Web Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (0.6) is [path('m 26 62')] +PASS Web Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (1) is [path('m 30 70')] +PASS Web Animations: property <d> from [path('m 20 50')] to [path('m 30 70')] at (1.4) is [path('m 34 78')] +PASS Web Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (-0.4) is [path('m 0 0 L 16 42')] +PASS Web Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0) is [path('m 0 0 L 20 50')] +PASS Web Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0.2) is [path('m 0 0 L 22 54')] +PASS Web Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (0.6) is [path('m 0 0 L 26 62')] +PASS Web Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (1) is [path('m 0 0 L 30 70')] +PASS Web Animations: property <d> from [path('m 0 0 L 20 50')] to [path('m 0 0 L 30 70')] at (1.4) is [path('m 0 0 L 34 78')] +PASS Web Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (-0.4) is [path('m 0 0 l 16 42')] +PASS Web Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0) is [path('m 0 0 l 20 50')] +PASS Web Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0.2) is [path('m 0 0 l 22 54')] +PASS Web Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (0.6) is [path('m 0 0 l 26 62')] +PASS Web Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (1) is [path('m 0 0 l 30 70')] +PASS Web Animations: property <d> from [path('m 0 0 l 20 50')] to [path('m 0 0 l 30 70')] at (1.4) is [path('m 0 0 l 34 78')] +PASS Web Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (-0.4) is [path('m 0 0 C 30 40 50 60 10 20')] +PASS Web Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0) is [path('m 0 0 C 32 42 52 62 12 22')] +PASS Web Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0.2) is [path('m 0 0 C 33 43 53 63 13 23')] +PASS Web Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (0.6) is [path('m 0 0 C 35 45 55 65 15 25')] +PASS Web Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (1) is [path('m 0 0 C 37 47 57 67 17 27')] +PASS Web Animations: property <d> from [path('m 0 0 C 32 42 52 62 12 22')] to [path('m 0 0 C 37 47 57 67 17 27')] at (1.4) is [path('m 0 0 C 39 49 59 69 19 29')] +PASS Web Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (-0.4) is [path('m 0 0 c 30 40 50 60 10 20')] +PASS Web Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0) is [path('m 0 0 c 32 42 52 62 12 22')] +PASS Web Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0.2) is [path('m 0 0 c 33 43 53 63 13 23')] +PASS Web Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (0.6) is [path('m 0 0 c 35 45 55 65 15 25')] +PASS Web Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (1) is [path('m 0 0 c 37 47 57 67 17 27')] +PASS Web Animations: property <d> from [path('m 0 0 c 32 42 52 62 12 22')] to [path('m 0 0 c 37 47 57 67 17 27')] at (1.4) is [path('m 0 0 c 39 49 59 69 19 29')] +PASS Web Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (-0.4) is [path('m 0 0 Q 30 40 50 60')] +PASS Web Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0) is [path('m 0 0 Q 32 42 52 62')] +PASS Web Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0.2) is [path('m 0 0 Q 33 43 53 63')] +PASS Web Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (0.6) is [path('m 0 0 Q 35 45 55 65')] +PASS Web Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (1) is [path('m 0 0 Q 37 47 57 67')] +PASS Web Animations: property <d> from [path('m 0 0 Q 32 42 52 62')] to [path('m 0 0 Q 37 47 57 67')] at (1.4) is [path('m 0 0 Q 39 49 59 69')] +PASS Web Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (-0.4) is [path('m 0 0 q 30 40 50 60')] +PASS Web Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0) is [path('m 0 0 q 32 42 52 62')] +PASS Web Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0.2) is [path('m 0 0 q 33 43 53 63')] +PASS Web Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (0.6) is [path('m 0 0 q 35 45 55 65')] +PASS Web Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (1) is [path('m 0 0 q 37 47 57 67')] +PASS Web Animations: property <d> from [path('m 0 0 q 32 42 52 62')] to [path('m 0 0 q 37 47 57 67')] at (1.4) is [path('m 0 0 q 39 49 59 69')] +PASS Web Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (-0.4) is [path('m 0 0 A -10 0 10 1 0 20 30')] +PASS Web Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0) is [path('m 0 0 A 10 20 30 1 0 40 50')] +PASS Web Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0.2) is [path('m 0 0 A 20 30 40 1 0 50 60')] +PASS Web Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (0.6) is [path('m 0 0 A 40 50 60 0 1 70 80')] +PASS Web Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (1) is [path('m 0 0 A 60 70 80 0 1 90 100')] +PASS Web Animations: property <d> from [path('m 0 0 A 10 20 30 1 0 40 50')] to [path('m 0 0 A 60 70 80 0 1 90 100')] at (1.4) is [path('m 0 0 A 80 90 100 0 1 110 120')] +PASS Web Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (-0.4) is [path('m 0 0 a -10 0 10 1 0 20 30')] +PASS Web Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0) is [path('m 0 0 a 10 20 30 1 0 40 50')] +PASS Web Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0.2) is [path('m 0 0 a 20 30 40 1 0 50 60')] +PASS Web Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (0.6) is [path('m 0 0 a 40 50 60 0 1 70 80')] +PASS Web Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (1) is [path('m 0 0 a 60 70 80 0 1 90 100')] +PASS Web Animations: property <d> from [path('m 0 0 a 10 20 30 1 0 40 50')] to [path('m 0 0 a 60 70 80 0 1 90 100')] at (1.4) is [path('m 0 0 a 80 90 100 0 1 110 120')] +PASS Web Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (-0.4) is [path('m 0 0 H -10')] +PASS Web Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0) is [path('m 0 0 H 10')] +PASS Web Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0.2) is [path('m 0 0 H 20')] +PASS Web Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (0.6) is [path('m 0 0 H 40')] +PASS Web Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (1) is [path('m 0 0 H 60')] +PASS Web Animations: property <d> from [path('m 0 0 H 10')] to [path('m 0 0 H 60')] at (1.4) is [path('m 0 0 H 80')] +PASS Web Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (-0.4) is [path('m 0 0 h -10')] +PASS Web Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0) is [path('m 0 0 h 10')] +PASS Web Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0.2) is [path('m 0 0 h 20')] +PASS Web Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (0.6) is [path('m 0 0 h 40')] +PASS Web Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (1) is [path('m 0 0 h 60')] +PASS Web Animations: property <d> from [path('m 0 0 h 10')] to [path('m 0 0 h 60')] at (1.4) is [path('m 0 0 h 80')] +PASS Web Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (-0.4) is [path('m 0 0 V -10')] +PASS Web Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0) is [path('m 0 0 V 10')] +PASS Web Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0.2) is [path('m 0 0 V 20')] +PASS Web Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (0.6) is [path('m 0 0 V 40')] +PASS Web Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (1) is [path('m 0 0 V 60')] +PASS Web Animations: property <d> from [path('m 0 0 V 10')] to [path('m 0 0 V 60')] at (1.4) is [path('m 0 0 V 80')] +PASS Web Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (-0.4) is [path('m 0 0 v -10')] +PASS Web Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0) is [path('m 0 0 v 10')] +PASS Web Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0.2) is [path('m 0 0 v 20')] +PASS Web Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (0.6) is [path('m 0 0 v 40')] +PASS Web Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (1) is [path('m 0 0 v 60')] +PASS Web Animations: property <d> from [path('m 0 0 v 10')] to [path('m 0 0 v 60')] at (1.4) is [path('m 0 0 v 80')] +PASS Web Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (-0.4) is [path('m 0 0 S 30 40 50 60')] +PASS Web Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0) is [path('m 0 0 S 32 42 52 62')] +PASS Web Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0.2) is [path('m 0 0 S 33 43 53 63')] +PASS Web Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (0.6) is [path('m 0 0 S 35 45 55 65')] +PASS Web Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (1) is [path('m 0 0 S 37 47 57 67')] +PASS Web Animations: property <d> from [path('m 0 0 S 32 42 52 62')] to [path('m 0 0 S 37 47 57 67')] at (1.4) is [path('m 0 0 S 39 49 59 69')] +PASS Web Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (-0.4) is [path('m 0 0 s 30 40 50 60')] +PASS Web Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0) is [path('m 0 0 s 32 42 52 62')] +PASS Web Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0.2) is [path('m 0 0 s 33 43 53 63')] +PASS Web Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (0.6) is [path('m 0 0 s 35 45 55 65')] +PASS Web Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (1) is [path('m 0 0 s 37 47 57 67')] +PASS Web Animations: property <d> from [path('m 0 0 s 32 42 52 62')] to [path('m 0 0 s 37 47 57 67')] at (1.4) is [path('m 0 0 s 39 49 59 69')] +PASS Web Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (-0.4) is [path('m 0 0 T 16 42')] +PASS Web Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0) is [path('m 0 0 T 20 50')] +PASS Web Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0.2) is [path('m 0 0 T 22 54')] +PASS Web Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (0.6) is [path('m 0 0 T 26 62')] +PASS Web Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (1) is [path('m 0 0 T 30 70')] +PASS Web Animations: property <d> from [path('m 0 0 T 20 50')] to [path('m 0 0 T 30 70')] at (1.4) is [path('m 0 0 T 34 78')] +PASS Web Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (-0.4) is [path('m 0 0 t 16 42')] +PASS Web Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0) is [path('m 0 0 t 20 50')] +PASS Web Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0.2) is [path('m 0 0 t 22 54')] +PASS Web Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (0.6) is [path('m 0 0 t 26 62')] +PASS Web Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (1) is [path('m 0 0 t 30 70')] +PASS Web Animations: property <d> from [path('m 0 0 t 20 50')] to [path('m 0 0 t 30 70')] at (1.4) is [path('m 0 0 t 34 78')] +PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (-0.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 60 -180 Z')] +PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] +PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0.2) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 120 -60 Z')] +PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (0.6) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 160 20 Z')] +PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (1) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 200 100 Z')] +PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')] at (1.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 240 180 Z')] +PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (-0.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] +PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0) is [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] +PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0.2) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] +PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (0.6) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] +PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (1) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] +PASS Web Animations: property <d> from [path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')] to [path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')] at (1.4) is [path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')] +PASS Web Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (-0.4) is [path('M -30 -20 L -10 10 Z L 52 68 Z M 72 84 L 162 144 Z T 126 220')] +PASS Web Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0) is [path('m 10 20 l 20 30 Z l 50 60 Z m 70 80 l 90 60 Z t 70 120')] +PASS Web Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0.2) is [path('M 30 40 L 50 70 Z L 64 86 Z M 84 108 L 174 168 Z T 162 220')] +PASS Web Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (0.6) is [path('M 70 80 L 90 110 Z L 72 98 Z M 92 124 L 182 184 Z T 186 220')] +PASS Web Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (1) is [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] +PASS Web Animations: property <d> from [path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')] to [path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')] at (1.4) is [path('M 150 160 L 170 190 Z L 88 122 Z M 108 156 L 198 216 Z T 234 220')] +PASS Web Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (-0.4) is [path('M -30 -20 C 14 38 4 48 54 58 C 136 146 186 156 166 176')] +PASS Web Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0) is [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] +PASS Web Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0.2) is [path('M 30 40 C 68 86 58 96 108 106 C 202 212 252 222 232 242')] +PASS Web Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (0.6) is [path('M 70 80 C 104 118 94 128 144 138 C 246 256 296 266 276 286')] +PASS Web Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (1) is [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] +PASS Web Animations: property <d> from [path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')] to [path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')] at (1.4) is [path('M 150 160 C 176 182 166 192 216 202 C 334 344 384 354 364 374')] +PASS Web Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (-0.4) is [path('M -30 -20 Q 4 48 14 38 Q 130 128 120 138')] +PASS Web Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0) is [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] +PASS Web Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0.2) is [path('M 30 40 Q 58 96 68 86 Q 160 146 150 156')] +PASS Web Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (0.6) is [path('M 70 80 Q 94 128 104 118 Q 180 158 170 168')] +PASS Web Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (1) is [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] +PASS Web Animations: property <d> from [path('m 10 20 q 30 60 40 50 q 100 70 90 80')] to [path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')] at (1.4) is [path('M 150 160 Q 166 192 176 182 Q 220 182 210 192')] +PASS Web Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (-0.4) is [path('M -30 -20 S 4 48 14 38 S 130 128 120 138')] +PASS Web Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0) is [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] +PASS Web Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0.2) is [path('M 30 40 S 58 96 68 86 S 160 146 150 156')] +PASS Web Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (0.6) is [path('M 70 80 S 94 128 104 118 S 180 158 170 168')] +PASS Web Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (1) is [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] +PASS Web Animations: property <d> from [path('m 10 20 s 30 60 40 50 s 100 70 90 80')] to [path('M 110 120 S 130 160 140 150 S 200 170 190 180')] at (1.4) is [path('M 150 160 S 166 192 176 182 S 220 182 210 192')] +PASS Web Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (-0.4) is [path('M -30 -20 H 4 V 28 H 26 V 64 L 116 168')] +PASS Web Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0) is [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] +PASS Web Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0.2) is [path('M 30 40 H 58 V 76 H 122 V 148 L 182 216')] +PASS Web Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (0.6) is [path('M 70 80 H 94 V 108 H 186 V 204 L 226 248')] +PASS Web Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (1) is [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] +PASS Web Animations: property <d> from [path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')] to [path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')] at (1.4) is [path('M 150 160 H 166 V 172 H 314 V 316 L 314 312')] +PASS Web Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (-0.4) is [path('M 6 16 A -10 0 10 1 0 34 58 A 90 100 10 1 1 230 128')] +PASS Web Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0) is [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] +PASS Web Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0.2) is [path('M 12 22 A 20 30 40 1 0 58 76 A 120 130 40 1 1 170 116')] +PASS Web Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (0.6) is [path('M 16 26 A 40 50 60 0 1 74 88 A 140 150 60 0 1 130 108')] +PASS Web Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (1) is [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] +PASS Web Animations: property <d> from [path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')] to [path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')] at (1.4) is [path('M 24 34 A 80 90 100 0 1 106 112 A 180 190 100 0 1 50 92')] +Harness: the test ran to completion. + diff --git a/third_party/WebKit/LayoutTests/animations/interpolation/svg-d-interpolation.html b/third_party/WebKit/LayoutTests/animations/interpolation/svg-d-interpolation.html index 1766336..355816f 100644 --- a/third_party/WebKit/LayoutTests/animations/interpolation/svg-d-interpolation.html +++ b/third_party/WebKit/LayoutTests/animations/interpolation/svg-d-interpolation.html @@ -296,12 +296,12 @@ assertInterpolation({ from: "path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')", to: "path('M 0 0 L 100 100 m 0 100 l 100 0 z l 200 100 z')" }, [ - {at: -0.4, is: "path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 120 20 Z')"}, + {at: -0.4, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 60 -180 Z')"}, {at: 0, is: "path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')"}, - {at: 0.2, is: "path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 240 140 Z')"}, - {at: 0.6, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 120 20 Z')"}, + {at: 0.2, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 120 -60 Z')"}, + {at: 0.6, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 160 20 Z')"}, {at: 1, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 200 100 Z')"}, - {at: 1.4, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 280 180 Z')"}, + {at: 1.4, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 240 180 Z')"}, ]); assertInterpolation({ @@ -309,12 +309,12 @@ assertInterpolation({ from: "path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')", to: "path('M 0 0 L 100 100 m 0 100 l 100 0 z l 100 -100 z')" }, [ - {at: -0.4, is: "path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 160 100 Z')"}, + {at: -0.4, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')"}, {at: 0, is: "path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 200 100 Z')"}, - {at: 0.2, is: "path('M 0 0 L 100 100 M 100 200 L 200 200 Z L 220 100 Z')"}, - {at: 0.6, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 60 -100 Z')"}, + {at: 0.2, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')"}, + {at: 0.6, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')"}, {at: 1, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')"}, - {at: 1.4, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 140 -100 Z')"}, + {at: 1.4, is: "path('M 0 0 L 100 100 m 0 100 l 100 0 Z l 100 -100 Z')"}, ]); assertInterpolation({ @@ -322,12 +322,12 @@ assertInterpolation({ from: "path('m 10 20 l 20 30 z l 50 60 z m 70 80 l 90 60 z t 70 120')", to: "path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')" }, [ - {at: -0.4, is: "path('m -30 -20 l 20 30 Z l 90 100 Z m 90 100 l 90 60 Z t 90 160')"}, + {at: -0.4, is: "path('M -30 -20 L -10 10 Z L 52 68 Z M 72 84 L 162 144 Z T 126 220')"}, {at: 0, is: "path('m 10 20 l 20 30 Z l 50 60 Z m 70 80 l 90 60 Z t 70 120')"}, - {at: 0.2, is: "path('m 30 40 l 20 30 Z l 30 40 Z m 60 70 l 90 60 Z t 60 100')"}, - {at: 0.6, is: "path('M 70 80 L 90 110 Z L 80 110 Z M 120 160 L 210 220 Z T 250 280')"}, + {at: 0.2, is: "path('M 30 40 L 50 70 Z L 64 86 Z M 84 108 L 174 168 Z T 162 220')"}, + {at: 0.6, is: "path('M 70 80 L 90 110 Z L 72 98 Z M 92 124 L 182 184 Z T 186 220')"}, {at: 1, is: "path('M 110 120 L 130 150 Z L 80 110 Z M 100 140 L 190 200 Z T 210 220')"}, - {at: 1.4, is: "path('M 150 160 L 170 190 Z L 80 110 Z M 80 120 L 170 180 Z T 170 160')"} + {at: 1.4, is: "path('M 150 160 L 170 190 Z L 88 122 Z M 108 156 L 198 216 Z T 234 220')"} ]); assertInterpolation({ @@ -335,9 +335,9 @@ assertInterpolation({ from: "path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')", to: "path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')" }, [ - {at: -0.4, is: "path('m -30 -20 c 44 58 34 68 84 78 c 82 88 132 98 112 118')"}, + {at: -0.4, is: "path('M -30 -20 C 14 38 4 48 54 58 C 136 146 186 156 166 176')"}, {at: 0, is: "path('m 10 20 c 40 50 30 60 80 70 c 90 100 140 110 120 130')"}, - {at: 0.2, is: "path('m 30 40 c 38 46 28 56 78 66 c 94 106 144 116 124 136')"}, + {at: 0.2, is: "path('M 30 40 C 68 86 58 96 108 106 C 202 212 252 222 232 242')"}, {at: 0.6, is: "path('M 70 80 C 104 118 94 128 144 138 C 246 256 296 266 276 286')"}, {at: 1, is: "path('M 110 120 C 140 150 130 160 180 170 C 290 300 340 310 320 330')"}, {at: 1.4, is: "path('M 150 160 C 176 182 166 192 216 202 C 334 344 384 354 364 374')"} @@ -348,9 +348,9 @@ assertInterpolation({ from: "path('m 10 20 q 30 60 40 50 q 100 70 90 80')", to: "path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')" }, [ - {at: -0.4, is: "path('m -30 -20 q 34 68 44 58 q 116 90 106 100')"}, + {at: -0.4, is: "path('M -30 -20 Q 4 48 14 38 Q 130 128 120 138')"}, {at: 0, is: "path('m 10 20 q 30 60 40 50 q 100 70 90 80')"}, - {at: 0.2, is: "path('m 30 40 q 28 56 38 46 q 92 60 82 70')"}, + {at: 0.2, is: "path('M 30 40 Q 58 96 68 86 Q 160 146 150 156')"}, {at: 0.6, is: "path('M 70 80 Q 94 128 104 118 Q 180 158 170 168')"}, {at: 1, is: "path('M 110 120 Q 130 160 140 150 Q 200 170 190 180')"}, {at: 1.4, is: "path('M 150 160 Q 166 192 176 182 Q 220 182 210 192')"} @@ -361,9 +361,9 @@ assertInterpolation({ from: "path('m 10 20 s 30 60 40 50 s 100 70 90 80')", to: "path('M 110 120 S 130 160 140 150 S 200 170 190 180')" }, [ - {at: -0.4, is: "path('m -30 -20 s 34 68 44 58 s 116 90 106 100')"}, + {at: -0.4, is: "path('M -30 -20 S 4 48 14 38 S 130 128 120 138')"}, {at: 0, is: "path('m 10 20 s 30 60 40 50 s 100 70 90 80')"}, - {at: 0.2, is: "path('m 30 40 s 28 56 38 46 s 92 60 82 70')"}, + {at: 0.2, is: "path('M 30 40 S 58 96 68 86 S 160 146 150 156')"}, {at: 0.6, is: "path('M 70 80 S 94 128 104 118 S 180 158 170 168')"}, {at: 1, is: "path('M 110 120 S 130 160 140 150 S 200 170 190 180')"}, {at: 1.4, is: "path('M 150 160 S 166 192 176 182 S 220 182 210 192')"} @@ -374,9 +374,9 @@ assertInterpolation({ from: "path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')", to: "path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')" }, [ - {at: -0.4, is: "path('m -30 -20 h 34 v 48 h 22 v 36 l 90 104')"}, + {at: -0.4, is: "path('M -30 -20 H 4 V 28 H 26 V 64 L 116 168')"}, {at: 0, is: "path('m 10 20 h 30 v 40 h 50 v 60 l 70 80')"}, - {at: 0.2, is: "path('m 30 40 h 28 v 36 h 64 v 72 l 60 68')"}, + {at: 0.2, is: "path('M 30 40 H 58 V 76 H 122 V 148 L 182 216')"}, {at: 0.6, is: "path('M 70 80 H 94 V 108 H 186 V 204 L 226 248')"}, {at: 1, is: "path('M 110 120 H 130 V 140 H 250 V 260 L 270 280')"}, {at: 1.4, is: "path('M 150 160 H 166 V 172 H 314 V 316 L 314 312')"} @@ -387,9 +387,9 @@ assertInterpolation({ from: "path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')", to: "path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')" }, [ - {at: -0.4, is: "path('m 6 16 a -10 0 10 1 0 28 42 a 90 100 10 1 1 196 70')"}, + {at: -0.4, is: "path('M 6 16 A -10 0 10 1 0 34 58 A 90 100 10 1 1 230 128')"}, {at: 0, is: "path('m 10 20 a 10 20 30 1 0 40 50 a 110 120 30 1 1 140 50')"}, - {at: 0.2, is: "path('m 12 22 a 20 30 40 1 0 46 54 a 120 130 40 1 1 112 40')"}, + {at: 0.2, is: "path('M 12 22 A 20 30 40 1 0 58 76 A 120 130 40 1 1 170 116')"}, {at: 0.6, is: "path('M 16 26 A 40 50 60 0 1 74 88 A 140 150 60 0 1 130 108')"}, {at: 1, is: "path('M 20 30 A 60 70 80 0 1 90 100 A 160 170 80 0 1 90 100')"}, {at: 1.4, is: "path('M 24 34 A 80 90 100 0 1 106 112 A 180 190 100 0 1 50 92')"} diff --git a/third_party/WebKit/Source/core/animation/CSSPathInterpolationType.cpp b/third_party/WebKit/Source/core/animation/CSSPathInterpolationType.cpp new file mode 100644 index 0000000..0299722 --- /dev/null +++ b/third_party/WebKit/Source/core/animation/CSSPathInterpolationType.cpp @@ -0,0 +1,81 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/animation/CSSPathInterpolationType.h" + +#include "core/animation/PathInterpolationFunctions.h" +#include "core/css/CSSPathValue.h" +#include "core/css/resolver/StyleResolverState.h" + +namespace blink { + +void CSSPathInterpolationType::apply(const InterpolableValue& interpolableValue, const NonInterpolableValue* nonInterpolableValue, InterpolationEnvironment& environment) const +{ + ASSERT(cssProperty() == CSSPropertyD); + environment.state().style()->setD(StylePath::create(PathInterpolationFunctions::appliedValue(interpolableValue, nonInterpolableValue))); +} + +void CSSPathInterpolationType::composite(UnderlyingValue& underlyingValue, double underlyingFraction, const InterpolationValue& value) const +{ + PathInterpolationFunctions::composite(underlyingValue, underlyingFraction, value); +} + +PassOwnPtr<InterpolationValue> CSSPathInterpolationType::maybeConvertNeutral(const UnderlyingValue& underlyingValue, ConversionCheckers& conversionCheckers) const +{ + return PathInterpolationFunctions::maybeConvertNeutral(*this, underlyingValue, conversionCheckers); +} + +PassOwnPtr<InterpolationValue> CSSPathInterpolationType::maybeConvertInitial() const +{ + return PathInterpolationFunctions::convertValue(*this, CSSPathValue::emptyPathValue()->byteStream()); +} + +class ParentPathChecker : public InterpolationType::ConversionChecker { +public: + static PassOwnPtr<ParentPathChecker> create(const InterpolationType& type, PassRefPtr<StylePath> stylePath) + { + return adoptPtr(new ParentPathChecker(type, stylePath)); + } + +private: + ParentPathChecker(const InterpolationType& type, PassRefPtr<StylePath> stylePath) + : ConversionChecker(type) + , m_stylePath(stylePath) + { } + + bool isValid(const InterpolationEnvironment& environment, const UnderlyingValue&) const final + { + return environment.state().parentStyle()->svgStyle().d() == m_stylePath.get(); + } + + const RefPtr<StylePath> m_stylePath; +}; + +PassOwnPtr<InterpolationValue> CSSPathInterpolationType::maybeConvertInherit(const StyleResolverState& state, ConversionCheckers& conversionCheckers) const +{ + ASSERT(cssProperty() == CSSPropertyD); + if (!state.parentStyle()) + return nullptr; + + conversionCheckers.append(ParentPathChecker::create(*this, state.parentStyle()->svgStyle().d())); + return PathInterpolationFunctions::convertValue(*this, state.parentStyle()->svgStyle().d()->byteStream()); +} + +PassOwnPtr<InterpolationValue> CSSPathInterpolationType::maybeConvertValue(const CSSValue& value, const StyleResolverState& state, ConversionCheckers& conversionCheckers) const +{ + return PathInterpolationFunctions::convertValue(*this, toCSSPathValue(value).byteStream()); +} + +PassOwnPtr<InterpolationValue> CSSPathInterpolationType::maybeConvertUnderlyingValue(const InterpolationEnvironment& environment) const +{ + ASSERT(cssProperty() == CSSPropertyD); + return PathInterpolationFunctions::convertValue(*this, environment.state().style()->svgStyle().d()->byteStream()); +} + +PassOwnPtr<PairwisePrimitiveInterpolation> CSSPathInterpolationType::mergeSingleConversions(InterpolationValue& startValue, InterpolationValue& endValue) const +{ + return PathInterpolationFunctions::mergeSingleConversions(*this, startValue, endValue); +} + +} // namespace blink diff --git a/third_party/WebKit/Source/core/animation/CSSPathInterpolationType.h b/third_party/WebKit/Source/core/animation/CSSPathInterpolationType.h new file mode 100644 index 0000000..e9f2324 --- /dev/null +++ b/third_party/WebKit/Source/core/animation/CSSPathInterpolationType.h @@ -0,0 +1,32 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CSSPathInterpolationType_h +#define CSSPathInterpolationType_h + +#include "core/animation/CSSInterpolationType.h" + +namespace blink { + +class CSSPathInterpolationType : public CSSInterpolationType { +public: + CSSPathInterpolationType(CSSPropertyID property) + : CSSInterpolationType(property) + { } + + void apply(const InterpolableValue&, const NonInterpolableValue*, InterpolationEnvironment&) const final; + void composite(UnderlyingValue&, double underlyingFraction, const InterpolationValue&) const final; + +protected: + PassOwnPtr<InterpolationValue> maybeConvertNeutral(const UnderlyingValue&, ConversionCheckers&) const final; + PassOwnPtr<InterpolationValue> maybeConvertInitial() const final; + PassOwnPtr<InterpolationValue> maybeConvertInherit(const StyleResolverState&, ConversionCheckers&) const final; + PassOwnPtr<InterpolationValue> maybeConvertValue(const CSSValue&, const StyleResolverState&, ConversionCheckers&) const final; + PassOwnPtr<InterpolationValue> maybeConvertUnderlyingValue(const InterpolationEnvironment&) const final; + PassOwnPtr<PairwisePrimitiveInterpolation> mergeSingleConversions(InterpolationValue& startValue, InterpolationValue& endValue) const final; +}; + +} // namespace blink + +#endif // CSSPathInterpolationType_h diff --git a/third_party/WebKit/Source/core/animation/PathInterpolationFunctions.cpp b/third_party/WebKit/Source/core/animation/PathInterpolationFunctions.cpp new file mode 100644 index 0000000..92a837b --- /dev/null +++ b/third_party/WebKit/Source/core/animation/PathInterpolationFunctions.cpp @@ -0,0 +1,167 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/animation/PathInterpolationFunctions.h" + +#include "core/animation/InterpolatedSVGPathSource.h" +#include "core/animation/InterpolationEnvironment.h" +#include "core/animation/SVGPathSegInterpolationFunctions.h" +#include "core/css/CSSPathValue.h" +#include "core/svg/SVGPath.h" +#include "core/svg/SVGPathByteStreamBuilder.h" +#include "core/svg/SVGPathByteStreamSource.h" +#include "core/svg/SVGPathParser.h" + +namespace blink { + +class SVGPathNonInterpolableValue : public NonInterpolableValue { +public: + virtual ~SVGPathNonInterpolableValue() {} + + static PassRefPtr<SVGPathNonInterpolableValue> create(Vector<SVGPathSegType>& pathSegTypes) + { + return adoptRef(new SVGPathNonInterpolableValue(pathSegTypes)); + } + + const Vector<SVGPathSegType>& pathSegTypes() const { return m_pathSegTypes; } + + DECLARE_NON_INTERPOLABLE_VALUE_TYPE(); + +private: + SVGPathNonInterpolableValue(Vector<SVGPathSegType>& pathSegTypes) + { + m_pathSegTypes.swap(pathSegTypes); + } + + Vector<SVGPathSegType> m_pathSegTypes; +}; + +DEFINE_NON_INTERPOLABLE_VALUE_TYPE(SVGPathNonInterpolableValue); +DEFINE_NON_INTERPOLABLE_VALUE_TYPE_CASTS(SVGPathNonInterpolableValue); + +enum PathComponentIndex { + PathArgsIndex, + PathNeutralIndex, + PathComponentIndexCount, +}; + +PassOwnPtr<InterpolationValue> PathInterpolationFunctions::convertValue(const InterpolationType& type, const SVGPathByteStream& byteStream) +{ + SVGPathByteStreamSource pathSource(byteStream); + size_t length = 0; + PathCoordinates currentCoordinates; + Vector<OwnPtr<InterpolableValue>> interpolablePathSegs; + Vector<SVGPathSegType> pathSegTypes; + + while (pathSource.hasMoreData()) { + const PathSegmentData segment = pathSource.parseSegment(); + interpolablePathSegs.append(SVGPathSegInterpolationFunctions::consumePathSeg(segment, currentCoordinates)); + pathSegTypes.append(segment.command); + length++; + } + + OwnPtr<InterpolableList> pathArgs = InterpolableList::create(length); + for (size_t i = 0; i < interpolablePathSegs.size(); i++) + pathArgs->set(i, interpolablePathSegs[i].release()); + + OwnPtr<InterpolableList> result = InterpolableList::create(PathComponentIndexCount); + result->set(PathArgsIndex, pathArgs.release()); + result->set(PathNeutralIndex, InterpolableNumber::create(0)); + + return InterpolationValue::create(type, result.release(), SVGPathNonInterpolableValue::create(pathSegTypes)); +} + +class UnderlyingPathSegTypesChecker : public InterpolationType::ConversionChecker { +public: + ~UnderlyingPathSegTypesChecker() final {} + + static PassOwnPtr<UnderlyingPathSegTypesChecker> create(const InterpolationType& type, const UnderlyingValue& underlyingValue) + { + return adoptPtr(new UnderlyingPathSegTypesChecker(type, getPathSegTypes(underlyingValue))); + } + +private: + UnderlyingPathSegTypesChecker(const InterpolationType& type, const Vector<SVGPathSegType>& pathSegTypes) + : ConversionChecker(type) + , m_pathSegTypes(pathSegTypes) + { } + + static const Vector<SVGPathSegType>& getPathSegTypes(const UnderlyingValue& underlyingValue) + { + return toSVGPathNonInterpolableValue(underlyingValue->nonInterpolableValue())->pathSegTypes(); + } + + bool isValid(const InterpolationEnvironment&, const UnderlyingValue& underlyingValue) const final + { + return m_pathSegTypes == getPathSegTypes(underlyingValue); + } + + Vector<SVGPathSegType> m_pathSegTypes; +}; + +PassOwnPtr<InterpolationValue> PathInterpolationFunctions::maybeConvertNeutral(const InterpolationType& type, const UnderlyingValue& underlyingValue, InterpolationType::ConversionCheckers& conversionCheckers) +{ + conversionCheckers.append(UnderlyingPathSegTypesChecker::create(type, underlyingValue)); + OwnPtr<InterpolableList> result = InterpolableList::create(PathComponentIndexCount); + result->set(PathArgsIndex, toInterpolableList(underlyingValue->interpolableValue()).get(PathArgsIndex)->cloneAndZero()); + result->set(PathNeutralIndex, InterpolableNumber::create(1)); + return InterpolationValue::create(type, result.release(), + const_cast<NonInterpolableValue*>(underlyingValue->nonInterpolableValue())); // Take ref. +} + +static bool pathSegTypesMatch(const Vector<SVGPathSegType>& a, const Vector<SVGPathSegType>& b) +{ + if (a.size() != b.size()) + return false; + + for (size_t i = 0; i < a.size(); i++) { + if (toAbsolutePathSegType(a[i]) != toAbsolutePathSegType(b[i])) + return false; + } + + return true; +} + +PassOwnPtr<PairwisePrimitiveInterpolation> PathInterpolationFunctions::mergeSingleConversions(const InterpolationType& type, InterpolationValue& startValue, InterpolationValue& endValue) +{ + const Vector<SVGPathSegType>& startTypes = toSVGPathNonInterpolableValue(startValue.nonInterpolableValue())->pathSegTypes(); + const Vector<SVGPathSegType>& endTypes = toSVGPathNonInterpolableValue(endValue.nonInterpolableValue())->pathSegTypes(); + if (!pathSegTypesMatch(startTypes, endTypes)) + return nullptr; + + return PairwisePrimitiveInterpolation::create(type, + startValue.mutableComponent().interpolableValue.release(), + endValue.mutableComponent().interpolableValue.release(), + const_cast<NonInterpolableValue*>(endValue.nonInterpolableValue())); // Take ref. +} + +void PathInterpolationFunctions::composite(UnderlyingValue& underlyingValue, double underlyingFraction, const InterpolationValue& value) +{ + const InterpolableList& list = toInterpolableList(value.interpolableValue()); + double neutralComponent = toInterpolableNumber(list.get(PathNeutralIndex))->value(); + + if (neutralComponent == 0) { + underlyingValue.set(&value); + return; + } + + ASSERT(pathSegTypesMatch( + toSVGPathNonInterpolableValue(underlyingValue->nonInterpolableValue())->pathSegTypes(), + toSVGPathNonInterpolableValue(value.nonInterpolableValue())->pathSegTypes())); + underlyingValue.mutableComponent().interpolableValue->scaleAndAdd(neutralComponent, value.interpolableValue()); + underlyingValue.mutableComponent().nonInterpolableValue = const_cast<NonInterpolableValue*>(value.nonInterpolableValue()); // Take ref. +} + +PassRefPtr<SVGPathByteStream> PathInterpolationFunctions::appliedValue(const InterpolableValue& interpolableValue, const NonInterpolableValue* nonInterpolableValue) +{ + RefPtr<SVGPathByteStream> pathByteStream = SVGPathByteStream::create(); + InterpolatedSVGPathSource source( + toInterpolableList(*toInterpolableList(interpolableValue).get(PathArgsIndex)), + toSVGPathNonInterpolableValue(nonInterpolableValue)->pathSegTypes()); + SVGPathByteStreamBuilder builder(*pathByteStream); + SVGPathParser(&source, &builder).parsePathDataFromSource(UnalteredParsing, false); + return pathByteStream.release(); +} + +} // namespace blink diff --git a/third_party/WebKit/Source/core/animation/PathInterpolationFunctions.h b/third_party/WebKit/Source/core/animation/PathInterpolationFunctions.h new file mode 100644 index 0000000..ef28b56 --- /dev/null +++ b/third_party/WebKit/Source/core/animation/PathInterpolationFunctions.h @@ -0,0 +1,28 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PathInterpolationFunctions_h +#define PathInterpolationFunctions_h + +#include "core/animation/InterpolationType.h" +#include "core/svg/SVGPathByteStream.h" + +namespace blink { + +class PathInterpolationFunctions { +public: + static PassRefPtr<SVGPathByteStream> appliedValue(const InterpolableValue&, const NonInterpolableValue*); + + static void composite(UnderlyingValue&, double underlyingFraction, const InterpolationValue&); + + static PassOwnPtr<InterpolationValue> convertValue(const InterpolationType&, const SVGPathByteStream&); + + static PassOwnPtr<InterpolationValue> maybeConvertNeutral(const InterpolationType&, const UnderlyingValue&, InterpolationType::ConversionCheckers&); + + static PassOwnPtr<PairwisePrimitiveInterpolation> mergeSingleConversions(const InterpolationType&, InterpolationValue& startValue, InterpolationValue& endValue); +}; + +} // namespace blink + +#endif // PathInterpolationFunctions_h diff --git a/third_party/WebKit/Source/core/animation/SVGPathInterpolationType.cpp b/third_party/WebKit/Source/core/animation/SVGPathInterpolationType.cpp index 9525f66..d1afb30 100644 --- a/third_party/WebKit/Source/core/animation/SVGPathInterpolationType.cpp +++ b/third_party/WebKit/Source/core/animation/SVGPathInterpolationType.cpp @@ -4,166 +4,38 @@ #include "core/animation/SVGPathInterpolationType.h" -#include "core/animation/InterpolatedSVGPathSource.h" -#include "core/animation/InterpolationEnvironment.h" -#include "core/animation/SVGPathSegInterpolationFunctions.h" +#include "core/animation/PathInterpolationFunctions.h" + #include "core/svg/SVGPath.h" -#include "core/svg/SVGPathByteStreamBuilder.h" -#include "core/svg/SVGPathByteStreamSource.h" -#include "core/svg/SVGPathParser.h" namespace blink { -class SVGPathNonInterpolableValue : public NonInterpolableValue { -public: - virtual ~SVGPathNonInterpolableValue() {} - - static PassRefPtr<SVGPathNonInterpolableValue> create(Vector<SVGPathSegType>& pathSegTypes) - { - return adoptRef(new SVGPathNonInterpolableValue(pathSegTypes)); - } - - const Vector<SVGPathSegType>& pathSegTypes() const { return m_pathSegTypes; } - - DECLARE_NON_INTERPOLABLE_VALUE_TYPE(); - -private: - SVGPathNonInterpolableValue(Vector<SVGPathSegType>& pathSegTypes) - { - m_pathSegTypes.swap(pathSegTypes); - } - - Vector<SVGPathSegType> m_pathSegTypes; -}; - -DEFINE_NON_INTERPOLABLE_VALUE_TYPE(SVGPathNonInterpolableValue); -DEFINE_NON_INTERPOLABLE_VALUE_TYPE_CASTS(SVGPathNonInterpolableValue); - -enum PathComponentIndex { - PathArgsIndex, - PathNeutralIndex, - PathComponentIndexCount, -}; - PassOwnPtr<InterpolationValue> SVGPathInterpolationType::maybeConvertSVGValue(const SVGPropertyBase& svgValue) const { if (svgValue.type() != AnimatedPath) return nullptr; - SVGPathByteStreamSource pathSource(toSVGPath(svgValue).byteStream()); - size_t length = 0; - PathCoordinates currentCoordinates; - Vector<OwnPtr<InterpolableValue>> interpolablePathSegs; - Vector<SVGPathSegType> pathSegTypes; - - while (pathSource.hasMoreData()) { - const PathSegmentData segment = pathSource.parseSegment(); - interpolablePathSegs.append(SVGPathSegInterpolationFunctions::consumePathSeg(segment, currentCoordinates)); - pathSegTypes.append(segment.command); - length++; - } - - OwnPtr<InterpolableList> pathArgs = InterpolableList::create(length); - for (size_t i = 0; i < interpolablePathSegs.size(); i++) - pathArgs->set(i, interpolablePathSegs[i].release()); - - OwnPtr<InterpolableList> result = InterpolableList::create(PathComponentIndexCount); - result->set(PathArgsIndex, pathArgs.release()); - result->set(PathNeutralIndex, InterpolableNumber::create(0)); - - return InterpolationValue::create(*this, result.release(), SVGPathNonInterpolableValue::create(pathSegTypes)); + return PathInterpolationFunctions::convertValue(*this, toSVGPath(svgValue).byteStream()); } -class UnderlyingPathSegTypesChecker : public InterpolationType::ConversionChecker { -public: - ~UnderlyingPathSegTypesChecker() final {} - - static PassOwnPtr<UnderlyingPathSegTypesChecker> create(const InterpolationType& type, const UnderlyingValue& underlyingValue) - { - return adoptPtr(new UnderlyingPathSegTypesChecker(type, getPathSegTypes(underlyingValue))); - } - -private: - UnderlyingPathSegTypesChecker(const InterpolationType& type, const Vector<SVGPathSegType>& pathSegTypes) - : ConversionChecker(type) - , m_pathSegTypes(pathSegTypes) - { } - - static const Vector<SVGPathSegType>& getPathSegTypes(const UnderlyingValue& underlyingValue) - { - return toSVGPathNonInterpolableValue(underlyingValue->nonInterpolableValue())->pathSegTypes(); - } - - bool isValid(const InterpolationEnvironment&, const UnderlyingValue& underlyingValue) const final - { - return m_pathSegTypes == getPathSegTypes(underlyingValue); - } - - Vector<SVGPathSegType> m_pathSegTypes; -}; - PassOwnPtr<InterpolationValue> SVGPathInterpolationType::maybeConvertNeutral(const UnderlyingValue& underlyingValue, ConversionCheckers& conversionCheckers) const { - conversionCheckers.append(UnderlyingPathSegTypesChecker::create(*this, underlyingValue)); - OwnPtr<InterpolableList> result = InterpolableList::create(PathComponentIndexCount); - result->set(PathArgsIndex, toInterpolableList(underlyingValue->interpolableValue()).get(PathArgsIndex)->cloneAndZero()); - result->set(PathNeutralIndex, InterpolableNumber::create(1)); - return InterpolationValue::create(*this, result.release(), - const_cast<NonInterpolableValue*>(underlyingValue->nonInterpolableValue())); // Take ref. -} - -static bool pathSegTypesMatch(const Vector<SVGPathSegType>& a, const Vector<SVGPathSegType>& b) -{ - if (a.size() != b.size()) - return false; - - for (size_t i = 0; i < a.size(); i++) { - if (toAbsolutePathSegType(a[i]) != toAbsolutePathSegType(b[i])) - return false; - } - - return true; + return PathInterpolationFunctions::maybeConvertNeutral(*this, underlyingValue, conversionCheckers); } PassOwnPtr<PairwisePrimitiveInterpolation> SVGPathInterpolationType::mergeSingleConversions(InterpolationValue& startValue, InterpolationValue& endValue) const { - const Vector<SVGPathSegType>& startTypes = toSVGPathNonInterpolableValue(startValue.nonInterpolableValue())->pathSegTypes(); - const Vector<SVGPathSegType>& endTypes = toSVGPathNonInterpolableValue(endValue.nonInterpolableValue())->pathSegTypes(); - if (!pathSegTypesMatch(startTypes, endTypes)) - return nullptr; - - return PairwisePrimitiveInterpolation::create(*this, - startValue.mutableComponent().interpolableValue.release(), - endValue.mutableComponent().interpolableValue.release(), - const_cast<NonInterpolableValue*>(endValue.nonInterpolableValue())); // Take ref. + return PathInterpolationFunctions::mergeSingleConversions(*this, startValue, endValue); } void SVGPathInterpolationType::composite(UnderlyingValue& underlyingValue, double underlyingFraction, const InterpolationValue& value) const { - const InterpolableList& list = toInterpolableList(value.interpolableValue()); - double neutralComponent = toInterpolableNumber(list.get(PathNeutralIndex))->value(); - - if (neutralComponent == 0) { - underlyingValue.set(&value); - return; - } - - ASSERT(pathSegTypesMatch( - toSVGPathNonInterpolableValue(underlyingValue->nonInterpolableValue())->pathSegTypes(), - toSVGPathNonInterpolableValue(value.nonInterpolableValue())->pathSegTypes())); - underlyingValue.mutableComponent().interpolableValue->scaleAndAdd(neutralComponent, value.interpolableValue()); - underlyingValue.mutableComponent().nonInterpolableValue = const_cast<NonInterpolableValue*>(value.nonInterpolableValue()); // Take ref. + PathInterpolationFunctions::composite(underlyingValue, underlyingFraction, value); } PassRefPtrWillBeRawPtr<SVGPropertyBase> SVGPathInterpolationType::appliedSVGValue(const InterpolableValue& interpolableValue, const NonInterpolableValue* nonInterpolableValue) const { - RefPtr<SVGPathByteStream> pathByteStream = SVGPathByteStream::create(); - InterpolatedSVGPathSource source( - toInterpolableList(*toInterpolableList(interpolableValue).get(PathArgsIndex)), - toSVGPathNonInterpolableValue(nonInterpolableValue)->pathSegTypes()); - SVGPathByteStreamBuilder builder(*pathByteStream); - SVGPathParser(&source, &builder).parsePathDataFromSource(UnalteredParsing, false); - return SVGPath::create(CSSPathValue::create(pathByteStream.release())); + return SVGPath::create(CSSPathValue::create(PathInterpolationFunctions::appliedValue(interpolableValue, nonInterpolableValue))); } } // namespace blink diff --git a/third_party/WebKit/Source/core/animation/StringKeyframe.cpp b/third_party/WebKit/Source/core/animation/StringKeyframe.cpp index 6d77cde..990b7f6 100644 --- a/third_party/WebKit/Source/core/animation/StringKeyframe.cpp +++ b/third_party/WebKit/Source/core/animation/StringKeyframe.cpp @@ -14,6 +14,7 @@ #include "core/animation/CSSLengthListInterpolationType.h" #include "core/animation/CSSNumberInterpolationType.h" #include "core/animation/CSSPaintInterpolationType.h" +#include "core/animation/CSSPathInterpolationType.h" #include "core/animation/CSSShadowListInterpolationType.h" #include "core/animation/CSSValueInterpolationType.h" #include "core/animation/CSSVisibilityInterpolationType.h" @@ -261,6 +262,9 @@ const InterpolationTypes* applicableTypesForProperty(PropertyHandle property) case CSSPropertyStroke: applicableTypes->append(adoptPtr(new CSSPaintInterpolationType(cssProperty))); break; + case CSSPropertyD: + applicableTypes->append(adoptPtr(new CSSPathInterpolationType(cssProperty))); + break; case CSSPropertyBoxShadow: case CSSPropertyTextShadow: applicableTypes->append(adoptPtr(new CSSShadowListInterpolationType(cssProperty))); diff --git a/third_party/WebKit/Source/core/core.gypi b/third_party/WebKit/Source/core/core.gypi index 56599d3..837757e 100644 --- a/third_party/WebKit/Source/core/core.gypi +++ b/third_party/WebKit/Source/core/core.gypi @@ -858,6 +858,8 @@ 'animation/CSSNumberInterpolationType.h', 'animation/CSSPaintInterpolationType.cpp', 'animation/CSSPaintInterpolationType.h', + 'animation/CSSPathInterpolationType.cpp', + 'animation/CSSPathInterpolationType.h', 'animation/CSSShadowListInterpolationType.cpp', 'animation/CSSShadowListInterpolationType.h', 'animation/CSSValueInterpolationType.cpp', @@ -925,6 +927,8 @@ 'animation/NumberSVGInterpolation.h', 'animation/PaintPropertyFunctions.cpp', 'animation/PaintPropertyFunctions.h', + 'animation/PathInterpolationFunctions.cpp', + 'animation/PathInterpolationFunctions.h', 'animation/PrimitiveInterpolation.h', 'animation/PropertyHandle.cpp', 'animation/PropertyHandle.h', |