Commit 4aa4a8f9 authored by Lars Ingebrigtsen's avatar Lars Ingebrigtsen
Browse files

Speed up animation of non-displayed images

* lisp/image.el (image-animate): Only compute the animation data
once -- this avoids recomputing the image on every iteration when
the image is not displayed (bug#47895).
parent eddb00c5
Pipeline #10610 failed with stages
in 19 minutes and 46 seconds
......@@ -839,6 +839,9 @@ number, play until that number of seconds has elapsed."
(cancel-timer timer))
(plist-put (cdr image) :animate-buffer (current-buffer))
(plist-put (cdr image) :animate-tardiness 0)
;; Stash the data about the animation here so that we don't
;; trigger image recomputation unnecessarily later.
(plist-put (cdr image) :animate-multi-frame-data animation)
(run-with-timer 0.2 nil #'image-animate-timeout
image (or index 0) (car animation)
0 limit (+ (float-time) 0.2)))))
......@@ -869,7 +872,8 @@ Frames are indexed from 0. Optional argument NOCHECK non-nil means
do not check N is within the range of frames present in the image."
(unless nocheck
(if (< n 0) (setq n 0)
(setq n (min n (1- (car (image-multi-frame-p image)))))))
(setq n (min n (1- (car (plist-get (cdr image)
(plist-put (cdr image) :index n)
......@@ -917,11 +921,11 @@ for the animation speed. A negative value means to animate in reverse."
(image-show-frame image n t)
(let* ((speed (image-animate-get-speed image))
(time (current-time))
(animation (image-multi-frame-p image))
(time-to-load-image (time-since time))
(stated-delay-time (/ (or (cdr animation)
(float (abs speed))))
(/ (or (cdr (plist-get (cdr image) :animate-multi-frame-data))
(float (abs speed))))
;; Subtract off the time we took to load the image from the
;; stated delay time.
(delay (max (float-time (time-subtract stated-delay-time
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment