void Clock::Begin (TimeSpan parentTime) { //printf ("clock %p (%s) begin\n", this, GetName ()); emit_completed = false; has_completed = false; was_stopped = false; /* we're starting. initialize our current_time field */ SetCurrentTime ((parentTime - root_parent_time - timeline->GetBeginTime ()) * timeline->GetSpeedRatio()); Duration d = GetNaturalDuration (); if (d.HasTimeSpan ()) { if (d.GetTimeSpan() == 0) { progress = 1.0; } else { progress = (double)current_time / d.GetTimeSpan(); if (progress > 1.0) progress = 1.0; } } else progress = 0.0; CalculateFillTime (); SetClockState (Clock::Active); // force the time manager to tick the clock hierarchy to wake it up time_manager->NeedClockTick (); }
bool Timeline::Validate () { RepeatBehavior *repeat = GetRepeatBehavior (); Duration *duration = GetDuration (); if (duration->HasTimeSpan () && duration->GetTimeSpan () == 0 && (GetFillBehavior () == FillBehaviorStop || (repeat->HasCount () && repeat->GetCount () > 1.0))) timeline_status = TIMELINE_STATUS_DETACHED; // FIXME This should prolly be changed to a more generic if BeginTime > Duration // Need to investigate, though SL checking seems to be very selective if (duration->HasTimeSpan () && duration->GetTimeSpan () == 0 && this->GetBeginTime () > 0) return false; return true; }
Duration ParallelTimeline::GetNaturalDurationCore (Clock *clock) { TimelineCollection *collection = GetChildren (); Duration d = Duration::Automatic; TimeSpan duration_span = 0; Timeline *timeline; int count = collection->GetCount (); if (count == 0) return Duration::FromSeconds (0); for (int i = 0; i < count; i++) { timeline = collection->GetValueAt (i)->AsTimeline (); Duration duration = timeline->GetNaturalDuration (clock); if (duration.IsAutomatic()) continue; if (duration.IsForever()) return Duration::Forever; TimeSpan span = duration.GetTimeSpan (); RepeatBehavior *repeat = timeline->GetRepeatBehavior (); if (repeat->IsForever()) return Duration::Forever; if (repeat->HasCount ()) span = (TimeSpan) (span * repeat->GetCount ()); if (timeline->GetAutoReverse ()) span *= 2; // If we have duration-base repeat behavior, // clamp/up our span to that. if (repeat->HasDuration ()) span = repeat->GetDuration (); if (span != 0) span = (TimeSpan)(span / timeline->GetSpeedRatio()); span += timeline->GetBeginTime (); if (duration_span <= span) { duration_span = span; d = Duration (duration_span); } } return d; }