// 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/config.h"
#include "sky/engine/core/animation/SampledEffect.h"

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

namespace blink {

SampledEffect::SampledEffect(Animation* animation, PassOwnPtr<Vector<RefPtr<Interpolation> > > interpolations)
    : m_animation(animation)
#if !ENABLE(OILPAN)
    , m_player(animation->player())
#endif
    , m_interpolations(interpolations)
    , m_sequenceNumber(animation->player()->sequenceNumber())
    , m_priority(animation->priority())
{
    ASSERT(m_interpolations && !m_interpolations->isEmpty());
}

bool SampledEffect::canChange() const
{
#if ENABLE(OILPAN)
    return m_animation;
#else
    if (!m_animation)
        return false;
    // FIXME: This check won't be needed when Animation and AnimationPlayer are moved to Oilpan.
    return !m_player->canFree();
#endif
}

void SampledEffect::clear()
{
#if !ENABLE(OILPAN)
    m_player = nullptr;
#endif
    m_animation = nullptr;
    m_interpolations->clear();
}

void SampledEffect::removeReplacedInterpolationsIfNeeded(const BitArray<numCSSProperties>& replacedProperties)
{
    if (canChange() && m_animation->isCurrent())
        return;

    size_t dest = 0;
    for (size_t i = 0; i < m_interpolations->size(); i++) {
        if (!replacedProperties.get(toStyleInterpolation(m_interpolations->at(i).get())->id()))
            m_interpolations->at(dest++) = m_interpolations->at(i);
    }
    m_interpolations->shrink(dest);
}

} // namespace blink
