]> code.delx.au - gnu-emacs/commitdiff
Add an animation sanity check
authorLars Ingebrigtsen <larsi@gnus.org>
Tue, 3 May 2016 23:37:01 +0000 (01:37 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Tue, 3 May 2016 23:37:01 +0000 (01:37 +0200)
* lisp/image.el (image-multi-frame-p): Give up on animations
if it seems like they are too slow (bug#23431).

lisp/image.el

index 2ae642a3e32b276adc32ba2eb1c67eadaa96169e..57cfc4e706293f5b3efa88117042c5cafd1a34c9 100644 (file)
@@ -731,7 +731,7 @@ number, play until that number of seconds has elapsed."
       (plist-put (cdr image) :animate-buffer (current-buffer))
       (run-with-timer 0.2 nil 'image-animate-timeout
                      image (or index 0) (car animation)
-                     0 limit))))
+                     0 limit (+ (float-time) 0.2)))))
 
 (defun image-animate-timer (image)
   "Return the animation timer for image IMAGE."
@@ -780,7 +780,7 @@ multiplication factor for the current value."
 ;; 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
 ;; 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.
 N=0 refers to the initial animation frame.
 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'.
 
 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."
-  (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)
     (let* ((speed (image-animate-get-speed image))
           (time (float-time))
@@ -817,7 +821,8 @@ for the animation speed.  A negative value means to animate in reverse."
          (setq done (>= time-elapsed limit)))
       (unless done
        (run-with-timer delay nil 'image-animate-timeout
-                       image n count time-elapsed limit)))))
+                       image n count time-elapsed limit
+                        (+ (float-time) delay))))))
 
 \f
 (defvar imagemagick-types-inhibit)