diff options
| author | Lars Ingebrigtsen | 2019-10-29 21:42:33 +0100 |
|---|---|---|
| committer | Lars Ingebrigtsen | 2019-10-29 21:42:39 +0100 |
| commit | 19c98f762092adab01bf35d4b0c958af7d4ea59e (patch) | |
| tree | 7740857748d7b0d916593181762f26db1719e62d | |
| parent | 1997e3b80f1046d789c4120d50e0f1dde05e7a74 (diff) | |
| download | emacs-19c98f762092adab01bf35d4b0c958af7d4ea59e.tar.gz emacs-19c98f762092adab01bf35d4b0c958af7d4ea59e.zip | |
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.
| -rw-r--r-- | doc/lispref/errors.texi | 3 | ||||
| -rw-r--r-- | etc/NEWS | 8 | ||||
| -rw-r--r-- | lisp/files.el | 46 | ||||
| -rw-r--r-- | lisp/image-mode.el | 144 | ||||
| -rw-r--r-- | lisp/image.el | 4 |
5 files changed, 132 insertions, 73 deletions
diff --git a/doc/lispref/errors.texi b/doc/lispref/errors.texi index 45e7acbaa6b..cf9b67c80d8 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}. | |||
| 215 | 215 | ||
| 216 | @item wrong-type-argument | 216 | @item wrong-type-argument |
| 217 | The message is @samp{Wrong type argument}. @xref{Type Predicates}. | 217 | The message is @samp{Wrong type argument}. @xref{Type Predicates}. |
| 218 | |||
| 219 | @item unknown-image-type | ||
| 220 | The message is @samp{Cannot determine image type}. @xref{Images}. | ||
| 218 | @end table | 221 | @end table |
| 219 | 222 | ||
| 220 | @ignore The following seem to be unused now. | 223 | @ignore The following seem to be unused now. |
| @@ -2933,6 +2933,9 @@ data about creation times and orientation and the like. | |||
| 2933 | 'exif-parse-file' and 'exif-parse-buffer' are the main interface | 2933 | 'exif-parse-file' and 'exif-parse-buffer' are the main interface |
| 2934 | functions. | 2934 | functions. |
| 2935 | 2935 | ||
| 2936 | *** 'image-mode' now uses this library to automatically rotate images | ||
| 2937 | according to the orientation in the Exif data, if any. | ||
| 2938 | |||
| 2936 | *** New library image-converter. | 2939 | *** New library image-converter. |
| 2937 | If you need to view exotic image formats for which Emacs doesn't have | 2940 | If you need to view exotic image formats for which Emacs doesn't have |
| 2938 | native support, customize the new user option | 2941 | native support, customize the new user option |
| @@ -2940,8 +2943,9 @@ native support, customize the new user option | |||
| 2940 | GraphicsMagick, ImageMagick or 'ffmpeg' installed, they will then be | 2943 | GraphicsMagick, ImageMagick or 'ffmpeg' installed, they will then be |
| 2941 | used to convert images automatically before displaying them. | 2944 | used to convert images automatically before displaying them. |
| 2942 | 2945 | ||
| 2943 | *** 'image-mode' now uses this library to automatically rotate images | 2946 | *** 'auto-mode-alist' now includes many of the types typically |
| 2944 | according to the orientation in the Exif data, if any. | 2947 | supported by the external image converters, like WEPB, BMP and ICO. |
| 2948 | These now default to using 'image-mode'. | ||
| 2945 | 2949 | ||
| 2946 | *** 'imagemagick-types-inhibit' disables using ImageMagick by default. | 2950 | *** 'imagemagick-types-inhibit' disables using ImageMagick by default. |
| 2947 | 'image-mode' started using ImageMagick by default for all images | 2951 | 'image-mode' started using ImageMagick by default for all images |
diff --git a/lisp/files.el b/lisp/files.el index 4b364b49d84..f6dc4baa7fb 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 | |||
| 2847 | ;; The following should come after the ChangeLog pattern | 2847 | ;; The following should come after the ChangeLog pattern |
| 2848 | ;; for the sake of ChangeLog.1, etc. | 2848 | ;; for the sake of ChangeLog.1, etc. |
| 2849 | ;; and after the .scm.[0-9] and CVS' <file>.<rev> patterns too. | 2849 | ;; and after the .scm.[0-9] and CVS' <file>.<rev> patterns too. |
| 2850 | ("\\.[1-9]\\'" . nroff-mode))) | 2850 | ("\\.[1-9]\\'" . nroff-mode) |
| 2851 | ;; Image file types probably supported by `image-convert'. | ||
| 2852 | ("\\.art\\'" . image-mode) | ||
| 2853 | ("\\.avs\\'" . image-mode) | ||
| 2854 | ("\\.bmp\\'" . image-mode) | ||
| 2855 | ("\\.cmyk\\'" . image-mode) | ||
| 2856 | ("\\.cmyka\\'" . image-mode) | ||
| 2857 | ("\\.crw\\'" . image-mode) | ||
| 2858 | ("\\.dcr\\'" . image-mode) | ||
| 2859 | ("\\.dcx\\'" . image-mode) | ||
| 2860 | ("\\.dng\\'" . image-mode) | ||
| 2861 | ("\\.dpx\\'" . image-mode) | ||
| 2862 | ("\\.fax\\'" . image-mode) | ||
| 2863 | ("\\.hrz\\'" . image-mode) | ||
| 2864 | ("\\.icb\\'" . image-mode) | ||
| 2865 | ("\\.icc\\'" . image-mode) | ||
| 2866 | ("\\.icm\\'" . image-mode) | ||
| 2867 | ("\\.ico\\'" . image-mode) | ||
| 2868 | ("\\.icon\\'" . image-mode) | ||
| 2869 | ("\\.jbg\\'" . image-mode) | ||
| 2870 | ("\\.jbig\\'" . image-mode) | ||
| 2871 | ("\\.jng\\'" . image-mode) | ||
| 2872 | ("\\.jnx\\'" . image-mode) | ||
| 2873 | ("\\.miff\\'" . image-mode) | ||
| 2874 | ("\\.mng\\'" . image-mode) | ||
| 2875 | ("\\.mvg\\'" . image-mode) | ||
| 2876 | ("\\.otb\\'" . image-mode) | ||
| 2877 | ("\\.p7\\'" . image-mode) | ||
| 2878 | ("\\.pcx\\'" . image-mode) | ||
| 2879 | ("\\.pdb\\'" . image-mode) | ||
| 2880 | ("\\.pfa\\'" . image-mode) | ||
| 2881 | ("\\.pfb\\'" . image-mode) | ||
| 2882 | ("\\.picon\\'" . image-mode) | ||
| 2883 | ("\\.pict\\'" . image-mode) | ||
| 2884 | ("\\.rgb\\'" . image-mode) | ||
| 2885 | ("\\.rgba\\'" . image-mode) | ||
| 2886 | ("\\.tga\\'" . image-mode) | ||
| 2887 | ("\\.wbmp\\'" . image-mode) | ||
| 2888 | ("\\.webp\\'" . image-mode) | ||
| 2889 | ("\\.wmf\\'" . image-mode) | ||
| 2890 | ("\\.wpg\\'" . image-mode) | ||
| 2891 | ("\\.xcf\\'" . image-mode) | ||
| 2892 | ("\\.xmp\\'" . image-mode) | ||
| 2893 | ("\\.xwd\\'" . image-mode) | ||
| 2894 | ("\\.yuv\\'" . image-mode))) | ||
| 2851 | "Alist of filename patterns vs corresponding major mode functions. | 2895 | "Alist of filename patterns vs corresponding major mode functions. |
| 2852 | Each element looks like (REGEXP . FUNCTION) or (REGEXP FUNCTION NON-NIL). | 2896 | Each element looks like (REGEXP . FUNCTION) or (REGEXP FUNCTION NON-NIL). |
| 2853 | \(NON-NIL stands for anything that is not nil; the value does not matter.) | 2897 | \(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 342102568ca..db6864649d0 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. | |||
| 552 | Key bindings: | 552 | Key bindings: |
| 553 | \\{image-mode-map}" | 553 | \\{image-mode-map}" |
| 554 | (interactive) | 554 | (interactive) |
| 555 | (condition-case err | 555 | (unless (display-images-p) |
| 556 | (error "Display does not support images")) | ||
| 557 | |||
| 558 | (major-mode-suspend) | ||
| 559 | (setq major-mode 'image-mode) | ||
| 560 | |||
| 561 | (if (not (image-get-display-property)) | ||
| 556 | (progn | 562 | (progn |
| 557 | (unless (display-images-p) | 563 | (when (condition-case err |
| 558 | (error "Display does not support images")) | 564 | (progn |
| 559 | 565 | (image-toggle-display-image) | |
| 560 | (major-mode-suspend) | 566 | t) |
| 561 | (setq major-mode 'image-mode) | 567 | (unknown-image-type |
| 562 | 568 | (image-mode-as-text) | |
| 563 | (if (not (image-get-display-property)) | 569 | (funcall |
| 564 | (progn | 570 | (if (called-interactively-p 'any) 'error 'message) |
| 565 | (image-toggle-display-image) | 571 | "Unknown image type; consider switching `image-use-external-converter' on") |
| 566 | ;; If attempt to display the image fails. | 572 | nil) |
| 567 | (if (not (image-get-display-property)) | 573 | (error |
| 568 | (error "Invalid image"))) | 574 | (image-mode-as-text) |
| 569 | ;; Set next vars when image is already displayed but local | 575 | (funcall |
| 570 | ;; variables were cleared by kill-all-local-variables | 576 | (if (called-interactively-p 'any) 'error 'message) |
| 571 | (setq cursor-type nil truncate-lines t | 577 | "Cannot display image: %s" (cdr err)) |
| 572 | image-type (plist-get (cdr (image-get-display-property)) :type))) | 578 | nil)) |
| 573 | 579 | ;; If attempt to display the image fails. | |
| 574 | (setq mode-name (if image-type (format "Image[%s]" image-type) "Image")) | 580 | (if (not (image-get-display-property)) |
| 575 | (use-local-map image-mode-map) | 581 | (error "Invalid image")) |
| 576 | 582 | (image-mode--setup-mode))) | |
| 577 | ;; Use our own bookmarking function for images. | 583 | ;; Set next vars when image is already displayed but local |
| 578 | (setq-local bookmark-make-record-function | 584 | ;; variables were cleared by kill-all-local-variables |
| 579 | #'image-bookmark-make-record) | 585 | (setq cursor-type nil truncate-lines t |
| 580 | 586 | image-type (plist-get (cdr (image-get-display-property)) :type)) | |
| 581 | ;; Keep track of [vh]scroll when switching buffers | 587 | (image-mode--setup-mode))) |
| 582 | (image-mode-setup-winprops) | 588 | |
| 583 | 589 | (defun image-mode--setup-mode () | |
| 584 | (add-hook 'change-major-mode-hook #'image-toggle-display-text nil t) | 590 | (setq mode-name (if image-type (format "Image[%s]" image-type) "Image")) |
| 585 | (add-hook 'after-revert-hook #'image-after-revert-hook nil t) | 591 | (use-local-map image-mode-map) |
| 586 | (run-mode-hooks 'image-mode-hook) | 592 | |
| 587 | (let ((image (image-get-display-property)) | 593 | ;; Use our own bookmarking function for images. |
| 588 | (msg1 (substitute-command-keys | 594 | (setq-local bookmark-make-record-function |
| 589 | "Type \\[image-toggle-display] or \\[image-toggle-hex-display] to view the image as ")) | 595 | #'image-bookmark-make-record) |
| 590 | animated) | 596 | |
| 591 | (cond | 597 | ;; Keep track of [vh]scroll when switching buffers |
| 592 | ((null image) | 598 | (image-mode-setup-winprops) |
| 593 | (message "%s" (concat msg1 "an image."))) | 599 | |
| 594 | ((setq animated (image-multi-frame-p image)) | 600 | (add-hook 'change-major-mode-hook #'image-toggle-display-text nil t) |
| 595 | (setq image-multi-frame t | 601 | (add-hook 'after-revert-hook #'image-after-revert-hook nil t) |
| 596 | mode-line-process | 602 | (run-mode-hooks 'image-mode-hook) |
| 597 | `(:eval | 603 | (let ((image (image-get-display-property)) |
| 598 | (concat " " | 604 | (msg1 (substitute-command-keys |
| 599 | (propertize | 605 | "Type \\[image-toggle-display] or \\[image-toggle-hex-display] to view the image as ")) |
| 600 | (format "[%s/%s]" | 606 | animated) |
| 601 | (1+ (image-current-frame ',image)) | 607 | (cond |
| 602 | ,(car animated)) | 608 | ((null image) |
| 603 | 'help-echo "Frames | 609 | (message "%s" (concat msg1 "an image."))) |
| 604 | mouse-1: Next frame | 610 | ((setq animated (image-multi-frame-p image)) |
| 605 | mouse-3: Previous frame" | 611 | (setq image-multi-frame t |
| 606 | 'mouse-face 'mode-line-highlight | 612 | mode-line-process |
| 607 | 'local-map | 613 | `(:eval |
| 608 | '(keymap | 614 | (concat " " |
| 609 | (mode-line | 615 | (propertize |
| 610 | keymap | 616 | (format "[%s/%s]" |
| 611 | (down-mouse-1 . image-next-frame) | 617 | (1+ (image-current-frame ',image)) |
| 612 | (down-mouse-3 . image-previous-frame))))))) | 618 | ,(car animated)) |
| 613 | (message "%s" | 619 | 'help-echo "Frames\nmouse-1: Next frame\nmouse-3: Previous frame" |
| 614 | (concat msg1 "text. This image has multiple frames."))) | 620 | 'mouse-face 'mode-line-highlight |
| 615 | ;;; (substitute-command-keys | 621 | 'local-map |
| 616 | ;;; "\\[image-toggle-animation] to animate.")))) | 622 | '(keymap |
| 617 | (t | 623 | (mode-line |
| 618 | (message "%s" (concat msg1 "text or hex.")))))) | 624 | keymap |
| 619 | 625 | (down-mouse-1 . image-next-frame) | |
| 620 | (error | 626 | (down-mouse-3 . image-previous-frame))))))) |
| 621 | (image-mode-as-text) | 627 | (message "%s" |
| 622 | (funcall | 628 | (concat msg1 "text. This image has multiple frames."))) |
| 623 | (if (called-interactively-p 'any) 'error 'message) | 629 | (t |
| 624 | "Cannot display image: %s" (cdr err))))) | 630 | (message "%s" (concat msg1 "text or hex.")))))) |
| 625 | 631 | ||
| 626 | ;;;###autoload | 632 | ;;;###autoload |
| 627 | (define-minor-mode image-minor-mode | 633 | (define-minor-mode image-minor-mode |
diff --git a/lisp/image.el b/lisp/image.el index 66fb5fa5fc9..ad2ee6c6071 100644 --- a/lisp/image.el +++ b/lisp/image.el | |||
| @@ -151,6 +151,8 @@ or \"ffmpeg\") is installed." | |||
| 151 | :type 'boolean | 151 | :type 'boolean |
| 152 | :version "27.1") | 152 | :version "27.1") |
| 153 | 153 | ||
| 154 | (define-error 'unknown-image-type "Unknown image type") | ||
| 155 | |||
| 154 | ;; Map put into text properties on images. | 156 | ;; Map put into text properties on images. |
| 155 | (defvar image-map | 157 | (defvar image-map |
| 156 | (let ((map (make-sparse-keymap))) | 158 | (let ((map (make-sparse-keymap))) |
| @@ -391,7 +393,7 @@ Optional DATA-P non-nil means SOURCE is a string containing image data." | |||
| 391 | (require 'image-converter) | 393 | (require 'image-converter) |
| 392 | (image-convert-p source)))))) | 394 | (image-convert-p source)))))) |
| 393 | (unless type | 395 | (unless type |
| 394 | (error "Cannot determine image type"))) | 396 | (signal 'unknown-image-type "Cannot determine image type"))) |
| 395 | (when (and (not (eq type 'image-convert)) | 397 | (when (and (not (eq type 'image-convert)) |
| 396 | (not (memq type (and (boundp 'image-types) image-types)))) | 398 | (not (memq type (and (boundp 'image-types) image-types)))) |
| 397 | (error "Invalid image type `%s'" type)) | 399 | (error "Invalid image type `%s'" type)) |