]> code.delx.au - gnu-emacs/commitdiff
Generalize "animated" images to "multi-frame" images
authorGlenn Morris <rgm@gnu.org>
Sat, 16 Feb 2013 19:56:50 +0000 (11:56 -0800)
committerGlenn Morris <rgm@gnu.org>
Sat, 16 Feb 2013 19:56:50 +0000 (11:56 -0800)
* lisp/image.el (image-animated-types): Remove.
(image-multi-frame-p): Rename from image-animated-p, and generalize.
(image-animated-p): Make obsolete alias.
(image-animate, image-nth-frame, image-animate-timeout):
Use image-multi-frame-p.
(image-animate-timeout): If no delay, use image-default-frame-delay.

* lisp/image-mode.el (image-mode, image-toggle-animation):
Use image-multi-frame-p.
(image-mode): Adjust startup message for a multi-frame image.

* lisp/gnus/shr.el (shr-put-image): Only animate images that specify a delay.
This is consistent with the old image-animated-p behavior.

* etc/NEWS: Add placeholder for this.

Fixes: debbugs:10739
etc/NEWS
lisp/ChangeLog
lisp/gnus/ChangeLog
lisp/gnus/shr.el
lisp/image-mode.el
lisp/image.el

index 62d84a0788d51ca97dd956498a0d9b3eb42e08a0..2eda7a5c77559c2190f08f34f8c60816baecc8fd 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -145,6 +145,8 @@ directory, respectively.
 `f' (`image-next-frame') and `b' (`image-previous-frame') visit the
 next or previous frame.  `F' (`image-goto-frame') shows a specific frame.
 
+*** `image-animated-p' is now `image-multi-frame-p'.
+
 ---
 *** The command `image-mode-fit-frame' deletes other windows.
 When toggling, it restores the frame's previous window configuration.
index 17ecbd8bf313be207e1a30446a688236508f1c24..66c18a25803ad35093e86182e1e648498058b061 100644 (file)
@@ -1,5 +1,15 @@
 2013-02-16  Glenn Morris  <rgm@gnu.org>
 
+       * image.el (image-animated-types): Remove.
+       (image-multi-frame-p): Rename from image-animated-p, and generalize.
+       (image-animated-p): Make obsolete alias.
+       (image-animate, image-nth-frame, image-animate-timeout):
+       Use image-multi-frame-p.
+       (image-animate-timeout): If no delay, use image-default-frame-delay.
+       * image-mode.el (image-mode, image-toggle-animation):
+       Use image-multi-frame-p.  (Bug#763, bug#10739)
+       (image-mode): Adjust startup message for a multi-frame image.
+
        * image-mode.el (image-mode-map): Give it a menu.
 
 2013-02-16  Michael Albinus  <michael.albinus@gmx.de>
index b6e8fd976d3d50b03905cb86443db7342fdd6b68..5030da876727c9796deb2b1c23b9c72288249fb0 100644 (file)
@@ -1,3 +1,8 @@
+2013-02-16  Glenn Morris  <rgm@gnu.org>
+
+       * shr.el (shr-put-image): Only animate images that specify a delay.
+       This is consistent with the old image-animated-p behavior.
+
 2013-02-14  Katsumi Yamaoka  <yamaoka@jpl.org>
 
        * gnus-util.el (gnus-define-keys): Convert [?\S-\ ] to [(shift space)]
index c9bf324b4faa4420384833b5d3353c1ed3ad78e4..1294ca7cd69a3137e5cbc2de24680d40b6243dea 100644 (file)
@@ -615,7 +615,8 @@ size, and full-buffer size."
                  (overlay-put overlay 'face 'default)))
            (insert-image image (or alt "*")))
          (put-text-property start (point) 'image-size size)
-         (when (image-animated-p image)
+         ;; Only animate multi-frame things that specify a delay.  FIXME?
+         (when (cdr (image-animated-p image))
            (image-animate image nil 60)))
        image)
     (insert alt)))
index b6298adeb7ed5ae093c0ea845e362aa280cfb872..52367811341d0ea52dfc997c23e7ff3a46839cf6 100644 (file)
@@ -464,7 +464,7 @@ to toggle between display as an image and display as text."
          (cond
           ((null image)
            (message "%s" (concat msg1 "an image.")))
-          ((setq animated (image-animated-p image))
+          ((setq animated (image-multi-frame-p image))
            (setq image-current-frame (or (plist-get (cdr image) :index) 0)
                  mode-line-process
                  `(:eval (propertize (format " [%s/%s]"
@@ -472,9 +472,9 @@ to toggle between display as an image and display as text."
                                              ,(car animated))
                                      'help-echo "Frame number")))
            (message "%s"
-                    (concat msg1 "text, or "
-                            (substitute-command-keys
-                             "\\[image-toggle-animation] to animate."))))
+                    (concat msg1 "text.  This image has multiple frames.")))
+;;;                         (substitute-command-keys
+;;;                          "\\[image-toggle-animation] to animate."))))
           (t
            (message "%s" (concat msg1 "text."))))))
 
@@ -663,7 +663,7 @@ Otherwise it plays once, then stops."
     (cond
      ((null image)
       (error "No image is present"))
-     ((null (setq animation (image-animated-p image)))
+     ((null (setq animation (image-multi-frame-p image)))
       (message "No image animation."))
      (t
       (let ((timer (image-animate-timer image)))
index 22c6bdf420733c2180c93462e5c48b584d14eda9..b91d136443d5280242af4d60cb3e94c05f3bdc2d 100644 (file)
@@ -606,29 +606,25 @@ Example:
 \f
 ;;; Animated image API
 
-(defconst image-animated-types '(gif)
-  "List of supported animated image types.")
-
 (defvar image-default-frame-delay 0.1
   "Default interval in seconds between frames of a multi-frame image.
 Only used if the image does not specify a value.")
 
-(defun image-animated-p (image)
-  "Return non-nil if IMAGE can be animated.
-To be capable of being animated, an image must be of a type
-listed in `image-animated-types', and contain more than one
-sub-image, with a specified animation delay.  The actual return
-value is a cons (NIMAGES . DELAY), where NIMAGES is the number
-of sub-images in the animated image and DELAY is the delay in
-seconds until the next sub-image should be displayed."
-  (cond
-   ((memq (plist-get (cdr image) :type) image-animated-types)
-    (let* ((metadata (image-metadata image))
-          (images (plist-get metadata 'count))
-          (delay (plist-get metadata 'delay)))
-      (when (and images (> images 1) (numberp delay))
-       (if (< delay 0) (setq delay image-default-frame-delay))
-       (cons images delay))))))
+(defun image-multi-frame-p (image)
+  "Return non-nil if IMAGE contains more than one frame.
+The actual return value is a cons (NIMAGES . DELAY), where NIMAGES is
+the number of frames (or sub-images) in the image and DELAY is the delay
+in seconds that the image specifies between each frame.  DELAY may be nil,
+in which case you might want to use `image-default-frame-delay'."
+  (let* ((metadata (image-metadata image))
+        (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))
+      (cons images delay))))
+
+(define-obsolete-function-alias 'image-animated-p 'image-multi-frame-p "24.4")
 
 ;; "Destructively"?
 (defun image-animate (image &optional index limit)
@@ -639,7 +635,7 @@ With optional INDEX, begin animating from that animation frame.
 LIMIT specifies how long to animate the image.  If omitted or
 nil, play the animation until the end.  If t, loop forever.  If a
 number, play until that number of seconds has elapsed."
-  (let ((animation (image-animated-p image))
+  (let ((animation (image-multi-frame-p image))
        timer)
     (when animation
       (if (setq timer (image-animate-timer image))
@@ -673,13 +669,13 @@ 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-animated-p image)))))))
+      (setq n (min n (1- (car (image-multi-frame-p image)))))))
   (plist-put (cdr image) :index n)
   (setq image-current-frame n)
   (force-window-update))
 
 ;; FIXME? The delay may not be the same for different sub-images,
-;; hence we need to call image-animated-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
 ;; argument?
 (defun image-animate-timeout (image n count time-elapsed limit)
@@ -695,10 +691,11 @@ The minimum delay between successive frames is `image-minimum-frame-delay'."
   (image-nth-frame image n t)
   (setq n (1+ n))
   (let* ((time (float-time))
-        (animation (image-animated-p image))
+        (animation (image-multi-frame-p image))
         ;; Subtract off the time we took to load the image from the
         ;; stated delay time.
-        (delay (max (+ (cdr animation) time (- (float-time)))
+        (delay (max (+ (or (cdr animation) image-default-frame-delay)
+                       time (- (float-time)))
                     image-minimum-frame-delay))
         done)
     (if (>= n count)