Commit 9ec81c5a authored by Lars Ingebrigtsen's avatar Lars Ingebrigtsen

Add an animation sanity check

* lisp/image.el (image-multi-frame-p): Give up on animations
if it seems like they are too slow (bug#23431).
parent 3a788d7a
...@@ -731,7 +731,7 @@ number, play until that number of seconds has elapsed." ...@@ -731,7 +731,7 @@ number, play until that number of seconds has elapsed."
(plist-put (cdr image) :animate-buffer (current-buffer)) (plist-put (cdr image) :animate-buffer (current-buffer))
(run-with-timer 0.2 nil 'image-animate-timeout (run-with-timer 0.2 nil 'image-animate-timeout
image (or index 0) (car animation) image (or index 0) (car animation)
0 limit)))) 0 limit (+ (float-time) 0.2)))))
(defun image-animate-timer (image) (defun image-animate-timer (image)
"Return the animation timer for image IMAGE." "Return the animation timer for image IMAGE."
...@@ -780,7 +780,7 @@ multiplication factor for the current value." ...@@ -780,7 +780,7 @@ multiplication factor for the current value."
;; hence we need to call image-multi-frame-p to return it. ;; hence we need to call image-multi-frame-p to return it.
;; But it also returns count, so why do we bother passing that as an ;; But it also returns count, so why do we bother passing that as an
;; argument? ;; argument?
(defun image-animate-timeout (image n count time-elapsed limit) (defun image-animate-timeout (image n count time-elapsed limit target-time)
"Display animation frame N of IMAGE. "Display animation frame N of IMAGE.
N=0 refers to the initial animation frame. N=0 refers to the initial animation frame.
COUNT is the total number of frames in the animation. COUNT is the total number of frames in the animation.
...@@ -793,7 +793,11 @@ The minimum delay between successive frames is `image-minimum-frame-delay'. ...@@ -793,7 +793,11 @@ The minimum delay between successive frames is `image-minimum-frame-delay'.
If the image has a non-nil :speed property, it acts as a multiplier If the image has a non-nil :speed property, it acts as a multiplier
for the animation speed. A negative value means to animate in reverse." for the animation speed. A negative value means to animate in reverse."
(when (buffer-live-p (plist-get (cdr image) :animate-buffer)) (when (and (buffer-live-p (plist-get (cdr image) :animate-buffer))
;; Delayed more than two seconds more than expected.
(when (> (- (float-time) target-time) 2)
(message "Stopping animation; animation possibly too big")
nil))
(image-show-frame image n t) (image-show-frame image n t)
(let* ((speed (image-animate-get-speed image)) (let* ((speed (image-animate-get-speed image))
(time (float-time)) (time (float-time))
...@@ -817,7 +821,8 @@ for the animation speed. A negative value means to animate in reverse." ...@@ -817,7 +821,8 @@ for the animation speed. A negative value means to animate in reverse."
(setq done (>= time-elapsed limit))) (setq done (>= time-elapsed limit)))
(unless done (unless done
(run-with-timer delay nil 'image-animate-timeout (run-with-timer delay nil 'image-animate-timeout
image n count time-elapsed limit))))) image n count time-elapsed limit
(+ (float-time) delay))))))
(defvar imagemagick-types-inhibit) (defvar imagemagick-types-inhibit)
......
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