]> git.eshelyaron.com Git - emacs.git/commitdiff
Speed up animation of non-displayed images
authorLars Ingebrigtsen <larsi@gnus.org>
Mon, 3 May 2021 09:45:22 +0000 (11:45 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 3 May 2021 09:45:22 +0000 (11:45 +0200)
* 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).

lisp/image.el

index 610d020aab5173358b60fe36312a25f201653a7e..5e84536b669a2ee93b983c88598b813c3364331c 100644 (file)
@@ -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)
+                                         :animate-multi-frame-data)))))))
   (plist-put (cdr image) :index n)
   (force-window-update))
 
@@ -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)
-                                    image-default-frame-delay)
-                                (float (abs speed))))
+          (stated-delay-time
+            (/ (or (cdr (plist-get (cdr image) :animate-multi-frame-data))
+                  image-default-frame-delay)
+              (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