emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 19c98f7 2/2: Default exotic image formats (like .webp) to image-m


From: Lars Ingebrigtsen
Subject: master 19c98f7 2/2: Default exotic image formats (like .webp) to image-mode
Date: Tue, 29 Oct 2019 16:42:48 -0400 (EDT)

branch: master
commit 19c98f762092adab01bf35d4b0c958af7d4ea59e
Author: Lars Ingebrigtsen <address@hidden>
Commit: Lars Ingebrigtsen <address@hidden>

    Default exotic image formats (like .webp) to image-mode
    
    * doc/lispref/errors.texi (Standard Errors): Mention the new error.
    
    * lisp/files.el (auto-mode-alist): Add a bunch of image suffixes
    to the list (bug#37972) based on the output from "gm convert -list
    format" (i.e., graphicsmagick).
    
    * lisp/image-mode.el (image-mode): Rewrite to possibly notify the
    user about image-use-external-converter.
    (image-mode--setup-mode): Factor out into own function and don't
    run under `condition-case' as there's nothing here that should
    error.
    
    * lisp/image.el (unknown-image-type): New error.
    (image-type): Signal that error so that image-mode can offer
    sensible feedback to the user.
---
 doc/lispref/errors.texi |   3 +
 etc/NEWS                |   8 ++-
 lisp/files.el           |  46 +++++++++++++++-
 lisp/image-mode.el      | 144 +++++++++++++++++++++++++-----------------------
 lisp/image.el           |   4 +-
 5 files changed, 132 insertions(+), 73 deletions(-)

diff --git a/doc/lispref/errors.texi b/doc/lispref/errors.texi
index 45e7acb..cf9b67c 100644
--- a/doc/lispref/errors.texi
+++ b/doc/lispref/errors.texi
@@ -215,6 +215,9 @@ The message is @samp{Wrong number of arguments}.  
@xref{Argument List}.
 
 @item wrong-type-argument
 The message is @samp{Wrong type argument}.  @xref{Type Predicates}.
+
+@item unknown-image-type
+The message is @samp{Cannot determine image type}.  @xref{Images}.
 @end table
 
 @ignore    The following seem to be unused now.
diff --git a/etc/NEWS b/etc/NEWS
index bfcb7cf..5e412f2 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2933,6 +2933,9 @@ data about creation times and orientation and the like.
 'exif-parse-file' and 'exif-parse-buffer' are the main interface
 functions.
 
+*** 'image-mode' now uses this library to automatically rotate images
+according to the orientation in the Exif data, if any.
+
 *** New library image-converter.
 If you need to view exotic image formats for which Emacs doesn't have
 native support, customize the new user option
@@ -2940,8 +2943,9 @@ native support, customize the new user option
 GraphicsMagick, ImageMagick or 'ffmpeg' installed, they will then be
 used to convert images automatically before displaying them.
 
-*** 'image-mode' now uses this library to automatically rotate images
-according to the orientation in the Exif data, if any.
+*** 'auto-mode-alist' now includes many of the types typically
+supported by the external image converters, like WEPB, BMP and ICO.
+These now default to using 'image-mode'.
 
 *** 'imagemagick-types-inhibit' disables using ImageMagick by default.
 'image-mode' started using ImageMagick by default for all images
diff --git a/lisp/files.el b/lisp/files.el
index 4b364b4..f6dc4ba 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -2847,7 +2847,51 @@ 
ARC\\|ZIP\\|LZH\\|LHA\\|ZOO\\|[JEW]AR\\|XPI\\|RAR\\|CBR\\|7Z\\)\\'" . archive-mo
      ;; The following should come after the ChangeLog pattern
      ;; for the sake of ChangeLog.1, etc.
      ;; and after the .scm.[0-9] and CVS' <file>.<rev> patterns too.
-     ("\\.[1-9]\\'" . nroff-mode)))
+     ("\\.[1-9]\\'" . nroff-mode)
+     ;; Image file types probably supported by `image-convert'.
+     ("\\.art\\'" . image-mode)
+     ("\\.avs\\'" . image-mode)
+     ("\\.bmp\\'" . image-mode)
+     ("\\.cmyk\\'" . image-mode)
+     ("\\.cmyka\\'" . image-mode)
+     ("\\.crw\\'" . image-mode)
+     ("\\.dcr\\'" . image-mode)
+     ("\\.dcx\\'" . image-mode)
+     ("\\.dng\\'" . image-mode)
+     ("\\.dpx\\'" . image-mode)
+     ("\\.fax\\'" . image-mode)
+     ("\\.hrz\\'" . image-mode)
+     ("\\.icb\\'" . image-mode)
+     ("\\.icc\\'" . image-mode)
+     ("\\.icm\\'" . image-mode)
+     ("\\.ico\\'" . image-mode)
+     ("\\.icon\\'" . image-mode)
+     ("\\.jbg\\'" . image-mode)
+     ("\\.jbig\\'" . image-mode)
+     ("\\.jng\\'" . image-mode)
+     ("\\.jnx\\'" . image-mode)
+     ("\\.miff\\'" . image-mode)
+     ("\\.mng\\'" . image-mode)
+     ("\\.mvg\\'" . image-mode)
+     ("\\.otb\\'" . image-mode)
+     ("\\.p7\\'" . image-mode)
+     ("\\.pcx\\'" . image-mode)
+     ("\\.pdb\\'" . image-mode)
+     ("\\.pfa\\'" . image-mode)
+     ("\\.pfb\\'" . image-mode)
+     ("\\.picon\\'" . image-mode)
+     ("\\.pict\\'" . image-mode)
+     ("\\.rgb\\'" . image-mode)
+     ("\\.rgba\\'" . image-mode)
+     ("\\.tga\\'" . image-mode)
+     ("\\.wbmp\\'" . image-mode)
+     ("\\.webp\\'" . image-mode)
+     ("\\.wmf\\'" . image-mode)
+     ("\\.wpg\\'" . image-mode)
+     ("\\.xcf\\'" . image-mode)
+     ("\\.xmp\\'" . image-mode)
+     ("\\.xwd\\'" . image-mode)
+     ("\\.yuv\\'" . image-mode)))
   "Alist of filename patterns vs corresponding major mode functions.
 Each element looks like (REGEXP . FUNCTION) or (REGEXP FUNCTION NON-NIL).
 \(NON-NIL stands for anything that is not nil; the value does not matter.)
