Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Side by Side Diff: Source/WebCore/platform/graphics/chromium/cc/CCLayerAnimationController.cpp

Issue 10384167: Merge 116554 - [chromium] Add impl-thread support for fill-mode and direction css animation propert… (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1132/
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 45
46 template <> 46 template <>
47 void appendKeyframe<TransformAnimationValue, CCTransformKeyframe, CCKeyframedTra nsformAnimationCurve>(CCKeyframedTransformAnimationCurve& curve, double keyTime, const TransformAnimationValue* value, PassOwnPtr<CCTimingFunction> timingFuncti on) 47 void appendKeyframe<TransformAnimationValue, CCTransformKeyframe, CCKeyframedTra nsformAnimationCurve>(CCKeyframedTransformAnimationCurve& curve, double keyTime, const TransformAnimationValue* value, PassOwnPtr<CCTimingFunction> timingFuncti on)
48 { 48 {
49 curve.addKeyframe(CCTransformKeyframe::create(keyTime, *value->value(), timi ngFunction)); 49 curve.addKeyframe(CCTransformKeyframe::create(keyTime, *value->value(), timi ngFunction));
50 } 50 }
51 51
52 template <class Value, class Keyframe, class Curve> 52 template <class Value, class Keyframe, class Curve>
53 PassOwnPtr<CCActiveAnimation> createActiveAnimation(const KeyframeValueList& val ueList, const Animation* animation, size_t animationId, size_t groupId, double t imeOffset, CCActiveAnimation::TargetProperty targetProperty) 53 PassOwnPtr<CCActiveAnimation> createActiveAnimation(const KeyframeValueList& val ueList, const Animation* animation, size_t animationId, size_t groupId, double t imeOffset, CCActiveAnimation::TargetProperty targetProperty)
54 { 54 {
55 // FIXME: add support for different directions. 55 bool alternate = false;
56 if (animation && animation->isDirectionSet() && animation->direction() != An imation::AnimationDirectionNormal) 56 bool reverse = false;
57 return nullptr; 57 if (animation && animation->isDirectionSet()) {
58 58 Animation::AnimationDirection direction = animation->direction();
59 // FIXME: add support for fills forwards and fills backwards 59 if (direction == Animation::AnimationDirectionAlternate || direction == Animation::AnimationDirectionAlternateReverse)
60 if (animation && animation->isFillModeSet() && (animation->fillsForwards() | | animation->fillsBackwards())) 60 alternate = true;
61 return nullptr; 61 if (direction == Animation::AnimationDirectionReverse || direction == An imation::AnimationDirectionAlternateReverse)
62 reverse = true;
63 }
62 64
63 OwnPtr<Curve> curve = Curve::create(); 65 OwnPtr<Curve> curve = Curve::create();
64 Vector<Keyframe> keyframes; 66 Vector<Keyframe> keyframes;
65 67
66 for (size_t i = 0; i < valueList.size(); i++) { 68 for (size_t i = 0; i < valueList.size(); i++) {
67 const Value* originalValue = static_cast<const Value*>(valueList.at(i)); 69 size_t index = reverse ? valueList.size() - i - 1 : i;
70
71 const Value* originalValue = static_cast<const Value*>(valueList.at(inde x));
68 72
69 OwnPtr<CCTimingFunction> timingFunction; 73 OwnPtr<CCTimingFunction> timingFunction;
70 const TimingFunction* originalTimingFunction = originalValue->timingFunc tion(); 74 const TimingFunction* originalTimingFunction = originalValue->timingFunc tion();
71 75
72 // If there hasn't been a timing function associated with this keyframe, use the 76 // If there hasn't been a timing function associated with this keyframe, use the
73 // animation's timing function, if we have one. 77 // animation's timing function, if we have one.
74 if (!originalTimingFunction && animation->isTimingFunctionSet()) 78 if (!originalTimingFunction && animation->isTimingFunctionSet())
75 originalTimingFunction = animation->timingFunction().get(); 79 originalTimingFunction = animation->timingFunction().get();
76 80
77 if (originalTimingFunction) { 81 if (originalTimingFunction) {
78 switch (originalTimingFunction->type()) { 82 switch (originalTimingFunction->type()) {
79 case TimingFunction::StepsFunction: 83 case TimingFunction::StepsFunction:
80 // FIXME: add support for steps timing function. 84 // FIXME: add support for steps timing function.
81 return nullptr; 85 return nullptr;
82 case TimingFunction::LinearFunction: 86 case TimingFunction::LinearFunction:
83 // Don't set the timing function. Keyframes are interpolated lin early if there is no timing function. 87 // Don't set the timing function. Keyframes are interpolated lin early if there is no timing function.
84 break; 88 break;
85 case TimingFunction::CubicBezierFunction: 89 case TimingFunction::CubicBezierFunction:
86 const CubicBezierTimingFunction* originalBezierTimingFunction = static_cast<const CubicBezierTimingFunction*>(originalTimingFunction); 90 const CubicBezierTimingFunction* originalBezierTimingFunction = static_cast<const CubicBezierTimingFunction*>(originalTimingFunction);
87 timingFunction = CCCubicBezierTimingFunction::create(originalBez ierTimingFunction->x1(), originalBezierTimingFunction->y1(), originalBezierTimin gFunction->x2(), originalBezierTimingFunction->y2()); 91 timingFunction = CCCubicBezierTimingFunction::create(originalBez ierTimingFunction->x1(), originalBezierTimingFunction->y1(), originalBezierTimin gFunction->x2(), originalBezierTimingFunction->y2());
88 break; 92 break;
89 } // switch 93 } // switch
90 } else 94 } else
91 timingFunction = CCEaseTimingFunction::create(); 95 timingFunction = CCEaseTimingFunction::create();
92 96
93 double duration = (animation && animation->isDurationSet()) ? animation- >duration() : 1; 97 double duration = (animation && animation->isDurationSet()) ? animation- >duration() : 1;
94 appendKeyframe<Value, Keyframe, Curve>(*curve, originalValue->keyTime() * duration, originalValue, timingFunction.release()); 98 double keyTime = originalValue->keyTime() * duration;
99 if (reverse)
100 keyTime = duration - keyTime;
101 appendKeyframe<Value, Keyframe, Curve>(*curve, keyTime, originalValue, t imingFunction.release());
95 } 102 }
96 103
97 OwnPtr<CCActiveAnimation> anim = CCActiveAnimation::create(curve.release(), animationId, groupId, targetProperty); 104 OwnPtr<CCActiveAnimation> anim = CCActiveAnimation::create(curve.release(), animationId, groupId, targetProperty);
98 105
99 ASSERT(anim.get()); 106 ASSERT(anim.get());
100 107
101 if (anim.get()) { 108 if (anim.get()) {
102 int iterations = (animation && animation->isIterationCountSet()) ? anima tion->iterationCount() : 1; 109 int iterations = (animation && animation->isIterationCountSet()) ? anima tion->iterationCount() : 1;
103 anim->setIterations(iterations); 110 anim->setIterations(iterations);
111 anim->setAlternatesDirection(alternate);
104 } 112 }
105 113
106 // In order to avoid skew, the main thread animation cannot tick until it ha s received the start time of 114 // In order to avoid skew, the main thread animation cannot tick until it ha s received the start time of
107 // the corresponding impl thread animation. 115 // the corresponding impl thread animation.
108 anim->setNeedsSynchronizedStartTime(true); 116 anim->setNeedsSynchronizedStartTime(true);
109 117
110 // If timeOffset > 0, then the animation has started in the past. 118 // If timeOffset > 0, then the animation has started in the past.
111 anim->setTimeOffset(timeOffset); 119 anim->setTimeOffset(timeOffset);
112 120
113 return anim.release(); 121 return anim.release();
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 m_client->setOpacityFromAnimation(opacity); 487 m_client->setOpacityFromAnimation(opacity);
480 break; 488 break;
481 } 489 }
482 490
483 } 491 }
484 } 492 }
485 } 493 }
486 } 494 }
487 495
488 } // namespace WebCore 496 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698