]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
throbber: Don't skip last frame when waiting for end.
authorMichal Srb <msrb@suse.com>
Tue, 23 Oct 2018 07:10:25 +0000 (09:10 +0200)
committerMichal Srb <msrb@suse.com>
Fri, 26 Oct 2018 07:02:04 +0000 (09:02 +0200)
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

index f18feb612352e3ca5813e182bdba2e53051f6387..a4311fdab859141a0cc7a30c9e541f62ff2b7244 100644 (file)
@@ -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);