]> git.eshelyaron.com Git - emacs.git/commitdiff
Use a new method to determine when to auto-stop image animations
authorLars Ingebrigtsen <larsi@gnus.org>
Wed, 29 Jul 2020 06:38:52 +0000 (08:38 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 29 Jul 2020 06:38:52 +0000 (08:38 +0200)
* lisp/image.el (image-animate-timeout): Make the animation
auto-stop use a decaying average to determine when to stop
(bug#40685).  The default stop condition will probably require
some tweaking -- the current default may be too aggressive.

etc/NEWS
lisp/image.el

index 4c77162a2560d06df84879523a48c74e486f198d..e4d9887480bb8a62536a89585340cf2df31b1339 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -490,6 +490,15 @@ more readable text.  Set this variable to nil to get the previous
 behavior of rendering as wide as the window-width allows.  If
 'shr-width' is non-nil, it overrides this variable.
 
+** Images
+
+---
+*** Animated images stop automatically under high CPU pressure sooner.
+Previously, an animated image would stop animating if any single image
+took more than two seconds to display.  The new algorithm maintains a
+decaying average of delays, and if this number gets too high, the
+animation is stopped.
+
 ** EWW
 
 +++
index 4ea8594a9748cd6ed3d1f128c4124a861cb6cc6b..4b2faa992fccf2924c84fe3621256d46cd995643 100644 (file)
@@ -784,6 +784,7 @@ number, play until that number of seconds has elapsed."
       (if (setq timer (image-animate-timer image))
          (cancel-timer timer))
       (plist-put (cdr image) :animate-buffer (current-buffer))
+      (plist-put (cdr image) :animate-tardiness 0)
       (run-with-timer 0.2 nil #'image-animate-timeout
                      image (or index 0) (car animation)
                      0 limit (+ (float-time) 0.2)))))
@@ -848,9 +849,14 @@ 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."
+  ;; We keep track of "how late" image frames arrive.  We decay the
+  ;; previous cumulative value by 10% and then add the current delay.
+  (plist-put (cdr image) :animate-tardiness
+             (+ (* (plist-get (cdr image) :animate-tardiness) 0.9)
+                (float-time (time-since target-time))))
   (when (and (buffer-live-p (plist-get (cdr image) :animate-buffer))
-             ;; Delayed more than two seconds more than expected.
-            (or (time-less-p (time-since target-time) 2)
+             ;; Cumulatively delayed two seconds more than expected.
+             (or (< (plist-get (cdr image) :animate-tardiness) 2)
                 (progn
                   (message "Stopping animation; animation possibly too big")
                   nil)))