void CompositeAnimation::resumeAnimations() { if (!m_isSuspended) return; m_isSuspended = false; if (!m_keyframeAnimations.isEmpty()) { m_keyframeAnimations.checkConsistency(); AnimationNameMap::const_iterator animationsEnd = m_keyframeAnimations.end(); for (AnimationNameMap::const_iterator it = m_keyframeAnimations.begin(); it != animationsEnd; ++it) { KeyframeAnimation* anim = it->second.get(); if (anim && anim->playStatePlaying()) anim->updatePlayState(true); } } if (!m_transitions.isEmpty()) { CSSPropertyTransitionsMap::const_iterator transitionsEnd = m_transitions.end(); for (CSSPropertyTransitionsMap::const_iterator it = m_transitions.begin(); it != transitionsEnd; ++it) { ImplicitAnimation* anim = it->second.get(); if (anim && anim->hasStyle()) anim->updatePlayState(true); } } }
void CompositeAnimation::resumeAnimations() { if (!m_suspended) return; m_suspended = false; AnimationNameMap::const_iterator kfend = m_keyframeAnimations.end(); for (AnimationNameMap::const_iterator it = m_keyframeAnimations.begin(); it != kfend; ++it) { KeyframeAnimation* anim = it->second; if (anim && anim->playStatePlaying()) anim->updatePlayState(true); } CSSPropertyTransitionsMap::const_iterator end = m_transitions.end(); for (CSSPropertyTransitionsMap::const_iterator it = m_transitions.begin(); it != end; ++it) { ImplicitAnimation* anim = it->second; if (anim && anim->hasStyle()) anim->updatePlayState(true); } }
void CompositeAnimation::updateKeyframeAnimations(RenderObject* renderer, const RenderStyle* currentStyle, RenderStyle* targetStyle) { // Nothing to do if we don't have any animations, and didn't have any before if (m_keyframeAnimations.isEmpty() && !targetStyle->hasAnimations()) return; // Nothing to do if the current and target animations are the same if (currentStyle && currentStyle->hasAnimations() && targetStyle->hasAnimations() && *(currentStyle->animations()) == *(targetStyle->animations())) return; int numAnims = 0; bool animsChanged = false; // see if the lists match if (targetStyle->animations()) { for (size_t i = 0; i < targetStyle->animations()->size(); ++i) { const Animation* anim = (*targetStyle->animations())[i].get(); if (!anim->isValidAnimation()) animsChanged = true; else { AtomicString name(anim->name()); KeyframeAnimation* kfAnim = m_keyframeAnimations.get(name.impl()); if (!kfAnim || !kfAnim->animationsMatch(anim)) animsChanged = true; else if (anim) { // animations match, but play states may differ. update if needed kfAnim->updatePlayState(anim->playState() == AnimPlayStatePlaying); // set the saved animation to this new one, just in case the play state has changed kfAnim->setAnimation(anim); } } ++numAnims; } } if (!animsChanged && m_keyframeAnimations.size() != numAnims) animsChanged = true; if (!animsChanged) return; // animations have changed, update the list resetAnimations(renderer); if (!targetStyle->animations()) return; // add all the new animations int index = 0; for (size_t i = 0; i < targetStyle->animations()->size(); ++i) { const Animation* anim = (*targetStyle->animations())[i].get(); if (!anim->isValidAnimation()) continue; // don't bother adding the animation if it has no keyframes or won't animate if ((anim->duration() || anim->delay()) && anim->iterationCount() && anim->keyframeList().get() && !anim->keyframeList()->isEmpty()) { KeyframeAnimation* kfanim = new KeyframeAnimation(const_cast<Animation*>(anim), renderer, index++, this); m_keyframeAnimations.set(kfanim->name().impl(), kfanim); } } }