From 121783eff1759f6089863ec4d3e722e94fe73cdb Mon Sep 17 00:00:00 2001 From: Michal Srb Date: Tue, 23 Oct 2018 09:10:25 +0200 Subject: [PATCH] throbber: Don't skip last frame when waiting for end. If the stop_trigger is set and we are waiting for the last frame to stop the animation, make sure we don't accidentally skip the last frame. It could happen if the machine is busy and can't keep up with the frames or when the animation has more than 60 frames (30FPS * 2 seconds). --- src/libply-splash-graphics/ply-throbber.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/libply-splash-graphics/ply-throbber.c b/src/libply-splash-graphics/ply-throbber.c index f18feb61..a4311fda 100644 --- a/src/libply-splash-graphics/ply-throbber.c +++ b/src/libply-splash-graphics/ply-throbber.c @@ -144,6 +144,7 @@ animate_at_time (ply_throbber_t *throbber, ply_pixel_buffer_t *const *frames; bool should_continue; double percent_in_sequence; + int last_frame_number; number_of_frames = ply_array_get_size (throbber->frames); @@ -152,11 +153,19 @@ animate_at_time (ply_throbber_t *throbber, should_continue = true; percent_in_sequence = fmod (time, THROBBER_DURATION) / THROBBER_DURATION; + last_frame_number = throbber->frame_number; throbber->frame_number = (int) (number_of_frames * percent_in_sequence); - if (throbber->stop_trigger != NULL) + if (throbber->stop_trigger != NULL) { + /* If we are trying to stop, make sure we don't skip the last + * frame and loop around. Clamp it to the last frame. + */ + if (last_frame_number > throbber->frame_number) + throbber->frame_number = number_of_frames - 1; + if (throbber->frame_number == number_of_frames - 1) should_continue = false; + } frames = (ply_pixel_buffer_t *const *) ply_array_get_pointer_elements (throbber->frames); ply_pixel_buffer_get_size (frames[throbber->frame_number], &throbber->frame_area); -- 2.47.3