X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fthird_party%2FWebKit%2FSource%2Fcore%2Fanimation%2FTimedItem.cpp;h=d837b66b69b61dce323c0c4192b5e4ddfd375d31;hb=ff3e2503a20db9193d323c1d19c38c68004dec4a;hp=c25140341fac887d38f21bbd523ffc94c2cd5d5f;hpb=7338fba38ba696536d1cc9d389afd716a6ab2fe6;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/third_party/WebKit/Source/core/animation/TimedItem.cpp b/src/third_party/WebKit/Source/core/animation/TimedItem.cpp index c251403..d837b66 100644 --- a/src/third_party/WebKit/Source/core/animation/TimedItem.cpp +++ b/src/third_party/WebKit/Source/core/animation/TimedItem.cpp @@ -36,6 +36,19 @@ namespace WebCore { +namespace { + +Timing::FillMode resolvedFillMode(Timing::FillMode fillMode, bool isAnimation) +{ + if (fillMode != Timing::FillModeAuto) + return fillMode; + if (isAnimation) + return Timing::FillModeNone; + return Timing::FillModeBoth; +} + +} // namespace + TimedItem::TimedItem(const Timing& timing, PassOwnPtr eventDelegate) : m_parent(0) , m_startTime(0) @@ -52,7 +65,7 @@ TimedItem::TimedItem(const Timing& timing, PassOwnPtr eventDelega double TimedItem::iterationDuration() const { - double result = m_specified.hasIterationDuration ? m_specified.iterationDuration : intrinsicIterationDuration(); + double result = std::isnan(m_specified.iterationDuration) ? intrinsicIterationDuration() : m_specified.iterationDuration; ASSERT(result >= 0); return result; } @@ -73,6 +86,14 @@ double TimedItem::activeDuration() const return result; } +void TimedItem::updateSpecifiedTiming(const Timing& timing) +{ + m_specified = timing; + invalidate(); + if (m_player) + m_player->setNeedsUpdate(); +} + bool TimedItem::updateInheritedTime(double inheritedTime) const { bool needsUpdate = m_needsUpdate || (m_lastUpdateTime != inheritedTime && !(isNull(m_lastUpdateTime) && isNull(inheritedTime))); @@ -90,7 +111,7 @@ bool TimedItem::updateInheritedTime(double inheritedTime) const const Phase currentPhase = calculatePhase(activeDuration, localTime, m_specified); // FIXME: parentPhase depends on groups being implemented. const TimedItem::Phase parentPhase = TimedItem::PhaseActive; - const double activeTime = calculateActiveTime(activeDuration, localTime, parentPhase, currentPhase, m_specified); + const double activeTime = calculateActiveTime(activeDuration, resolvedFillMode(m_specified.fillMode, isAnimation()), localTime, parentPhase, currentPhase, m_specified); double currentIteration; double timeFraction; @@ -116,7 +137,7 @@ bool TimedItem::updateInheritedTime(double inheritedTime) const ASSERT(localActiveDuration >= 0); const double localLocalTime = localTime < m_specified.startDelay ? localTime : localActiveDuration + m_specified.startDelay; const TimedItem::Phase localCurrentPhase = calculatePhase(localActiveDuration, localLocalTime, m_specified); - const double localActiveTime = calculateActiveTime(localActiveDuration, localLocalTime, parentPhase, localCurrentPhase, m_specified); + const double localActiveTime = calculateActiveTime(localActiveDuration, resolvedFillMode(m_specified.fillMode, isAnimation()), localLocalTime, parentPhase, localCurrentPhase, m_specified); const double startOffset = m_specified.iterationStart * localIterationDuration; ASSERT(startOffset >= 0); const double scaledActiveTime = calculateScaledActiveTime(localActiveDuration, localActiveTime, startOffset, m_specified); @@ -133,6 +154,7 @@ bool TimedItem::updateInheritedTime(double inheritedTime) const m_calculated.isInEffect = !isNull(activeTime); m_calculated.isInPlay = phase() == PhaseActive && (!m_parent || m_parent->isInPlay()); m_calculated.isCurrent = phase() == PhaseBefore || isInPlay() || (m_parent && m_parent->isCurrent()); + m_calculated.localTime = m_lastUpdateTime - m_startTime; } // Test for events even if timing didn't need an update as the player may have gained a start time. @@ -149,9 +171,20 @@ bool TimedItem::updateInheritedTime(double inheritedTime) const if (needsUpdate) { // FIXME: This probably shouldn't be recursive. didTriggerStyleRecalc = updateChildrenAndEffects(); - m_calculated.timeToEffectChange = calculateTimeToEffectChange(localTime, timeToNextIteration); + m_calculated.timeToForwardsEffectChange = calculateTimeToEffectChange(true, localTime, timeToNextIteration); + m_calculated.timeToReverseEffectChange = calculateTimeToEffectChange(false, localTime, timeToNextIteration); } return didTriggerStyleRecalc; } +const TimedItem::CalculatedTiming& TimedItem::ensureCalculated() const +{ + if (!m_player) + return m_calculated; + if (m_player->needsUpdate()) + m_player->update(); + ASSERT(!m_player->needsUpdate()); + return m_calculated; +} + } // namespace WebCore