1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "core/animation/InterpolableValue.h"
7
8 namespace blink {
9
10 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(InterpolableValue);
11
interpolate(const InterpolableValue & to,const double progress) const12 PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableNumber::interpolate(const InterpolableValue &to, const double progress) const
13 {
14 const InterpolableNumber& toNumber = toInterpolableNumber(to);
15 if (!progress)
16 return create(m_value);
17 if (progress == 1)
18 return create(toNumber.m_value);
19 return create(m_value * (1 - progress) + toNumber.m_value * progress);
20 }
21
interpolate(const InterpolableValue & to,const double progress) const22 PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableBool::interpolate(const InterpolableValue &to, const double progress) const
23 {
24 if (progress < 0.5) {
25 return clone();
26 }
27 return to.clone();
28 }
29
interpolate(const InterpolableValue & to,const double progress) const30 PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableList::interpolate(const InterpolableValue &to, const double progress) const
31 {
32 const InterpolableList& toList = toInterpolableList(to);
33 ASSERT(toList.m_size == m_size);
34
35 if (!progress) {
36 return create(*this);
37 }
38 if (progress == 1) {
39 return InterpolableList::create(toList);
40 }
41
42 OwnPtrWillBeRawPtr<InterpolableList> result = create(m_size);
43 for (size_t i = 0; i < m_size; i++) {
44 ASSERT(m_values[i]);
45 ASSERT(toList.m_values[i]);
46 result->set(i, m_values[i]->interpolate(*(toList.m_values[i]), progress));
47 }
48 return result.release();
49 }
50
trace(Visitor * visitor)51 void InterpolableList::trace(Visitor* visitor)
52 {
53 #if ENABLE_OILPAN
54 visitor->trace(m_values);
55 #endif
56 InterpolableValue::trace(visitor);
57 }
58
interpolate(const InterpolableValue & other,const double percentage) const59 PassOwnPtrWillBeRawPtr<InterpolableValue> InterpolableAnimatableValue::interpolate(const InterpolableValue &other, const double percentage) const
60 {
61 const InterpolableAnimatableValue& otherValue = toInterpolableAnimatableValue(other);
62 if (!percentage)
63 return create(m_value);
64 if (percentage == 1)
65 return create(otherValue.m_value);
66 return create(AnimatableValue::interpolate(m_value.get(), otherValue.m_value.get(), percentage));
67 }
68
trace(Visitor * visitor)69 void InterpolableAnimatableValue::trace(Visitor* visitor)
70 {
71 visitor->trace(m_value);
72 InterpolableValue::trace(visitor);
73 }
74
75 }
76