2
* Copyright (C) 2010 Apple Inc. All rights reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
7
* 1. Redistributions of source code must retain the above copyright
8
* notice, this list of conditions and the following disclaimer.
9
* 2. Redistributions in binary form must reproduce the above copyright
10
* notice, this list of conditions and the following disclaimer in the
11
* documentation and/or other materials provided with the distribution.
13
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
#if USE(ACCELERATED_COMPOSITING)
30
#import "PlatformCAAnimation.h"
32
#import "FloatConversion.h"
33
#import "LengthFunctions.h"
34
#import "TimingFunction.h"
35
#import <QuartzCore/QuartzCore.h>
36
#import <wtf/UnusedParam.h>
37
#import <wtf/text/WTFString.h>
39
using namespace WebCore;
41
// This value must be the same as in PlatformCALayerMac.mm
42
static NSString * const WKNonZeroBeginTimeFlag = @"WKPlatformCAAnimationNonZeroBeginTimeFlag";
44
static bool hasNonZeroBeginTimeFlag(const PlatformCAAnimation* animation)
46
return [[animation->platformAnimation() valueForKey:WKNonZeroBeginTimeFlag] boolValue];
49
static void setNonZeroBeginTimeFlag(PlatformCAAnimation* animation, bool value)
51
[animation->platformAnimation() setValue:[NSNumber numberWithBool:value] forKey:WKNonZeroBeginTimeFlag];
54
static NSString* toCAFillModeType(PlatformCAAnimation::FillModeType type)
57
case PlatformCAAnimation::NoFillMode:
58
case PlatformCAAnimation::Forwards: return kCAFillModeForwards;
59
case PlatformCAAnimation::Backwards: return kCAFillModeBackwards;
60
case PlatformCAAnimation::Both: return kCAFillModeBoth;
65
static PlatformCAAnimation::FillModeType fromCAFillModeType(NSString* string)
67
if ([string isEqualToString:kCAFillModeBackwards])
68
return PlatformCAAnimation::Backwards;
70
if ([string isEqualToString:kCAFillModeBoth])
71
return PlatformCAAnimation::Both;
73
return PlatformCAAnimation::Forwards;
76
static NSString* toCAValueFunctionType(PlatformCAAnimation::ValueFunctionType type)
79
case PlatformCAAnimation::NoValueFunction: return @"";
80
case PlatformCAAnimation::RotateX: return kCAValueFunctionRotateX;
81
case PlatformCAAnimation::RotateY: return kCAValueFunctionRotateY;
82
case PlatformCAAnimation::RotateZ: return kCAValueFunctionRotateZ;
83
case PlatformCAAnimation::ScaleX: return kCAValueFunctionScaleX;
84
case PlatformCAAnimation::ScaleY: return kCAValueFunctionScaleY;
85
case PlatformCAAnimation::ScaleZ: return kCAValueFunctionScaleZ;
86
case PlatformCAAnimation::Scale: return kCAValueFunctionScale;
87
case PlatformCAAnimation::TranslateX: return kCAValueFunctionTranslateX;
88
case PlatformCAAnimation::TranslateY: return kCAValueFunctionTranslateY;
89
case PlatformCAAnimation::TranslateZ: return kCAValueFunctionTranslateZ;
90
case PlatformCAAnimation::Translate: return kCAValueFunctionTranslate;
95
static PlatformCAAnimation::ValueFunctionType fromCAValueFunctionType(NSString* string)
97
if ([string isEqualToString:kCAValueFunctionRotateX])
98
return PlatformCAAnimation::RotateX;
100
if ([string isEqualToString:kCAValueFunctionRotateY])
101
return PlatformCAAnimation::RotateY;
103
if ([string isEqualToString:kCAValueFunctionRotateZ])
104
return PlatformCAAnimation::RotateZ;
106
if ([string isEqualToString:kCAValueFunctionScaleX])
107
return PlatformCAAnimation::ScaleX;
109
if ([string isEqualToString:kCAValueFunctionScaleY])
110
return PlatformCAAnimation::ScaleY;
112
if ([string isEqualToString:kCAValueFunctionScaleZ])
113
return PlatformCAAnimation::ScaleZ;
115
if ([string isEqualToString:kCAValueFunctionScale])
116
return PlatformCAAnimation::Scale;
118
if ([string isEqualToString:kCAValueFunctionTranslateX])
119
return PlatformCAAnimation::TranslateX;
121
if ([string isEqualToString:kCAValueFunctionTranslateY])
122
return PlatformCAAnimation::TranslateY;
124
if ([string isEqualToString:kCAValueFunctionTranslateZ])
125
return PlatformCAAnimation::TranslateZ;
127
if ([string isEqualToString:kCAValueFunctionTranslate])
128
return PlatformCAAnimation::Translate;
130
return PlatformCAAnimation::NoValueFunction;
133
static CAMediaTimingFunction* toCAMediaTimingFunction(const TimingFunction* timingFunction, bool reverse)
135
ASSERT(timingFunction);
136
if (timingFunction->isCubicBezierTimingFunction()) {
137
const CubicBezierTimingFunction* ctf = static_cast<const CubicBezierTimingFunction*>(timingFunction);
138
float x1 = static_cast<float>(ctf->x1());
139
float y1 = static_cast<float>(ctf->y1());
140
float x2 = static_cast<float>(ctf->x2());
141
float y2 = static_cast<float>(ctf->y2());
142
return [CAMediaTimingFunction functionWithControlPoints:(reverse ? 1 - x2 : x1)
143
:(reverse ? 1 - y2 : y1)
144
:(reverse ? 1 - x1 : x2)
145
:(reverse ? 1 - y1 : y2)];
148
return [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
151
PassRefPtr<PlatformCAAnimation> PlatformCAAnimation::create(AnimationType type, const String& keyPath)
153
return adoptRef(new PlatformCAAnimation(type, keyPath));
156
PassRefPtr<PlatformCAAnimation> PlatformCAAnimation::create(PlatformAnimationRef animation)
158
return adoptRef(new PlatformCAAnimation(animation));
161
PlatformCAAnimation::PlatformCAAnimation(AnimationType type, const String& keyPath)
165
m_animation.adoptNS([[CABasicAnimation animationWithKeyPath:keyPath] retain]);
167
m_animation.adoptNS([[CAKeyframeAnimation animationWithKeyPath:keyPath] retain]);
170
PlatformCAAnimation::PlatformCAAnimation(PlatformAnimationRef animation)
172
if ([static_cast<CAAnimation*>(animation) isKindOfClass:[CABasicAnimation class]])
174
else if ([static_cast<CAAnimation*>(animation) isKindOfClass:[CAKeyframeAnimation class]])
181
m_animation = static_cast<CAPropertyAnimation*>(animation);
184
PassRefPtr<PlatformCAAnimation> PlatformCAAnimation::copy() const
186
RefPtr<PlatformCAAnimation> animation = create(animationType(), keyPath());
188
animation->setBeginTime(beginTime());
189
animation->setDuration(duration());
190
animation->setSpeed(speed());
191
animation->setTimeOffset(timeOffset());
192
animation->setRepeatCount(repeatCount());
193
animation->setAutoreverses(autoreverses());
194
animation->setFillMode(fillMode());
195
animation->setRemovedOnCompletion(isRemovedOnCompletion());
196
animation->setAdditive(isAdditive());
197
animation->copyTimingFunctionFrom(this);
198
animation->setValueFunction(valueFunction());
200
setNonZeroBeginTimeFlag(animation.get(), hasNonZeroBeginTimeFlag(this));
202
// Copy the specific Basic or Keyframe values
203
if (animationType() == Keyframe) {
204
animation->copyValuesFrom(this);
205
animation->copyKeyTimesFrom(this);
206
animation->copyTimingFunctionsFrom(this);
208
animation->copyFromValueFrom(this);
209
animation->copyToValueFrom(this);
214
PlatformCAAnimation::~PlatformCAAnimation()
218
bool PlatformCAAnimation::supportsValueFunction()
220
static bool sHaveValueFunction = [CAPropertyAnimation instancesRespondToSelector:@selector(setValueFunction:)];
221
return sHaveValueFunction;
224
PlatformAnimationRef PlatformCAAnimation::platformAnimation() const
226
return m_animation.get();
229
String PlatformCAAnimation::keyPath() const
231
return [m_animation.get() keyPath];
234
CFTimeInterval PlatformCAAnimation::beginTime() const
236
return [m_animation.get() beginTime];
239
void PlatformCAAnimation::setBeginTime(CFTimeInterval value)
241
[m_animation.get() setBeginTime:value];
243
// Also set a flag to tell us if we've passed in a 0 value.
244
// The flag is needed because later beginTime will get changed
245
// to the time at which it fired and we need to know whether
246
// or not it was 0 to begin with.
248
setNonZeroBeginTimeFlag(this, true);
251
CFTimeInterval PlatformCAAnimation::duration() const
253
return [m_animation.get() duration];
256
void PlatformCAAnimation::setDuration(CFTimeInterval value)
258
[m_animation.get() setDuration:value];
261
float PlatformCAAnimation::speed() const
263
return [m_animation.get() speed];
266
void PlatformCAAnimation::setSpeed(float value)
268
[m_animation.get() setSpeed:value];
271
CFTimeInterval PlatformCAAnimation::timeOffset() const
273
return [m_animation.get() timeOffset];
276
void PlatformCAAnimation::setTimeOffset(CFTimeInterval value)
278
[m_animation.get() setTimeOffset:value];
281
float PlatformCAAnimation::repeatCount() const
283
return [m_animation.get() repeatCount];
286
void PlatformCAAnimation::setRepeatCount(float value)
288
[m_animation.get() setRepeatCount:value];
291
bool PlatformCAAnimation::autoreverses() const
293
return [m_animation.get() autoreverses];
296
void PlatformCAAnimation::setAutoreverses(bool value)
298
[m_animation.get() setAutoreverses:value];
301
PlatformCAAnimation::FillModeType PlatformCAAnimation::fillMode() const
303
return fromCAFillModeType([m_animation.get() fillMode]);
306
void PlatformCAAnimation::setFillMode(FillModeType value)
308
[m_animation.get() setFillMode:toCAFillModeType(value)];
311
void PlatformCAAnimation::setTimingFunction(const TimingFunction* value, bool reverse)
313
[m_animation.get() setTimingFunction:toCAMediaTimingFunction(value, reverse)];
316
void PlatformCAAnimation::copyTimingFunctionFrom(const PlatformCAAnimation* value)
318
[m_animation.get() setTimingFunction:[value->m_animation.get() timingFunction]];
321
bool PlatformCAAnimation::isRemovedOnCompletion() const
323
return [m_animation.get() isRemovedOnCompletion];
326
void PlatformCAAnimation::setRemovedOnCompletion(bool value)
328
[m_animation.get() setRemovedOnCompletion:value];
331
bool PlatformCAAnimation::isAdditive() const
333
return [m_animation.get() isAdditive];
336
void PlatformCAAnimation::setAdditive(bool value)
338
[m_animation.get() setAdditive:value];
341
PlatformCAAnimation::ValueFunctionType PlatformCAAnimation::valueFunction() const
343
CAValueFunction* vf = [m_animation.get() valueFunction];
344
return fromCAValueFunctionType([vf name]);
347
void PlatformCAAnimation::setValueFunction(ValueFunctionType value)
349
[m_animation.get() setValueFunction:[CAValueFunction functionWithName:toCAValueFunctionType(value)]];
352
void PlatformCAAnimation::setFromValue(float value)
354
if (animationType() != Basic)
356
[static_cast<CABasicAnimation*>(m_animation.get()) setFromValue:[NSNumber numberWithDouble:value]];
359
void PlatformCAAnimation::setFromValue(const WebCore::TransformationMatrix& value)
361
if (animationType() != Basic)
364
[static_cast<CABasicAnimation*>(m_animation.get()) setFromValue:[NSValue valueWithCATransform3D:value]];
367
void PlatformCAAnimation::setFromValue(const FloatPoint3D& value)
369
if (animationType() != Basic)
372
NSArray* array = [NSArray arrayWithObjects:
373
[NSNumber numberWithDouble:value.x()],
374
[NSNumber numberWithDouble:value.y()],
375
[NSNumber numberWithDouble:value.z()],
377
[static_cast<CABasicAnimation*>(m_animation.get()) setFromValue:array];
380
void PlatformCAAnimation::setFromValue(const WebCore::Color& value)
382
if (animationType() != Basic)
385
NSArray* array = [NSArray arrayWithObjects:
386
[NSNumber numberWithDouble:value.red()],
387
[NSNumber numberWithDouble:value.green()],
388
[NSNumber numberWithDouble:value.blue()],
389
[NSNumber numberWithDouble:value.alpha()],
391
[static_cast<CABasicAnimation*>(m_animation.get()) setFromValue:array];
394
#if ENABLE(CSS_FILTERS)
395
static double sepiaFullConstants[3][3] = {
396
{ 0.393, 0.769, 0.189 },
397
{ 0.349, 0.686, 0.168 },
398
{ 0.272, 0.534, 0.131 }
401
static double sepiaNoneConstants[3][3] = {
407
static double invertConstants[3][3] = {
413
static RetainPtr<id> filterValueForOperation(const FilterOperation* operation, int internalFilterPropertyIndex)
415
FilterOperation::OperationType type = operation->getOperationType();
419
case FilterOperation::GRAYSCALE:
420
case FilterOperation::SATURATE:
421
case FilterOperation::HUE_ROTATE: {
424
if (!operation->isDefault()) {
425
const BasicColorMatrixFilterOperation* op = static_cast<const BasicColorMatrixFilterOperation*>(operation);
426
amount = op->amount();
429
if (type == FilterOperation::HUE_ROTATE)
430
amount = deg2rad(amount);
432
value.adoptNS([[NSNumber numberWithDouble:amount] retain]);
435
case FilterOperation::SEPIA: {
438
if (!operation->isDefault()) {
439
const BasicColorMatrixFilterOperation* op = static_cast<const BasicColorMatrixFilterOperation*>(operation);
440
amount = op->amount();
443
value.adoptNS([[NSArray arrayWithObjects:
444
[NSNumber numberWithDouble:WebCore::blend(sepiaNoneConstants[internalFilterPropertyIndex][0], sepiaFullConstants[0][internalFilterPropertyIndex], amount)],
445
[NSNumber numberWithDouble:WebCore::blend(sepiaNoneConstants[internalFilterPropertyIndex][1], sepiaFullConstants[1][internalFilterPropertyIndex], amount)],
446
[NSNumber numberWithDouble:WebCore::blend(sepiaNoneConstants[internalFilterPropertyIndex][2], sepiaFullConstants[2][internalFilterPropertyIndex], amount)],
447
[NSNumber numberWithDouble:0],
451
case FilterOperation::INVERT: {
454
if (!operation->isDefault()) {
455
const BasicComponentTransferFilterOperation* op = static_cast<const BasicComponentTransferFilterOperation*>(operation);
456
amount = op->amount();
459
// The color matrix animation for invert does a scale of each color component by a value that goes from
460
// 1 (when amount is 0) to -1 (when amount is 1). Then the color values are offset by amount. This has the
461
// effect of performing the operation: c' = c * -1 + 1, which inverts the color.
462
if (internalFilterPropertyIndex < 3) {
463
// the first 3 properties are the red, green and blue multipliers
464
double multiplier = 1 - amount * 2;
465
value.adoptNS([[NSArray arrayWithObjects:
466
[NSNumber numberWithDouble:invertConstants[internalFilterPropertyIndex][0] * multiplier],
467
[NSNumber numberWithDouble:invertConstants[internalFilterPropertyIndex][1] * multiplier],
468
[NSNumber numberWithDouble:invertConstants[internalFilterPropertyIndex][2] * multiplier],
469
[NSNumber numberWithDouble:0],
472
// the last property is the color offset
473
value.adoptNS([[NSArray arrayWithObjects:
474
[NSNumber numberWithDouble:amount],
475
[NSNumber numberWithDouble:amount],
476
[NSNumber numberWithDouble:amount],
477
[NSNumber numberWithDouble:0],
482
case FilterOperation::OPACITY:
483
case FilterOperation::CONTRAST:
484
case FilterOperation::BRIGHTNESS: {
487
if (!operation->isDefault()) {
488
const BasicComponentTransferFilterOperation* op = static_cast<const BasicComponentTransferFilterOperation*>(operation);
489
amount = op->amount();
492
value.adoptNS([[NSNumber numberWithDouble:amount] retain]);
495
case FilterOperation::BLUR: {
498
if (!operation->isDefault()) {
499
const BlurFilterOperation* op = static_cast<const BlurFilterOperation*>(operation);
500
amount = floatValueForLength(op->stdDeviation(), 0);
503
value.adoptNS([[NSNumber numberWithDouble:amount] retain]);
512
void PlatformCAAnimation::setFromValue(const FilterOperation* operation, int internalFilterPropertyIndex)
514
RetainPtr<id> value = filterValueForOperation(operation, internalFilterPropertyIndex);
515
[static_cast<CABasicAnimation*>(m_animation.get()) setFromValue:value.get()];
519
void PlatformCAAnimation::copyFromValueFrom(const PlatformCAAnimation* value)
521
if (animationType() != Basic || value->animationType() != Basic)
524
CABasicAnimation* otherAnimation = static_cast<CABasicAnimation*>(value->m_animation.get());
525
[static_cast<CABasicAnimation*>(m_animation.get()) setFromValue:[otherAnimation fromValue]];
528
void PlatformCAAnimation::setToValue(float value)
530
if (animationType() != Basic)
532
[static_cast<CABasicAnimation*>(m_animation.get()) setToValue:[NSNumber numberWithDouble:value]];
535
void PlatformCAAnimation::setToValue(const WebCore::TransformationMatrix& value)
537
if (animationType() != Basic)
540
[static_cast<CABasicAnimation*>(m_animation.get()) setToValue:[NSValue valueWithCATransform3D:value]];
543
void PlatformCAAnimation::setToValue(const FloatPoint3D& value)
545
if (animationType() != Basic)
548
NSArray* array = [NSArray arrayWithObjects:
549
[NSNumber numberWithDouble:value.x()],
550
[NSNumber numberWithDouble:value.y()],
551
[NSNumber numberWithDouble:value.z()],
553
[static_cast<CABasicAnimation*>(m_animation.get()) setToValue:array];
556
void PlatformCAAnimation::setToValue(const WebCore::Color& value)
558
if (animationType() != Basic)
561
NSArray* array = [NSArray arrayWithObjects:
562
[NSNumber numberWithDouble:value.red()],
563
[NSNumber numberWithDouble:value.green()],
564
[NSNumber numberWithDouble:value.blue()],
565
[NSNumber numberWithDouble:value.alpha()],
567
[static_cast<CABasicAnimation*>(m_animation.get()) setToValue:array];
570
#if ENABLE(CSS_FILTERS)
571
void PlatformCAAnimation::setToValue(const FilterOperation* operation, int internalFilterPropertyIndex)
573
RetainPtr<id> value = filterValueForOperation(operation, internalFilterPropertyIndex);
574
[static_cast<CABasicAnimation*>(m_animation.get()) setToValue:value.get()];
578
void PlatformCAAnimation::copyToValueFrom(const PlatformCAAnimation* value)
580
if (animationType() != Basic || value->animationType() != Basic)
583
CABasicAnimation* otherAnimation = static_cast<CABasicAnimation*>(value->m_animation.get());
584
[static_cast<CABasicAnimation*>(m_animation.get()) setToValue:[otherAnimation toValue]];
588
// Keyframe-animation properties.
589
void PlatformCAAnimation::setValues(const Vector<float>& value)
591
if (animationType() != Keyframe)
594
NSMutableArray* array = [NSMutableArray array];
595
for (size_t i = 0; i < value.size(); ++i)
596
[array addObject:[NSNumber numberWithDouble:value[i]]];
597
[static_cast<CAKeyframeAnimation*>(m_animation.get()) setValues:array];
600
void PlatformCAAnimation::setValues(const Vector<WebCore::TransformationMatrix>& value)
602
if (animationType() != Keyframe)
605
NSMutableArray* array = [NSMutableArray array];
607
for (size_t i = 0; i < value.size(); ++i)
608
[array addObject:[NSValue valueWithCATransform3D:value[i]]];
610
[static_cast<CAKeyframeAnimation*>(m_animation.get()) setValues:array];
613
void PlatformCAAnimation::setValues(const Vector<FloatPoint3D>& value)
615
if (animationType() != Keyframe)
618
NSMutableArray* array = [NSMutableArray array];
620
for (size_t i = 0; i < value.size(); ++i) {
621
NSArray* object = [NSArray arrayWithObjects:
622
[NSNumber numberWithDouble:value[i].x()],
623
[NSNumber numberWithDouble:value[i].y()],
624
[NSNumber numberWithDouble:value[i].z()],
626
[array addObject:object];
628
[static_cast<CAKeyframeAnimation*>(m_animation.get()) setValues:array];
631
void PlatformCAAnimation::setValues(const Vector<WebCore::Color>& value)
633
if (animationType() != Keyframe)
636
NSMutableArray* array = [NSMutableArray array];
638
for (size_t i = 0; i < value.size(); ++i) {
639
NSArray* object = [NSArray arrayWithObjects:
640
[NSNumber numberWithDouble:value[i].red()],
641
[NSNumber numberWithDouble:value[i].green()],
642
[NSNumber numberWithDouble:value[i].blue()],
643
[NSNumber numberWithDouble:value[i].alpha()],
645
[array addObject:object];
647
[static_cast<CAKeyframeAnimation*>(m_animation.get()) setValues:array];
650
#if ENABLE(CSS_FILTERS)
651
void PlatformCAAnimation::setValues(const Vector<RefPtr<FilterOperation> >& values, int internalFilterPropertyIndex)
653
if (animationType() != Keyframe)
656
NSMutableArray* array = [NSMutableArray array];
658
for (size_t i = 0; i < values.size(); ++i) {
659
RetainPtr<id> value = filterValueForOperation(values[i].get(), internalFilterPropertyIndex);
660
[array addObject:value.get()];
662
[static_cast<CAKeyframeAnimation*>(m_animation.get()) setValues:array];
666
void PlatformCAAnimation::copyValuesFrom(const PlatformCAAnimation* value)
668
if (animationType() != Keyframe || value->animationType() != Keyframe)
671
CAKeyframeAnimation* otherAnimation = static_cast<CAKeyframeAnimation*>(value->m_animation.get());
672
[static_cast<CAKeyframeAnimation*>(m_animation.get()) setValues:[otherAnimation values]];
675
void PlatformCAAnimation::setKeyTimes(const Vector<float>& value)
677
NSMutableArray* array = [NSMutableArray array];
679
for (size_t i = 0; i < value.size(); ++i)
680
[array addObject:[NSNumber numberWithFloat:value[i]]];
682
[static_cast<CAKeyframeAnimation*>(m_animation.get()) setKeyTimes:array];
685
void PlatformCAAnimation::copyKeyTimesFrom(const PlatformCAAnimation* value)
687
CAKeyframeAnimation* other = static_cast<CAKeyframeAnimation*>(value->m_animation.get());
688
[static_cast<CAKeyframeAnimation*>(m_animation.get()) setKeyTimes:[other keyTimes]];
691
void PlatformCAAnimation::setTimingFunctions(const Vector<const TimingFunction*>& value, bool reverse)
693
NSMutableArray* array = [NSMutableArray array];
695
for (size_t i = 0; i < value.size(); ++i)
696
[array addObject:toCAMediaTimingFunction(value[i], reverse)];
698
[static_cast<CAKeyframeAnimation*>(m_animation.get()) setTimingFunctions:array];
701
void PlatformCAAnimation::copyTimingFunctionsFrom(const PlatformCAAnimation* value)
703
CAKeyframeAnimation* other = static_cast<CAKeyframeAnimation*>(value->m_animation.get());
704
[static_cast<CAKeyframeAnimation*>(m_animation.get()) setTimingFunctions:[other timingFunctions]];
707
#if ENABLE(CSS_FILTERS)
708
int PlatformCAAnimation::numAnimatedFilterProperties(FilterOperation::OperationType type)
711
case FilterOperation::GRAYSCALE: return 1;
712
case FilterOperation::SEPIA: return 3;
713
case FilterOperation::SATURATE: return 1;
714
case FilterOperation::HUE_ROTATE: return 1;
715
case FilterOperation::INVERT: return 4;
716
case FilterOperation::OPACITY: return 1;
717
case FilterOperation::BLUR: return 1;
718
case FilterOperation::CONTRAST: return 1;
719
case FilterOperation::BRIGHTNESS: return 1;
724
const char* PlatformCAAnimation::animatedFilterPropertyName(FilterOperation::OperationType type, int internalFilterPropertyIndex)
727
case FilterOperation::GRAYSCALE: return "inputIntensity";
728
case FilterOperation::SEPIA:
729
switch(internalFilterPropertyIndex) {
730
case 0: return "inputRVector";
731
case 1: return "inputGVector";
732
case 2: return "inputBVector";
735
case FilterOperation::SATURATE: return "inputSaturation";
736
case FilterOperation::HUE_ROTATE: return "inputAngle";
737
case FilterOperation::INVERT:
738
switch(internalFilterPropertyIndex) {
739
case 0: return "inputRVector";
740
case 1: return "inputGVector";
741
case 2: return "inputBVector";
742
case 3: return "inputBiasVector";
745
case FilterOperation::OPACITY: return "inputAVector";
746
case FilterOperation::BLUR: return "inputRadius";
747
case FilterOperation::CONTRAST: return "inputContrast";
748
case FilterOperation::BRIGHTNESS: return "inputBrightness";
754
#endif // USE(ACCELERATED_COMPOSITING)