diff --git a/lisp/image-mode.el b/lisp/image-mode.el
index 3421025..db68646 100644
--- a/lisp/image-mode.el
+++ b/lisp/image-mode.el
@@ -552,76 +552,82 @@ to toggle between display as an image and display as text 
or hex.
 Key bindings:
 \\{image-mode-map}"
   (interactive)
-  (condition-case err
+  (unless (display-images-p)
+    (error "Display does not support images"))
+
+  (major-mode-suspend)
+  (setq major-mode 'image-mode)
+
+  (if (not (image-get-display-property))
       (progn
-       (unless (display-images-p)
-         (error "Display does not support images"))
-
-        (major-mode-suspend)
-       (setq major-mode 'image-mode)
-
-       (if (not (image-get-display-property))
-           (progn
-             (image-toggle-display-image)
-             ;; If attempt to display the image fails.
-             (if (not (image-get-display-property))
-                 (error "Invalid image")))
-         ;; Set next vars when image is already displayed but local
-         ;; variables were cleared by kill-all-local-variables
-         (setq cursor-type nil truncate-lines t
-               image-type (plist-get (cdr (image-get-display-property)) 
:type)))
-
-       (setq mode-name (if image-type (format "Image[%s]" image-type) "Image"))
-       (use-local-map image-mode-map)
-
-       ;; Use our own bookmarking function for images.
-       (setq-local bookmark-make-record-function
-                    #'image-bookmark-make-record)
-
-       ;; Keep track of [vh]scroll when switching buffers
-       (image-mode-setup-winprops)
-
-       (add-hook 'change-major-mode-hook #'image-toggle-display-text nil t)
-       (add-hook 'after-revert-hook #'image-after-revert-hook nil t)
-       (run-mode-hooks 'image-mode-hook)
-       (let ((image (image-get-display-property))
-             (msg1 (substitute-command-keys
-             "Type \\[image-toggle-display] or \\[image-toggle-hex-display] to 
view the image as "))
-             animated)
-         (cond
-          ((null image)
-           (message "%s" (concat msg1 "an image.")))
-          ((setq animated (image-multi-frame-p image))
-           (setq image-multi-frame t
-                 mode-line-process
-                 `(:eval
-                   (concat " "
-                           (propertize
-                            (format "[%s/%s]"
-                                    (1+ (image-current-frame ',image))
-                                    ,(car animated))
-                            'help-echo "Frames
-mouse-1: Next frame
-mouse-3: Previous frame"
-                            'mouse-face 'mode-line-highlight
-                            'local-map
-                            '(keymap
-                              (mode-line
-                               keymap
-                               (down-mouse-1 . image-next-frame)
-                               (down-mouse-3 . image-previous-frame)))))))
-           (message "%s"
-                    (concat msg1 "text.  This image has multiple frames.")))
-;;;                         (substitute-command-keys
-;;;                          "\\[image-toggle-animation] to animate."))))
-          (t
-        (message "%s" (concat msg1 "text or hex."))))))
-
-    (error
-     (image-mode-as-text)
-     (funcall
-      (if (called-interactively-p 'any) 'error 'message)
-      "Cannot display image: %s" (cdr err)))))
+        (when (condition-case err
+                (progn
+                 (image-toggle-display-image)
+                  t)
+              (unknown-image-type
+               (image-mode-as-text)
+               (funcall
+                (if (called-interactively-p 'any) 'error 'message)
+                "Unknown image type; consider switching 
`image-use-external-converter' on")
+               nil)
+              (error
+               (image-mode-as-text)
+               (funcall
+                (if (called-interactively-p 'any) 'error 'message)
+                "Cannot display image: %s" (cdr err))
+               nil))
+         ;; If attempt to display the image fails.
+         (if (not (image-get-display-property))
+             (error "Invalid image"))
+          (image-mode--setup-mode)))
+    ;; Set next vars when image is already displayed but local
+    ;; variables were cleared by kill-all-local-variables
+    (setq cursor-type nil truncate-lines t
+         image-type (plist-get (cdr (image-get-display-property)) :type))
+    (image-mode--setup-mode)))
+
+(defun image-mode--setup-mode ()
+  (setq mode-name (if image-type (format "Image[%s]" image-type) "Image"))
+  (use-local-map image-mode-map)
+
+  ;; Use our own bookmarking function for images.
+  (setq-local bookmark-make-record-function
+              #'image-bookmark-make-record)
+
+  ;; Keep track of [vh]scroll when switching buffers
+  (image-mode-setup-winprops)
+
+  (add-hook 'change-major-mode-hook #'image-toggle-display-text nil t)
+  (add-hook 'after-revert-hook #'image-after-revert-hook nil t)
+  (run-mode-hooks 'image-mode-hook)
+  (let ((image (image-get-display-property))
+       (msg1 (substitute-command-keys
+               "Type \\[image-toggle-display] or \\[image-toggle-hex-display] 
to view the image as "))
+       animated)
+    (cond
+     ((null image)
+      (message "%s" (concat msg1 "an image.")))
+     ((setq animated (image-multi-frame-p image))
+      (setq image-multi-frame t
+           mode-line-process
+           `(:eval
+             (concat " "
+                     (propertize
+                      (format "[%s/%s]"
+                              (1+ (image-current-frame ',image))
+                              ,(car animated))
+                      'help-echo "Frames\nmouse-1: Next frame\nmouse-3: 
Previous frame"
+                      'mouse-face 'mode-line-highlight
+                      'local-map
+                      '(keymap
+                        (mode-line
+                         keymap
+                         (down-mouse-1 . image-next-frame)
+                         (down-mouse-3 . image-previous-frame)))))))
+      (message "%s"
+              (concat msg1 "text.  This image has multiple frames.")))
+     (t
+      (message "%s" (concat msg1 "text or hex."))))))
 
 ;;;###autoload
 (define-minor-mode image-minor-mode
diff --git a/lisp/image.el b/lisp/image.el
index 66fb5fa..ad2ee6c 100644
--- a/lisp/image.el
+++ b/lisp/image.el
@@ -151,6 +151,8 @@ or \"ffmpeg\") is installed."
   :type 'boolean
   :version "27.1")
 
+(define-error 'unknown-image-type "Unknown image type")
+
 ;; Map put into text properties on images.
 (defvar image-map
   (let ((map (make-sparse-keymap)))
@@ -391,7 +393,7 @@ Optional DATA-P non-nil means SOURCE is a string containing 
image data."
                             (require 'image-converter)
                             (image-convert-p source))))))
     (unless type
-      (error "Cannot determine image type")))
+      (signal 'unknown-image-type "Cannot determine image type")))
   (when (and (not (eq type 'image-convert))
              (not (memq type (and (boundp 'image-types) image-types))))
     (error "Invalid image type `%s'" type))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]