Commit e6dcd585 authored by shans@chromium.org's avatar shans@chromium.org

Web Animations API: Interpolate into reference rather than returning new value.

This is a re-work of https://codereview.chromium.org/238313003/

Review URL: https://codereview.chromium.org/712143003

git-svn-id: svn://svn.chromium.org/blink/trunk@185088 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 925f8f97
...@@ -9,43 +9,43 @@ namespace blink { ...@@ -9,43 +9,43 @@ namespace blink {
DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(InterpolableValue); DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(InterpolableValue);
PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableNumber::interpolate(const InterpolableValue &to, const double progress) const void InterpolableNumber::interpolate(const InterpolableValue &to, const double progress, InterpolableValue& result) const
{ {
const InterpolableNumber& toNumber = toInterpolableNumber(to); const InterpolableNumber& toNumber = toInterpolableNumber(to);
if (!progress) InterpolableNumber& resultNumber = toInterpolableNumber(result);
return create(m_value);
if (progress == 1) if (progress == 0)
return create(toNumber.m_value); resultNumber.m_value = m_value;
return create(m_value * (1 - progress) + toNumber.m_value * progress); else if (progress == 1)
resultNumber.m_value = toNumber.m_value;
else
resultNumber.m_value = m_value * (1 - progress) + toNumber.m_value * progress;
} }
PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableBool::interpolate(const InterpolableValue &to, const double progress) const void InterpolableBool::interpolate(const InterpolableValue &to, const double progress, InterpolableValue& result) const
{ {
if (progress < 0.5) { const InterpolableBool& toBool = toInterpolableBool(to);
return clone(); InterpolableBool& resultBool = toInterpolableBool(result);
}
return to.clone(); if (progress < 0.5)
resultBool.m_value = m_value;
else
resultBool.m_value = toBool.m_value;
} }
PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableList::interpolate(const InterpolableValue &to, const double progress) const void InterpolableList::interpolate(const InterpolableValue& to, const double progress, InterpolableValue& result) const
{ {
const InterpolableList& toList = toInterpolableList(to); const InterpolableList& toList = toInterpolableList(to);
ASSERT(toList.m_size == m_size); InterpolableList& resultList = toInterpolableList(result);
if (!progress) { ASSERT(toList.m_size == m_size);
return create(*this); ASSERT(resultList.m_size == m_size);
}
if (progress == 1) {
return InterpolableList::create(toList);
}
OwnPtrWillBeRawPtr<InterpolableList> result = create(m_size);
for (size_t i = 0; i < m_size; i++) { for (size_t i = 0; i < m_size; i++) {
ASSERT(m_values[i]); ASSERT(m_values[i]);
ASSERT(toList.m_values[i]); ASSERT(toList.m_values[i]);
result->set(i, m_values[i]->interpolate(*(toList.m_values[i]), progress)); m_values[i]->interpolate(*(toList.m_values[i]), progress, *(resultList.m_values[i]));
} }
return result.release();
} }
void InterpolableList::trace(Visitor* visitor) void InterpolableList::trace(Visitor* visitor)
...@@ -56,14 +56,15 @@ void InterpolableList::trace(Visitor* visitor) ...@@ -56,14 +56,15 @@ void InterpolableList::trace(Visitor* visitor)
InterpolableValue::trace(visitor); InterpolableValue::trace(visitor);
} }
PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableAnimatableValue::interpolate(const InterpolableValue &other, const double percentage) const void InterpolableAnimatableValue::interpolate(const InterpolableValue& to, const double progress, InterpolableValue& result) const
{ {
const InterpolableAnimatableValue& otherValue = toInterpolableAnimatableValue(other); const InterpolableAnimatableValue& toValue = toInterpolableAnimatableValue(to);
if (!percentage) InterpolableAnimatableValue& resultValue = toInterpolableAnimatableValue(result);
return create(m_value); if (progress == 0)
if (percentage == 1) resultValue.m_value = m_value;
return create(otherValue.m_value); if (progress == 1)
return create(AnimatableValue::interpolate(m_value.get(), otherValue.m_value.get(), percentage)); resultValue.m_value = toValue.m_value;
resultValue.m_value = AnimatableValue::interpolate(m_value.get(), toValue.m_value.get(), progress);
} }
void InterpolableAnimatableValue::trace(Visitor* visitor) void InterpolableAnimatableValue::trace(Visitor* visitor)
......
...@@ -25,7 +25,7 @@ public: ...@@ -25,7 +25,7 @@ public:
virtual void trace(Visitor*) { } virtual void trace(Visitor*) { }
private: private:
virtual PassOwnPtrWillBeRawPtr<InterpolableValue> interpolate(const InterpolableValue &to, const double progress) const = 0; virtual void interpolate(const InterpolableValue& to, const double progress, InterpolableValue& result) const = 0;
friend class Interpolation; friend class Interpolation;
...@@ -51,7 +51,7 @@ public: ...@@ -51,7 +51,7 @@ public:
virtual void trace(Visitor* visitor) override { InterpolableValue::trace(visitor); } virtual void trace(Visitor* visitor) override { InterpolableValue::trace(visitor); }
private: private:
virtual PassOwnPtrWillBeRawPtr<InterpolableValue> interpolate(const InterpolableValue &to, const double progress) const override final; virtual void interpolate(const InterpolableValue& to, const double progress, InterpolableValue& result) const override final;
double m_value; double m_value;
explicit InterpolableNumber(double value) explicit InterpolableNumber(double value)
...@@ -75,7 +75,7 @@ public: ...@@ -75,7 +75,7 @@ public:
virtual void trace(Visitor* visitor) override { InterpolableValue::trace(visitor); } virtual void trace(Visitor* visitor) override { InterpolableValue::trace(visitor); }
private: private:
virtual PassOwnPtrWillBeRawPtr<InterpolableValue> interpolate(const InterpolableValue &to, const double progress) const override final; virtual void interpolate(const InterpolableValue& to, const double progress, InterpolableValue& result) const override final;
bool m_value; bool m_value;
explicit InterpolableBool(bool value) explicit InterpolableBool(bool value)
...@@ -114,7 +114,7 @@ public: ...@@ -114,7 +114,7 @@ public:
virtual void trace(Visitor*) override; virtual void trace(Visitor*) override;
private: private:
virtual PassOwnPtrWillBeRawPtr<InterpolableValue> interpolate(const InterpolableValue &other, const double progress) const override final; virtual void interpolate(const InterpolableValue& to, const double progress, InterpolableValue& result) const override final;
explicit InterpolableList(size_t size) explicit InterpolableList(size_t size)
: m_size(size) : m_size(size)
, m_values(m_size) , m_values(m_size)
...@@ -148,7 +148,7 @@ public: ...@@ -148,7 +148,7 @@ public:
virtual void trace(Visitor*) override; virtual void trace(Visitor*) override;
private: private:
virtual PassOwnPtrWillBeRawPtr<InterpolableValue> interpolate(const InterpolableValue &other, const double progress) const override final; virtual void interpolate(const InterpolableValue &to, const double progress, InterpolableValue& result) const override final;
RefPtrWillBeMember<AnimatableValue> m_value; RefPtrWillBeMember<AnimatableValue> m_value;
InterpolableAnimatableValue(PassRefPtrWillBeRawPtr<AnimatableValue> value) InterpolableAnimatableValue(PassRefPtrWillBeRawPtr<AnimatableValue> value)
......
...@@ -47,7 +47,7 @@ Interpolation::Interpolation(PassOwnPtrWillBeRawPtr<InterpolableValue> start, Pa ...@@ -47,7 +47,7 @@ Interpolation::Interpolation(PassOwnPtrWillBeRawPtr<InterpolableValue> start, Pa
void Interpolation::interpolate(int iteration, double fraction) const void Interpolation::interpolate(int iteration, double fraction) const
{ {
if (m_cachedFraction != fraction || m_cachedIteration != iteration) { if (m_cachedFraction != fraction || m_cachedIteration != iteration) {
m_cachedValue = m_start->interpolate(*m_end, fraction); m_start->interpolate(*m_end, fraction, *m_cachedValue);
m_cachedIteration = iteration; m_cachedIteration = iteration;
m_cachedFraction = fraction; m_cachedFraction = fraction;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment