]> code.delx.au - gnu-emacs/blobdiff - lisp/image.el
Fix Bug#22557
[gnu-emacs] / lisp / image.el
index 29cb06f0e03d908c11b1adaea3b3714d04d8b715..663afa7764ee2380db7b83b2d5c2351f429780db 100644 (file)
@@ -1,6 +1,6 @@
 ;;; image.el --- image API
 
-;; Copyright (C) 1998-2014 Free Software Foundation, Inc.
+;; Copyright (C) 1998-2016 Free Software Foundation, Inc.
 
 ;; Maintainer: emacs-devel@gnu.org
 ;; Keywords: multimedia
@@ -34,7 +34,7 @@
 
 (defconst image-type-header-regexps
   `(("\\`/[\t\n\r ]*\\*.*XPM.\\*/" . xpm)
-    ("\\`P[1-6]\\\(?:\
+    ("\\`P[1-6]\\(?:\
 \\(?:\\(?:#[^\r\n]*[\r\n]\\)?[[:space:]]\\)+\
 \\(?:\\(?:#[^\r\n]*[\r\n]\\)?[0-9]\\)+\
 \\)\\{2\\}" . pbm)
@@ -154,7 +154,7 @@ compatibility with versions of Emacs that lack the variable
 
     (let* ((load-path (image-load-path-for-library \"mh-e\" \"mh-logo.xpm\"))
            (image-load-path (cons (car load-path)
-                                  (when (boundp 'image-load-path)
+                                  (when (boundp \\='image-load-path)
                                     image-load-path))))
       (mh-tool-bar-folder-buttons-init))"
   (unless library (error "No library specified"))
@@ -357,7 +357,7 @@ Optional DATA-P non-nil means SOURCE is a string containing image data."
 
 (if (fboundp 'image-metadata)           ; eg not --without-x
     (define-obsolete-function-alias 'image-extension-data
-      'image-metadata' "24.1"))
+      'image-metadata "24.1"))
 
 (define-obsolete-variable-alias
     'image-library-alist
@@ -637,8 +637,8 @@ in which case you might want to use `image-default-frame-delay'."
           (images (plist-get metadata 'count))
           (delay (plist-get metadata 'delay)))
       (when (and images (> images 1))
-       (if (or (not (numberp delay)) (< delay 0))
-           (setq delay image-default-frame-delay))
+       (and delay (or (not (numberp delay)) (< delay 0))
+            (setq delay image-default-frame-delay))
        (cons images delay)))))
 
 (defun image-animated-p (image)
@@ -662,6 +662,7 @@ number, play until that number of seconds has elapsed."
     (when animation
       (if (setq timer (image-animate-timer image))
          (cancel-timer timer))
+      (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))))
@@ -726,30 +727,31 @@ 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."
-  (image-show-frame image n t)
-  (let* ((speed (image-animate-get-speed image))
-        (time (float-time))
-        (animation (image-multi-frame-p image))
-        ;; Subtract off the time we took to load the image from the
-        ;; stated delay time.
-        (delay (max (+ (* (or (cdr animation) image-default-frame-delay)
-                          (/ 1 (abs speed)))
-                       time (- (float-time)))
-                    image-minimum-frame-delay))
-        done)
-    (setq n (if (< speed 0)
-               (1- n)
-             (1+ n)))
-    (if limit
-       (cond ((>= n count) (setq n 0))
-             ((< n 0) (setq n (1- count))))
-      (and (or (>= n count) (< n 0)) (setq done t)))
-    (setq time-elapsed (+ delay time-elapsed))
-    (if (numberp limit)
-       (setq done (>= time-elapsed limit)))
-    (unless done
-      (run-with-timer delay nil 'image-animate-timeout
-                     image n count time-elapsed limit))))
+  (when (buffer-live-p (plist-get (cdr image) :animate-buffer))
+    (image-show-frame image n t)
+    (let* ((speed (image-animate-get-speed image))
+          (time (float-time))
+          (animation (image-multi-frame-p image))
+          ;; Subtract off the time we took to load the image from the
+          ;; stated delay time.
+          (delay (max (+ (* (or (cdr animation) image-default-frame-delay)
+                            (/ 1.0 (abs speed)))
+                         time (- (float-time)))
+                      image-minimum-frame-delay))
+          done)
+      (setq n (if (< speed 0)
+                 (1- n)
+               (1+ n)))
+      (if limit
+         (cond ((>= n count) (setq n 0))
+               ((< n 0) (setq n (1- count))))
+       (and (or (>= n count) (< n 0)) (setq done t)))
+      (setq time-elapsed (+ delay time-elapsed))
+      (if (numberp limit)
+         (setq done (>= time-elapsed limit)))
+      (unless done
+       (run-with-timer delay nil 'image-animate-timeout
+                       image n count time-elapsed limit)))))
 
 \f
 (defvar imagemagick-types-inhibit)