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
8namespace blink {
9
10DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(InterpolableValue);
11
12PassOwnPtrWillBeRawPtr<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
22PassOwnPtrWillBeRawPtr<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
30PassOwnPtrWillBeRawPtr<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
51void InterpolableList::trace(Visitor* visitor)
52{
53#if ENABLE_OILPAN
54    visitor->trace(m_values);
55#endif
56    InterpolableValue::trace(visitor);
57}
58
59PassOwnPtrWillBeRawPtr<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
69void InterpolableAnimatableValue::trace(Visitor* visitor)
70{
71    visitor->trace(m_value);
72    InterpolableValue::trace(visitor);
73}
74
75}
76