forked from AuroraMiddleware/gtk
GtkTimeline: Wrap around the progress correctly when looping
When we have a looping animation for something like an angle, we need to make sure that the distance we go past 1.0 becomes the starting distance for the next frame. This prevents a stutter at the loop position. https://bugzilla.gnome.org/show_bug.cgi?id=685460
This commit is contained in:
parent
215d029c83
commit
672100b822
@ -357,7 +357,7 @@ gtk_timeline_on_update (GdkFrameClock *clock,
|
|||||||
GtkTimeline *timeline)
|
GtkTimeline *timeline)
|
||||||
{
|
{
|
||||||
GtkTimelinePriv *priv;
|
GtkTimelinePriv *priv;
|
||||||
gdouble delta_progress, progress;
|
gdouble delta_progress, progress, adjust;
|
||||||
guint64 now;
|
guint64 now;
|
||||||
|
|
||||||
/* the user may unref us during the signals, so save ourselves */
|
/* the user may unref us during the signals, so save ourselves */
|
||||||
@ -381,6 +381,21 @@ gtk_timeline_on_update (GdkFrameClock *clock,
|
|||||||
|
|
||||||
priv->last_progress = progress;
|
priv->last_progress = progress;
|
||||||
|
|
||||||
|
/* When looping, if we go past the end, start that much into the
|
||||||
|
* next cycle */
|
||||||
|
if (progress < 0.0)
|
||||||
|
{
|
||||||
|
adjust = progress - ceil(progress);
|
||||||
|
progress = 0.0;
|
||||||
|
}
|
||||||
|
else if (progress > 1.0)
|
||||||
|
{
|
||||||
|
adjust = progress - floor(progress);
|
||||||
|
progress = 1.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
adjust = 0.0;
|
||||||
|
|
||||||
progress = CLAMP (progress, 0., 1.);
|
progress = CLAMP (progress, 0., 1.);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -398,7 +413,10 @@ gtk_timeline_on_update (GdkFrameClock *clock,
|
|||||||
loop = priv->loop && priv->animations_enabled;
|
loop = priv->loop && priv->animations_enabled;
|
||||||
|
|
||||||
if (loop)
|
if (loop)
|
||||||
gtk_timeline_rewind (timeline);
|
{
|
||||||
|
gtk_timeline_rewind (timeline);
|
||||||
|
priv->progress += adjust;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gtk_timeline_stop_running (timeline);
|
gtk_timeline_stop_running (timeline);
|
||||||
|
Loading…
Reference in New Issue
Block a user