Index: Source/core/animation/KeyframeEffectModel.cpp |
diff --git a/Source/core/animation/KeyframeEffectModel.cpp b/Source/core/animation/KeyframeEffectModel.cpp |
index f3c0bd09ceaef2f68e845cdf58e49bbc32cfbbc9..d566939e1036c745d585d223d457b3c2ed88f24e 100644 |
--- a/Source/core/animation/KeyframeEffectModel.cpp |
+++ b/Source/core/animation/KeyframeEffectModel.cpp |
@@ -38,28 +38,6 @@ namespace { |
using namespace WebCore; |
-class ReplaceCompositableValue : public AnimationEffect::CompositableValue { |
-public: |
- static PassRefPtr<ReplaceCompositableValue> create(const AnimatableValue* value) |
- { |
- return adoptRef(new ReplaceCompositableValue(value)); |
- } |
- virtual bool dependsOnUnderlyingValue() const |
- { |
- return false; |
- } |
- virtual PassRefPtr<AnimatableValue> compositeOnto(const AnimatableValue* underlyingValue) const |
- { |
- return PassRefPtr<AnimatableValue>(m_value); |
- } |
-private: |
- ReplaceCompositableValue(const AnimatableValue* value) |
- : m_value(const_cast<AnimatableValue*>(value)) |
- { |
- } |
- RefPtr<AnimatableValue> m_value; |
-}; |
- |
class AddCompositableValue : public AnimationEffect::CompositableValue { |
public: |
static PassRefPtr<AddCompositableValue> create(const AnimatableValue* value) |
@@ -181,15 +159,14 @@ PropertySet KeyframeEffectModel::properties() const |
return result; |
} |
-PassOwnPtr<AnimationEffect::CompositableValueList> KeyframeEffectModel::sample(int iteration, double fraction) const |
+PassOwnPtr<Vector<RefPtr<Interpolation> > > KeyframeEffectModel::sample(int iteration, double fraction) const |
{ |
ASSERT(iteration >= 0); |
ASSERT(!isNull(fraction)); |
- const_cast<KeyframeEffectModel*>(this)->ensureKeyframeGroups(); |
- OwnPtr<CompositableValueList> map = adoptPtr(new CompositableValueList()); |
- for (KeyframeGroupMap::const_iterator iter = m_keyframeGroups->begin(); iter != m_keyframeGroups->end(); ++iter) |
- map->append(std::make_pair(iter->key, iter->value->sample(iteration, fraction))); |
- return map.release(); |
+ ensureKeyframeGroups(); |
+ ensureInterpolationEffect(); |
+ |
+ return m_interpolationEffect->getActiveInterpolations(fraction); |
} |
KeyframeEffectModel::KeyframeVector KeyframeEffectModel::normalizedKeyframes() const |
@@ -247,11 +224,35 @@ void KeyframeEffectModel::ensureKeyframeGroups() const |
} |
} |
+void KeyframeEffectModel::ensureInterpolationEffect() const |
+{ |
+ if (m_interpolationEffect) |
+ return; |
+ m_interpolationEffect = InterpolationEffect::create(); |
+ |
+ for (KeyframeGroupMap::const_iterator iter = m_keyframeGroups->begin(); iter != m_keyframeGroups->end(); ++iter) |
+ { |
+ const PropertySpecificKeyframeVector& keyframes = iter->value->keyframes(); |
+ ASSERT(keyframes[0]->value()->isAnimatableValue()); |
+ const AnimatableValue* start; |
+ const AnimatableValue* end = toAnimatableValue(keyframes[0]->value()); |
+ for (size_t i = 0; i < keyframes.size() - 1; i++) { |
+ ASSERT(keyframes[i+1]->value()->isAnimatableValue()); |
+ start = end; |
+ end = toAnimatableValue(keyframes[i+1]->value()); |
+ m_interpolationEffect->addInterpolation( |
+ LegacyStyleInterpolation::create( |
+ AnimatableValue::takeConstRef(start), |
+ AnimatableValue::takeConstRef(end), iter->key), |
+ keyframes[i]->offset(), keyframes[i+1]->offset()); |
+ } |
+ } |
+} |
KeyframeEffectModel::PropertySpecificKeyframe::PropertySpecificKeyframe(double offset, const AnimatableValue* value, CompositeOperation composite) |
: m_offset(offset) |
, m_value(composite == AnimationEffect::CompositeReplace ? |
- static_cast<PassRefPtr<CompositableValue> >(ReplaceCompositableValue::create(value)) : |
+ AnimatableValue::takeConstRef(value) : |
static_cast<PassRefPtr<CompositableValue> >(AddCompositableValue::create(value))) |
{ |
} |