1f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch/*
2f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
3f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *
4f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * Redistribution and use in source and binary forms, with or without
5f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * modification, are permitted provided that the following conditions
6f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * are met:
7f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * 1. Redistributions of source code must retain the above copyright
8f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *    notice, this list of conditions and the following disclaimer.
9f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright
10f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *    notice, this list of conditions and the following disclaimer in the
11f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *    documentation and/or other materials provided with the distribution.
12f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *
13f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch */
25f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
26f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "config.h"
27f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
28f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if USE(ACCELERATED_COMPOSITING)
29f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
30f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#import "PlatformCAAnimation.h"
31f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
32f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#import "FloatConversion.h"
33f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#import "PlatformString.h"
34f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#import "TimingFunction.h"
35f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#import <QuartzCore/QuartzCore.h>
36f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#import <wtf/UnusedParam.h>
37f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
38f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#define HAVE_MODERN_QUARTZCORE (!defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD))
39f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
40f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochusing namespace WebCore;
41f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
42f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch// This value must be the same as in PlatformCALayerMac.mm
43f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic NSString * const WKNonZeroBeginTimeFlag = @"WKPlatformCAAnimationNonZeroBeginTimeFlag";
44f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
45f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic bool hasNonZeroBeginTimeFlag(const PlatformCAAnimation* animation)
46f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
47f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [[animation->platformAnimation() valueForKey:WKNonZeroBeginTimeFlag] boolValue];
48f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
49f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
50f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic void setNonZeroBeginTimeFlag(PlatformCAAnimation* animation, bool value)
51f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
52f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [animation->platformAnimation() setValue:[NSNumber numberWithBool:value] forKey:WKNonZeroBeginTimeFlag];
53f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
54f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
55f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic NSString* toCAFillModeType(PlatformCAAnimation::FillModeType type)
56f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
57f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    switch (type) {
58f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::NoFillMode:
59f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::Forwards: return kCAFillModeForwards;
60f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::Backwards: return kCAFillModeBackwards;
61f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::Both: return kCAFillModeBoth;
62f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
63f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return @"";
64f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
65f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
66f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic PlatformCAAnimation::FillModeType fromCAFillModeType(NSString* string)
67f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
68f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([string isEqualToString:kCAFillModeBackwards])
69f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return PlatformCAAnimation::Backwards;
70f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
71f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([string isEqualToString:kCAFillModeBoth])
72f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return PlatformCAAnimation::Both;
73f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
74f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return PlatformCAAnimation::Forwards;
75f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
76f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
77f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if HAVE_MODERN_QUARTZCORE
78f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic NSString* toCAValueFunctionType(PlatformCAAnimation::ValueFunctionType type)
79f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
80f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    switch (type) {
81f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::NoValueFunction: return @"";
82f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::RotateX: return kCAValueFunctionRotateX;
83f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::RotateY: return kCAValueFunctionRotateY;
84f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::RotateZ: return kCAValueFunctionRotateZ;
85f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::ScaleX: return kCAValueFunctionScaleX;
86f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::ScaleY: return kCAValueFunctionScaleY;
87f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::ScaleZ: return kCAValueFunctionScaleZ;
88f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::Scale: return kCAValueFunctionScale;
89f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::TranslateX: return kCAValueFunctionTranslateX;
90f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::TranslateY: return kCAValueFunctionTranslateY;
91f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::TranslateZ: return kCAValueFunctionTranslateZ;
92f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    case PlatformCAAnimation::Translate: return kCAValueFunctionTranslate;
93f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
94f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return @"";
95f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
96f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
97f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic PlatformCAAnimation::ValueFunctionType fromCAValueFunctionType(NSString* string)
98f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
99f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([string isEqualToString:kCAValueFunctionRotateX])
100f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return PlatformCAAnimation::RotateX;
101f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
102f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([string isEqualToString:kCAValueFunctionRotateY])
103f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return PlatformCAAnimation::RotateY;
104f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
105f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([string isEqualToString:kCAValueFunctionRotateZ])
106f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return PlatformCAAnimation::RotateZ;
107f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
108f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([string isEqualToString:kCAValueFunctionScaleX])
109f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return PlatformCAAnimation::ScaleX;
110f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
111f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([string isEqualToString:kCAValueFunctionScaleY])
112f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return PlatformCAAnimation::ScaleY;
113f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
114f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([string isEqualToString:kCAValueFunctionScaleZ])
115f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return PlatformCAAnimation::ScaleZ;
116f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
117f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([string isEqualToString:kCAValueFunctionScale])
118f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return PlatformCAAnimation::Scale;
119f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
120f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([string isEqualToString:kCAValueFunctionTranslateX])
121f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return PlatformCAAnimation::TranslateX;
122f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
123f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([string isEqualToString:kCAValueFunctionTranslateY])
124f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return PlatformCAAnimation::TranslateY;
125f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
126f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([string isEqualToString:kCAValueFunctionTranslateZ])
127f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return PlatformCAAnimation::TranslateZ;
128f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
129f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([string isEqualToString:kCAValueFunctionTranslate])
130f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return PlatformCAAnimation::Translate;
131f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
132f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return PlatformCAAnimation::NoValueFunction;
133f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
134f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
135f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
136f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic CAMediaTimingFunction* toCAMediaTimingFunction(const TimingFunction* timingFunction)
137f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
13881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(timingFunction);
139f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (timingFunction->isCubicBezierTimingFunction()) {
140f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        const CubicBezierTimingFunction* ctf = static_cast<const CubicBezierTimingFunction*>(timingFunction);
141f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return [CAMediaTimingFunction functionWithControlPoints:static_cast<float>(ctf->x1()) :static_cast<float>(ctf->y1())
142f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                                                               :static_cast<float>(ctf->x2()) :static_cast<float>(ctf->y2())];
143f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
144f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
145f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
146f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
147f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
148f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPassRefPtr<PlatformCAAnimation> PlatformCAAnimation::create(AnimationType type, const String& keyPath)
149f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
150f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return adoptRef(new PlatformCAAnimation(type, keyPath));
151f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
152f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
153f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPassRefPtr<PlatformCAAnimation> PlatformCAAnimation::create(PlatformAnimationRef animation)
154f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
155f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return adoptRef(new PlatformCAAnimation(animation));
156f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
157f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
158f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPlatformCAAnimation::PlatformCAAnimation(AnimationType type, const String& keyPath)
159f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    : m_type(type)
160f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
161f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (type == Basic)
162f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_animation.adoptNS([[CABasicAnimation animationWithKeyPath:keyPath] retain]);
163f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    else
164f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_animation.adoptNS([[CAKeyframeAnimation animationWithKeyPath:keyPath] retain]);
165f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
166f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
167f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPlatformCAAnimation::PlatformCAAnimation(PlatformAnimationRef animation)
168f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
169f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if ([static_cast<CAAnimation*>(animation) isKindOfClass:[CABasicAnimation class]])
170f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_type = Basic;
171f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    else if ([static_cast<CAAnimation*>(animation) isKindOfClass:[CAKeyframeAnimation class]])
172f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_type = Keyframe;
173f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    else {
174f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        ASSERT(0);
175f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
176f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
177f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
178f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_animation = static_cast<CAPropertyAnimation*>(animation);
179f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
180f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1812fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassRefPtr<PlatformCAAnimation> PlatformCAAnimation::copy() const
182f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RefPtr<PlatformCAAnimation> animation = create(animationType(), keyPath());
1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    animation->setBeginTime(beginTime());
1862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    animation->setDuration(duration());
1872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    animation->setSpeed(speed());
1882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    animation->setTimeOffset(timeOffset());
1892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    animation->setRepeatCount(repeatCount());
1902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    animation->setAutoreverses(autoreverses());
1912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    animation->setFillMode(fillMode());
1922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    animation->setRemovedOnCompletion(isRemovedOnCompletion());
1932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    animation->setAdditive(isAdditive());
1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    animation->copyTimingFunctionFrom(this);
1952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    animation->setValueFunction(valueFunction());
1962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    setNonZeroBeginTimeFlag(animation.get(), hasNonZeroBeginTimeFlag(this));
198f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
199f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Copy the specific Basic or Keyframe values
2002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (animationType() == Keyframe) {
2012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        animation->copyValuesFrom(this);
2022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        animation->copyKeyTimesFrom(this);
2032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        animation->copyTimingFunctionsFrom(this);
204f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    } else {
2052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        animation->copyFromValueFrom(this);
2062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        animation->copyToValueFrom(this);
207f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
2082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return animation;
210f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
211f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPlatformCAAnimation::~PlatformCAAnimation()
212f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
213f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
214f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
215f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool PlatformCAAnimation::supportsValueFunction()
216f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
217f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    static bool sHaveValueFunction = [CAPropertyAnimation instancesRespondToSelector:@selector(setValueFunction:)];
218f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return sHaveValueFunction;
219f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
220f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
221f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPlatformAnimationRef PlatformCAAnimation::platformAnimation() const
222f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
223f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return m_animation.get();
224f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
225f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
226f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochString PlatformCAAnimation::keyPath() const
227f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
228f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [m_animation.get() keyPath];
229f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
230f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
231f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochCFTimeInterval PlatformCAAnimation::beginTime() const
232f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
233f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [m_animation.get() beginTime];
234f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
235f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
236f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setBeginTime(CFTimeInterval value)
237f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
238f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [m_animation.get() setBeginTime:value];
239f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
240f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Also set a flag to tell us if we've passed in a 0 value.
241f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // The flag is needed because later beginTime will get changed
242f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // to the time at which it fired and we need to know whether
243f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // or not it was 0 to begin with.
244f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (value)
245f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        setNonZeroBeginTimeFlag(this, true);
246f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
247f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
248f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochCFTimeInterval PlatformCAAnimation::duration() const
249f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
250f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [m_animation.get() duration];
251f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
252f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
253f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setDuration(CFTimeInterval value)
254f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
255f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [m_animation.get() setDuration:value];
256f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
257f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
258f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochfloat PlatformCAAnimation::speed() const
259f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
260f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [m_animation.get() speed];
261f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
262f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
263f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setSpeed(float value)
264f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
265f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [m_animation.get() setSpeed:value];
266f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
267f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
268f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochCFTimeInterval PlatformCAAnimation::timeOffset() const
269f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
270f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [m_animation.get() timeOffset];
271f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
272f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
273f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setTimeOffset(CFTimeInterval value)
274f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
275f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [m_animation.get() setTimeOffset:value];
276f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
277f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
278f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochfloat PlatformCAAnimation::repeatCount() const
279f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
280f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [m_animation.get() repeatCount];
281f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
282f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
283f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setRepeatCount(float value)
284f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
285f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [m_animation.get() setRepeatCount:value];
286f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
287f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
288f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool PlatformCAAnimation::autoreverses() const
289f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
290f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [m_animation.get() autoreverses];
291f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
292f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
293f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setAutoreverses(bool value)
294f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
295f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [m_animation.get() setAutoreverses:value];
296f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
297f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
298f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPlatformCAAnimation::FillModeType PlatformCAAnimation::fillMode() const
299f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
300f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return fromCAFillModeType([m_animation.get() fillMode]);
301f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
302f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
303f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setFillMode(FillModeType value)
304f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
305f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [m_animation.get() setFillMode:toCAFillModeType(value)];
306f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
307f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
308f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setTimingFunction(const TimingFunction* value)
309f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
310f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [m_animation.get() setTimingFunction:toCAMediaTimingFunction(value)];
311f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
312f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
313f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::copyTimingFunctionFrom(const PlatformCAAnimation* value)
314f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
315f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [m_animation.get() setTimingFunction:[value->m_animation.get() timingFunction]];
316f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
317f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
318f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool PlatformCAAnimation::isRemovedOnCompletion() const
319f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
320f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [m_animation.get() isRemovedOnCompletion];
321f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
322f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
323f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setRemovedOnCompletion(bool value)
324f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
325f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [m_animation.get() setRemovedOnCompletion:value];
326f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
327f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
328f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool PlatformCAAnimation::isAdditive() const
329f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
330f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return [m_animation.get() isAdditive];
331f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
332f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
333f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setAdditive(bool value)
334f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
335f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [m_animation.get() setAdditive:value];
336f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
337f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
338f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPlatformCAAnimation::ValueFunctionType PlatformCAAnimation::valueFunction() const
339f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
340f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if HAVE_MODERN_QUARTZCORE
341f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    CAValueFunction* vf = [m_animation.get() valueFunction];
342f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return fromCAValueFunctionType([vf name]);
343f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#else
344f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return NoValueFunction;
345f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
346f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
347f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
348f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setValueFunction(ValueFunctionType value)
349f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
350f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if HAVE_MODERN_QUARTZCORE
351f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [m_animation.get() setValueFunction:[CAValueFunction functionWithName:toCAValueFunctionType(value)]];
352f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#else
353f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    UNUSED_PARAM(value);
354f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif
355f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
356f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
357f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setFromValue(float value)
358f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
359f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Basic)
360f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
361f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CABasicAnimation*>(m_animation.get()) setFromValue:[NSNumber numberWithDouble:value]];
362f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
363f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
364f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setFromValue(const WebCore::TransformationMatrix& value)
365f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
366f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Basic)
367f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
368f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
369f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CABasicAnimation*>(m_animation.get()) setFromValue:[NSValue valueWithCATransform3D:value]];
370f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
371f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
372f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setFromValue(const FloatPoint3D& value)
373f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
374f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Basic)
375f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
376f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
377f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSArray* array = [NSArray arrayWithObjects:
378f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.x()],
379f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.y()],
380f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.z()],
381f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        nil];
382f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CABasicAnimation*>(m_animation.get()) setFromValue:array];
383f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
384f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
385f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setFromValue(const WebCore::Color& value)
386f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
387f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Basic)
388f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
389f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
390f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSArray* array = [NSArray arrayWithObjects:
391f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.red()],
392f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.green()],
393f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.blue()],
394f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.alpha()],
395f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        nil];
396f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CABasicAnimation*>(m_animation.get()) setFromValue:array];
397f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
398f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
399f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::copyFromValueFrom(const PlatformCAAnimation* value)
400f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
401f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Basic || value->animationType() != Basic)
402f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
403f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
404f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    CABasicAnimation* otherAnimation = static_cast<CABasicAnimation*>(value->m_animation.get());
405f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CABasicAnimation*>(m_animation.get()) setFromValue:[otherAnimation fromValue]];
406f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
407f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
408f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setToValue(float value)
409f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
410f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Basic)
411f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
412f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CABasicAnimation*>(m_animation.get()) setToValue:[NSNumber numberWithDouble:value]];
413f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
414f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
415f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setToValue(const WebCore::TransformationMatrix& value)
416f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
417f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Basic)
418f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
419f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
420f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CABasicAnimation*>(m_animation.get()) setToValue:[NSValue valueWithCATransform3D:value]];
421f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
422f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
423f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setToValue(const FloatPoint3D& value)
424f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
425f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Basic)
426f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
427f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
428f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSArray* array = [NSArray arrayWithObjects:
429f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.x()],
430f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.y()],
431f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.z()],
432f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        nil];
433f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CABasicAnimation*>(m_animation.get()) setToValue:array];
434f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
435f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
436f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setToValue(const WebCore::Color& value)
437f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
438f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Basic)
439f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
440f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
441f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSArray* array = [NSArray arrayWithObjects:
442f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.red()],
443f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.green()],
444f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.blue()],
445f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value.alpha()],
446f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        nil];
447f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CABasicAnimation*>(m_animation.get()) setToValue:array];
448f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
449f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
450f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::copyToValueFrom(const PlatformCAAnimation* value)
451f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
452f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Basic || value->animationType() != Basic)
453f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
454f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
455f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    CABasicAnimation* otherAnimation = static_cast<CABasicAnimation*>(value->m_animation.get());
456f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CABasicAnimation*>(m_animation.get()) setToValue:[otherAnimation toValue]];
457f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
458f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
459f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
460f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch// Keyframe-animation properties.
461f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setValues(const Vector<float>& value)
462f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
463f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Keyframe)
464f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
465f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
466f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSMutableArray* array = [NSMutableArray array];
467f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (size_t i = 0; i < value.size(); ++i)
468f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        [array addObject:[NSNumber numberWithDouble:value[i]]];
469f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CAKeyframeAnimation*>(m_animation.get()) setValues:array];
470f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
471f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
472f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setValues(const Vector<WebCore::TransformationMatrix>& value)
473f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
474f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Keyframe)
475f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
476f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
477f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSMutableArray* array = [NSMutableArray array];
478f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
479f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (size_t i = 0; i < value.size(); ++i)
480f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        [array addObject:[NSValue valueWithCATransform3D:value[i]]];
481f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
482f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CAKeyframeAnimation*>(m_animation.get()) setValues:array];
483f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
484f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
485f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setValues(const Vector<FloatPoint3D>& value)
486f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
487f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Keyframe)
488f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
489f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
490f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSMutableArray* array = [NSMutableArray array];
491f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
492f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (size_t i = 0; i < value.size(); ++i) {
493f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        NSArray* object = [NSArray arrayWithObjects:
494f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value[i].x()],
495f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value[i].y()],
496f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value[i].z()],
497f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        nil];
498f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        [array addObject:object];
499f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
500f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CAKeyframeAnimation*>(m_animation.get()) setValues:array];
501f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
502f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
503f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setValues(const Vector<WebCore::Color>& value)
504f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
505f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Keyframe)
506f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
507f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
508f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSMutableArray* array = [NSMutableArray array];
509f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
510f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (size_t i = 0; i < value.size(); ++i) {
511f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        NSArray* object = [NSArray arrayWithObjects:
512f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value[i].red()],
513f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value[i].green()],
514f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value[i].blue()],
515f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        [NSNumber numberWithDouble:value[i].alpha()],
516f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        nil];
517f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        [array addObject:object];
518f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
519f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CAKeyframeAnimation*>(m_animation.get()) setValues:array];
520f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
521f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
522f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::copyValuesFrom(const PlatformCAAnimation* value)
523f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
524f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (animationType() != Keyframe || value->animationType() != Keyframe)
525f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return;
526f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
527f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    CAKeyframeAnimation* otherAnimation = static_cast<CAKeyframeAnimation*>(value->m_animation.get());
528f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CAKeyframeAnimation*>(m_animation.get()) setValues:[otherAnimation values]];
529f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
530f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
531f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setKeyTimes(const Vector<float>& value)
532f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
533f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSMutableArray* array = [NSMutableArray array];
534f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
535f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (size_t i = 0; i < value.size(); ++i)
536f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        [array addObject:[NSNumber numberWithFloat:value[i]]];
537f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
538f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CAKeyframeAnimation*>(m_animation.get()) setKeyTimes:array];
539f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
540f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
541f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::copyKeyTimesFrom(const PlatformCAAnimation* value)
542f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
543f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    CAKeyframeAnimation* other = static_cast<CAKeyframeAnimation*>(value->m_animation.get());
544f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CAKeyframeAnimation*>(m_animation.get()) setKeyTimes:[other keyTimes]];
545f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
546f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
547f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::setTimingFunctions(const Vector<const TimingFunction*>& value)
548f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
549f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    NSMutableArray* array = [NSMutableArray array];
550f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
551f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (size_t i = 0; i < value.size(); ++i)
552f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        [array addObject:toCAMediaTimingFunction(value[i])];
553f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
554f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CAKeyframeAnimation*>(m_animation.get()) setTimingFunctions:array];
555f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
556f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
557f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid PlatformCAAnimation::copyTimingFunctionsFrom(const PlatformCAAnimation* value)
558f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
559f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    CAKeyframeAnimation* other = static_cast<CAKeyframeAnimation*>(value->m_animation.get());
560f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    [static_cast<CAKeyframeAnimation*>(m_animation.get()) setTimingFunctions:[other timingFunctions]];
561f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
562f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
563f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif // USE(ACCELERATED_COMPOSITING)
564