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> eventDelegate)
: m_parent(0)
, m_startTime(0)
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;
}
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)));
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;
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);
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.
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