// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "sky/engine/core/animation/InterpolableValue.h"

namespace blink {

DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(InterpolableValue);

PassOwnPtr<InterpolableValue> InterpolableNumber::interpolate(const InterpolableValue &to, const double progress) const
{
    const InterpolableNumber& toNumber = toInterpolableNumber(to);
    if (!progress)
        return create(m_value);
    if (progress == 1)
        return create(toNumber.m_value);
    return create(m_value * (1 - progress) + toNumber.m_value * progress);
}

PassOwnPtr<InterpolableValue> InterpolableBool::interpolate(const InterpolableValue &to, const double progress) const
{
    if (progress < 0.5) {
        return clone();
    }
    return to.clone();
}

PassOwnPtr<InterpolableValue> InterpolableList::interpolate(const InterpolableValue &to, const double progress) const
{
    const InterpolableList& toList = toInterpolableList(to);
    ASSERT(toList.m_size == m_size);

    if (!progress) {
        return create(*this);
    }
    if (progress == 1) {
        return InterpolableList::create(toList);
    }

    OwnPtr<InterpolableList> result = create(m_size);
    for (size_t i = 0; i < m_size; i++) {
        ASSERT(m_values[i]);
        ASSERT(toList.m_values[i]);
        result->set(i, m_values[i]->interpolate(*(toList.m_values[i]), progress));
    }
    return result.release();
}

PassOwnPtr<InterpolableValue> InterpolableAnimatableValue::interpolate(const InterpolableValue &other, const double percentage) const
{
    const InterpolableAnimatableValue& otherValue = toInterpolableAnimatableValue(other);
    if (!percentage)
        return create(m_value);
    if (percentage == 1)
        return create(otherValue.m_value);
    return create(AnimatableValue::interpolate(m_value.get(), otherValue.m_value.get(), percentage));
}

}
