16f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
26f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
36f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch// found in the LICENSE file.
46f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
56f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "config.h"
66f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "core/animation/SampledEffect.h"
76f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
8d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/animation/interpolation/StyleInterpolation.h"
9d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
106f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochnamespace WebCore {
116f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
126f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochSampledEffect::SampledEffect(Animation* animation, PassOwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation> > > interpolations)
13d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    : m_animation(animation)
14d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
15d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    , m_player(animation->player())
16d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
176f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    , m_interpolations(interpolations)
18d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    , m_playerSortInfo(animation->player()->sortInfo())
196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    , m_priority(animation->priority())
206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{
216f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    ASSERT(m_interpolations && !m_interpolations->isEmpty());
226f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}
236f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
246f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochbool SampledEffect::canChange() const
256f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{
26d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if ENABLE(OILPAN)
27d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return m_animation;
28d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#else
296f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (!m_animation)
306f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return false;
316f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // FIXME: This check won't be needed when Animation and AnimationPlayer are moved to Oilpan.
326f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    return !m_player->canFree();
33d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
346f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}
356f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
366f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid SampledEffect::clear()
376f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{
38d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
39d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    m_player = nullptr;
40d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
41d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    m_animation = nullptr;
426f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    m_interpolations->clear();
436f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}
446f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
456f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid SampledEffect::removeReplacedInterpolationsIfNeeded(const BitArray<numCSSProperties>& replacedProperties)
466f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{
476f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (canChange() && m_animation->isCurrent())
486f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return;
496f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
506f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    size_t dest = 0;
516f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    for (size_t i = 0; i < m_interpolations->size(); i++) {
526f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (!replacedProperties.get(toStyleInterpolation(m_interpolations->at(i).get())->id()))
536f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            m_interpolations->at(dest++) = m_interpolations->at(i);
546f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
556f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    m_interpolations->shrink(dest);
566f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}
576f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
58d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void SampledEffect::trace(Visitor* visitor)
59d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
60d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    visitor->trace(m_animation);
61d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if ENABLE(OILPAN)
62d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    visitor->trace(m_interpolations);
63d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
64d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
65d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
666f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch} // namespace WebCore
67