From: Michal Srb Date: Tue, 23 Oct 2018 07:10:25 +0000 (+0200) Subject: throbber: Don't skip last frame when waiting for end. X-Git-Tag: 0.9.4~1^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=121783eff1759f6089863ec4d3e722e94fe73cdb;p=thirdparty%2Fplymouth.git 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). --- 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);