Support reverse and alternate-reverse in CA animations
authordino@apple.com <dino@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 28 Apr 2012 04:59:53 +0000 (04:59 +0000)
committerdino@apple.com <dino@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 28 Apr 2012 04:59:53 +0000 (04:59 +0000)
commit1dc50658edc975bd899d9e225619e073b092639e
tree3e5963d1316285a9bc4435b8604d97c73a35405a
parent207286ef1192d77c16acfb8c72b0b341bb9f4440
Support reverse and alternate-reverse in CA animations
https://bugs.webkit.org/show_bug.cgi?id=78041

Reviewed by Beth Dakin.

Source/WebCore:

CoreAnimation does not natively support reverse and alternate-reverse
animation directions so we need to flip the animation values (keyframe
keys and timing functions) that we send to GraphicsLayerCA. Unfortunately
this code adds a lot of conditionals because it isn't as simple as
reversing the order of keys. You also now have a different alignment of
timing functions to the reversed list.

New tests to cover the two new directions, making sure the timing
functions are correctly inverted, and exercising fill modes.

Tests: animations/animation-direction-reverse-fill-mode-hardware.html
       animations/animation-direction-reverse-fill-mode.html
       animations/animation-direction-reverse-hardware-opacity.html
       animations/animation-direction-reverse-hardware.html
       animations/animation-direction-reverse-non-hardware.html
       animations/animation-direction-reverse-timing-functions-hardware.html
       animations/animation-direction-reverse-timing-functions.html

* platform/graphics/ca/GraphicsLayerCA.cpp:
  Handle the previously unsupported animation directions, reversing
  the list of values and keytimes that would be used to create
  the CA Animation.
(WebCore::GraphicsLayerCA::addAnimation):
  Do not create an animation if on Windows and using a reverse
  direction.
(WebCore::GraphicsLayerCA::createFilterAnimationsFromKeyframes):
(WebCore::GraphicsLayerCA::setupAnimation):
(WebCore::GraphicsLayerCA::setAnimationEndpoints):
(WebCore::GraphicsLayerCA::setAnimationKeyframes):
(WebCore::GraphicsLayerCA::setTransformAnimationEndpoints):
(WebCore::GraphicsLayerCA::setTransformAnimationKeyframes):
(WebCore::GraphicsLayerCA::setFilterAnimationEndpoints):
(WebCore::GraphicsLayerCA::setFilterAnimationKeyframes):
* platform/graphics/ca/PlatformCAAnimation.h:
(PlatformCAAnimation): Pass through a flag that tells the CA Animation
that it should invert the timing functions.
* platform/graphics/ca/mac/PlatformCAAnimationMac.mm:
(toCAMediaTimingFunction): Add a parameter that will invert the timing
function coefficients if necessary.
(PlatformCAAnimation::setTimingFunction):
(PlatformCAAnimation::setTimingFunctions):
* platform/graphics/ca/win/PlatformCAAnimationWin.cpp:
(toCACFTimingFunction):
  New unused parameter.

LayoutTests:

Tests support for reverse and alternate-reverse animations on
CoreAnimation objects, as well as filling out some of the software
animator tests. There are three variables to exercise: reverse vs
forward direction animations, whether reversed timing functions are
inverted correctly, and that fill mode respects the direction of
animation.

Refactored the animation test helper class so we could reuse
property parsing and evaluation.

* animations/animation-direction-reverse-fill-mode-expected.txt: Added.
* animations/animation-direction-reverse-fill-mode-hardware-expected.txt: Added.
* animations/animation-direction-reverse-fill-mode-hardware.html: Added.
* animations/animation-direction-reverse-fill-mode.html: Added.
* animations/animation-direction-reverse-hardware-expected.txt: Added.
* animations/animation-direction-reverse-hardware-opacity-expected.txt: Added.
* animations/animation-direction-reverse-hardware-opacity.html: Added.
* animations/animation-direction-reverse-hardware.html: Added.
* animations/animation-direction-reverse-non-hardware-expected.txt: Added.
* animations/animation-direction-reverse-non-hardware.html: Added.
* animations/animation-direction-reverse-timing-functions-expected.txt: Added.
* animations/animation-direction-reverse-timing-functions-hardware-expected.txt: Added.
* animations/animation-direction-reverse-timing-functions-hardware.html: Added.
* animations/animation-direction-reverse-timing-functions.html: Added.
* animations/resources/animation-test-helpers.js:
(checkExpectedValue):
(getPropertyValue):
(comparePropertyValue):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@115540 268f45cc-cd09-0410-ab3c-d52691b4dbfc
22 files changed:
LayoutTests/ChangeLog
LayoutTests/animations/animation-direction-reverse-fill-mode-expected.txt [new file with mode: 0644]
LayoutTests/animations/animation-direction-reverse-fill-mode-hardware-expected.txt [new file with mode: 0644]
LayoutTests/animations/animation-direction-reverse-fill-mode-hardware.html [new file with mode: 0644]
LayoutTests/animations/animation-direction-reverse-fill-mode.html [new file with mode: 0644]
LayoutTests/animations/animation-direction-reverse-hardware-expected.txt [new file with mode: 0644]
LayoutTests/animations/animation-direction-reverse-hardware-opacity-expected.txt [new file with mode: 0644]
LayoutTests/animations/animation-direction-reverse-hardware-opacity.html [new file with mode: 0644]
LayoutTests/animations/animation-direction-reverse-hardware.html [new file with mode: 0644]
LayoutTests/animations/animation-direction-reverse-non-hardware-expected.txt [new file with mode: 0644]
LayoutTests/animations/animation-direction-reverse-non-hardware.html [new file with mode: 0644]
LayoutTests/animations/animation-direction-reverse-timing-functions-expected.txt [new file with mode: 0644]
LayoutTests/animations/animation-direction-reverse-timing-functions-hardware-expected.txt [new file with mode: 0644]
LayoutTests/animations/animation-direction-reverse-timing-functions-hardware.html [new file with mode: 0644]
LayoutTests/animations/animation-direction-reverse-timing-functions.html [new file with mode: 0644]
LayoutTests/animations/resources/animation-test-helpers.js
Source/WebCore/ChangeLog
Source/WebCore/platform/animation/Animation.h
Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp
Source/WebCore/platform/graphics/ca/PlatformCAAnimation.h
Source/WebCore/platform/graphics/ca/mac/PlatformCAAnimationMac.mm
Source/WebCore/platform/graphics/ca/win/PlatformCAAnimationWin.cpp