void KeyframeEffect::applyEffects()
{
    ASSERT(isInEffect());
    ASSERT(animation());
    if (!m_target || !m_model)
        return;

    if (hasIncompatibleStyle())
        animation()->cancelAnimationOnCompositor();

    double iteration = currentIteration();
    ASSERT(iteration >= 0);
    bool changed = false;
    if (m_sampledEffect) {
        changed = m_model->sample(clampTo<int>(iteration, 0), timeFraction(), iterationDuration(), m_sampledEffect->mutableInterpolations());
    } else {
        Vector<RefPtr<Interpolation>> interpolations;
        m_model->sample(clampTo<int>(iteration, 0), timeFraction(), iterationDuration(), interpolations);
        if (!interpolations.isEmpty()) {
            SampledEffect* sampledEffect = SampledEffect::create(this);
            sampledEffect->mutableInterpolations().swap(interpolations);
            m_sampledEffect = sampledEffect;
            ensureAnimationStack(m_target).add(sampledEffect);
            changed = true;
        } else {
            return;
        }
    }

    if (changed) {
        m_target->setNeedsAnimationStyleRecalc();
        if (RuntimeEnabledFeatures::webAnimationsSVGEnabled() && m_target->isSVGElement())
            toSVGElement(*m_target).setWebAnimationsPending();
    }
}
예제 #2
0
void KeyframeEffect::applyEffects()
{
    ASSERT(isInEffect());
    ASSERT(animation());
    if (!m_target || !m_model)
        return;

    // Cancel composited animation of transform if a motion path has been introduced on the element.
    if (m_target->computedStyle()
        && m_target->computedStyle()->hasMotionPath()
        && animation()->hasActiveAnimationsOnCompositor()
        && animation()->affects(*m_target, CSSPropertyTransform)) {
        animation()->cancelAnimationOnCompositor();
    }

    double iteration = currentIteration();
    ASSERT(iteration >= 0);
    OwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation>>> interpolations = m_sampledEffect ? m_sampledEffect->mutableInterpolations() : nullptr;
    // FIXME: Handle iteration values which overflow int.
    m_model->sample(static_cast<int>(iteration), timeFraction(), iterationDuration(), interpolations);
    if (m_sampledEffect) {
        m_sampledEffect->setInterpolations(interpolations.release());
    } else if (interpolations && !interpolations->isEmpty()) {
        OwnPtrWillBeRawPtr<SampledEffect> sampledEffect = SampledEffect::create(this, interpolations.release());
        m_sampledEffect = sampledEffect.get();
        ensureAnimationStack(m_target).add(sampledEffect.release());
    } else {
        return;
    }

    m_target->setNeedsAnimationStyleRecalc();
    if (m_target->isSVGElement())
        m_sampledEffect->applySVGUpdate(toSVGElement(*m_target));
}
예제 #3
0
void KeyframeEffectReadOnly::updateChildrenAndEffects() const {
  if (!m_model)
    return;
  DCHECK(animation());
  if (isInEffect() && !animation()->effectSuppressed())
    const_cast<KeyframeEffectReadOnly*>(this)->applyEffects();
  else if (m_sampledEffect)
    const_cast<KeyframeEffectReadOnly*>(this)->clearEffects();
}
예제 #4
0
void Animation::updateChildrenAndEffects() const
{
    if (!m_effect)
        return;
    if (isInEffect())
        const_cast<Animation*>(this)->applyEffects();
    else if (m_sampledEffect)
        const_cast<Animation*>(this)->clearEffects();
}
void KeyframeEffect::updateChildrenAndEffects() const
{
    if (!m_model)
        return;
    if (isInEffect())
        const_cast<KeyframeEffect*>(this)->applyEffects();
    else if (m_sampledEffect)
        const_cast<KeyframeEffect*>(this)->clearEffects();
}
예제 #6
0
PassOwnPtr<AnimationEffect::CompositableValueList> InertAnimation::sample()
{
    updateInheritedTime(0);
    if (!isInEffect())
        return nullptr;

    double iteration = currentIteration();
    ASSERT(iteration >= 0);
    // FIXME: Handle iteration values which overflow int.
    return m_effect->sample(static_cast<int>(iteration), timeFraction());
}
예제 #7
0
PassOwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation> > > InertAnimation::sample(double inheritedTime)
{
    updateInheritedTime(inheritedTime, TimingUpdateOnDemand);
    if (!isInEffect())
        return nullptr;

    double iteration = currentIteration();
    ASSERT(iteration >= 0);
    // FIXME: Handle iteration values which overflow int.
    return m_effect->sample(static_cast<int>(iteration), timeFraction(), iterationDuration());
}
예제 #8
0
void InertEffect::sample(Vector<RefPtr<Interpolation>>& result)
{
    updateInheritedTime(m_inheritedTime, TimingUpdateOnDemand);
    if (!isInEffect()) {
        result.clear();
        return;
    }

    double iteration = currentIteration();
    ASSERT(iteration >= 0);
    m_model->sample(clampTo<int>(iteration, 0), timeFraction(), iterationDuration(), result);
}
예제 #9
0
void InertEffect::sample(OwnPtrWillBeRawPtr<WillBeHeapVector<RefPtrWillBeMember<Interpolation>>>& result)
{
    updateInheritedTime(m_inheritedTime, TimingUpdateOnDemand);
    if (!isInEffect()) {
        result.clear();
        return;
    }

    double iteration = currentIteration();
    ASSERT(iteration >= 0);
    // FIXME: Handle iteration values which overflow int.
    return m_model->sample(static_cast<int>(iteration), timeFraction(), iterationDuration(), result);
}
예제 #10
0
bool Animation::updateChildrenAndEffects() const
{
    if (!m_effect)
        return false;

    if (isInEffect())
        return const_cast<Animation*>(this)->applyEffects(m_activeInAnimationStack);

    if (m_activeInAnimationStack) {
        const_cast<Animation*>(this)->clearEffects();
        return true;
    }
    return false;
}
예제 #11
0
bool Animation::applyEffects(bool previouslyInEffect)
{
    ASSERT(isInEffect());
    if (!m_target || !m_effect)
        return false;

    if (player() && !previouslyInEffect) {
        ensureAnimationStack(m_target.get()).add(this);
        m_activeInAnimationStack = true;
    }

    double iteration = currentIteration();
    ASSERT(iteration >= 0);
    // FIXME: Handle iteration values which overflow int.
    m_compositableValues = m_effect->sample(static_cast<int>(iteration), timeFraction());
    if (player()) {
        m_target->setNeedsAnimationStyleRecalc();
        return true;
    }
    return false;
}
예제 #12
0
void Animation::applyEffects()
{
    ASSERT(isInEffect());
    ASSERT(player());
    if (!m_target || !m_effect)
        return;

    double iteration = currentIteration();
    ASSERT(iteration >= 0);
    // FIXME: Handle iteration values which overflow int.
    OwnPtr<Vector<RefPtr<Interpolation> > > interpolations = m_effect->sample(static_cast<int>(iteration), timeFraction(), iterationDuration());
    if (m_sampledEffect) {
        m_sampledEffect->setInterpolations(interpolations.release());
    } else if (!interpolations->isEmpty()) {
        OwnPtr<SampledEffect> sampledEffect = SampledEffect::create(this, interpolations.release());
        m_sampledEffect = sampledEffect.get();
        ensureAnimationStack(m_target).add(sampledEffect.release());
    } else {
        return;
    }

    m_target->setNeedsAnimationStyleRecalc();
}