/** * @see SMILANIM 3.3.4 */ nsSMILTimeValue nsSMILTimedElement::CalcActiveEnd(const nsSMILTimeValue& aBegin, const nsSMILTimeValue& aEnd) { nsSMILTimeValue result; NS_ASSERTION(mSimpleDur.IsResolved() || mSimpleDur.IsIndefinite(), "Unresolved simple duration in CalcActiveEnd."); if (!aBegin.IsResolved() && !aBegin.IsIndefinite()) { NS_ERROR("Unresolved begin time passed to CalcActiveEnd."); result.SetIndefinite(); return result; } if (mRepeatDur.IsIndefinite() || aBegin.IsIndefinite()) { result.SetIndefinite(); } else { result = GetRepeatDuration(); } if (aEnd.IsResolved() && aBegin.IsResolved()) { nsSMILTime activeDur = aEnd.GetMillis() - aBegin.GetMillis(); if (result.IsResolved()) { result.SetMillis(PR_MIN(result.GetMillis(), activeDur)); } else { result.SetMillis(activeDur); } } result = ApplyMinAndMax(result); if (result.IsResolved()) { nsSMILTime activeEnd = result.GetMillis() + aBegin.GetMillis(); result.SetMillis(activeEnd); } return result; }
nsSMILTimeValue nsSMILTimedElement::ApplyMinAndMax(const nsSMILTimeValue& aDuration) { if (!aDuration.IsResolved() && !aDuration.IsIndefinite()) { return aDuration; } if (mMax.CompareTo(mMin) < 0) { return aDuration; } nsSMILTimeValue result; if (aDuration.CompareTo(mMax) > 0) { result = mMax; } else if (aDuration.CompareTo(mMin) < 0) { nsSMILTimeValue repeatDur = GetRepeatDuration(); result = (mMin.CompareTo(repeatDur) > 0) ? repeatDur : mMin; } else { result = aDuration; } return result; }