• dino@apple.com's avatar
    Support reverse and alternate-reverse in CA animations · 1dc50658
    dino@apple.com authored
    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
    1dc50658
animation-direction-reverse-hardware-opacity.html 2.84 KB