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 Clock::GetNaturalDuration () { if (!calculated_natural_duration) { calculated_natural_duration = true; Duration *duration = timeline->GetDuration (); if (duration->HasTimeSpan ()) { natural_duration = *duration; } else { natural_duration = timeline->GetNaturalDuration (this); } } return natural_duration; }