X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/2311d8e5a62b8b6dd7dde45b4b8059d443e2abac..ea0857a126fbd38e96fd499c7173341a3e8614b6:/lisp/image.el diff --git a/lisp/image.el b/lisp/image.el index 348c208781..a8577ad5a7 100644 --- a/lisp/image.el +++ b/lisp/image.el @@ -282,7 +282,9 @@ be determined." types nil) (setq types (cdr types))))) (goto-char opoint) - type)) + (and type + (memq type image-types) + type))) ;;;###autoload @@ -306,8 +308,17 @@ be determined." "Determine the type of image file FILE from its name. Value is a symbol specifying the image type, or nil if type cannot be determined." - (assoc-default file image-type-file-name-regexps 'string-match-p)) - + (let (type first) + (or + (catch 'found + (dolist (elem image-type-file-name-regexps) + (when (string-match-p (car elem) file) + (setq type (cdr elem)) + (or first (setq first type)) + (if (image-type-available-p type) + (throw 'found type))))) + ;; If nothing seems to be supported, return the first type that matched. + first))) ;;;###autoload (defun image-type (source &optional type data-p) @@ -344,7 +355,7 @@ Optional DATA-P non-nil means SOURCE is a string containing image data." "Return non-nil if image type TYPE is available. Image types are symbols like `xbm' or `jpeg'." (and (fboundp 'init-image-library) - (init-image-library type dynamic-library-alist))) + (init-image-library type))) ;;;###autoload @@ -421,7 +432,7 @@ means display it in the right marginal area." "Insert IMAGE into current buffer at point. IMAGE is displayed by inserting STRING into the current buffer with a `display' property whose value is the image. STRING -defaults to the empty string if you omit it. +defaults to a single space if you omit it. AREA is where to display the image. AREA nil or omitted means display it in the text area, a value of `left-margin' means display it in the left marginal area, a value of `right-margin' @@ -459,8 +470,8 @@ height of the image; integer values are taken as pixel values." (defun insert-sliced-image (image &optional string area rows cols) "Insert IMAGE into current buffer at point. IMAGE is displayed by inserting STRING into the current buffer -with a `display' property whose value is the image. STRING is -defaulted if you omit it. +with a `display' property whose value is the image. The default +STRING is a single space. AREA is where to display the image. AREA nil or omitted means display it in the text area, a value of `left-margin' means display it in the left marginal area, a value of `right-margin' @@ -643,8 +654,8 @@ number, play until that number of seconds has elapsed." (while tail (setq timer (car tail) tail (cdr tail)) - (if (and (eq (aref timer 5) 'image-animate-timeout) - (eq (car-safe (aref timer 6)) image)) + (if (and (eq (timer--function timer) 'image-animate-timeout) + (eq (car-safe (timer--args timer)) image)) (setq tail nil) (setq timer nil))) timer)) @@ -685,6 +696,32 @@ The minimum delay between successive frames is 0.01s." image n count time-elapsed limit)))) +(defvar imagemagick-types-inhibit) +(defvar imagemagick-enabled-types) + +(defun imagemagick-filter-types () + "Return a list of the ImageMagick types to be treated as images, or nil. +This is the result of `imagemagick-types', including only elements +that match `imagemagick-enabled-types' and do not match +`imagemagick-types-inhibit'." + (when (fboundp 'imagemagick-types) + (cond ((null imagemagick-enabled-types) nil) + ((eq imagemagick-types-inhibit t) nil) + (t + (delq nil + (mapcar + (lambda (type) + (unless (memq type imagemagick-types-inhibit) + (if (eq imagemagick-enabled-types t) type + (catch 'found + (dolist (enable imagemagick-enabled-types nil) + (if (cond ((symbolp enable) (eq enable type)) + ((stringp enable) + (string-match enable + (symbol-name type)))) + (throw 'found type))))))) + (imagemagick-types))))))) + (defvar imagemagick--file-regexp nil "File extension regexp for ImageMagick files, if any. This is the extension installed into `auto-mode-alist' and @@ -694,56 +731,101 @@ This is the extension installed into `auto-mode-alist' and (defun imagemagick-register-types () "Register file types that can be handled by ImageMagick. This function is called at startup, after loading the init file. -It registers the ImageMagick types listed in `imagemagick-types', -excluding those listed in `imagemagick-types-inhibit'. +It registers the ImageMagick types returned by `imagemagick-filter-types'. Registered image types are added to `auto-mode-alist', so that Emacs visits them in Image mode. They are also added to `image-type-file-name-regexps', so that the `image-type' function recognizes these files as having image type `imagemagick'. -If Emacs is compiled without ImageMagick support, do nothing." +If Emacs is compiled without ImageMagick support, this does nothing." (when (fboundp 'imagemagick-types) - (let ((re (if (eq imagemagick-types-inhibit t) - ;; Use a bogus regexp to inhibit matches. - "\\'a" - (let ((types)) - (dolist (type (imagemagick-types)) - (unless (memq type imagemagick-types-inhibit) - (push (downcase (symbol-name type)) types))) - (concat "\\." (regexp-opt types) "\\'")))) - (ama-elt (car (member (cons imagemagick--file-regexp 'image-mode) - auto-mode-alist))) - (itfnr-elt (car (member (cons imagemagick--file-regexp 'imagemagick) - image-type-file-name-regexps)))) - (if ama-elt - (setcar ama-elt re) - (push (cons re 'image-mode) auto-mode-alist)) - (if itfnr-elt - (setcar itfnr-elt re) - (push (cons re 'imagemagick) image-type-file-name-regexps)) + (let* ((types (mapcar (lambda (type) (downcase (symbol-name type))) + (imagemagick-filter-types))) + (re (if types (concat "\\." (regexp-opt types) "\\'"))) + (ama-elt (car (member (cons imagemagick--file-regexp 'image-mode) + auto-mode-alist))) + (itfnr-elt (car (member (cons imagemagick--file-regexp 'imagemagick) + image-type-file-name-regexps)))) + (if (not re) + (setq auto-mode-alist (delete ama-elt auto-mode-alist) + image-type-file-name-regexps + (delete itfnr-elt image-type-file-name-regexps)) + (if ama-elt + (setcar ama-elt re) + (push (cons re 'image-mode) auto-mode-alist)) + (if itfnr-elt + (setcar itfnr-elt re) + ;; Append to `image-type-file-name-regexps', so that we + ;; preferentially use specialized image libraries. + (add-to-list 'image-type-file-name-regexps + (cons re 'imagemagick) t))) (setq imagemagick--file-regexp re)))) (defcustom imagemagick-types-inhibit - '(C HTML HTM TXT PDF) - "List of ImageMagick types that should not be treated as images. + '(C HTML HTM INFO M TXT PDF) + "List of ImageMagick types that should never be treated as images. This should be a list of symbols, each of which should be one of -the ImageMagick types listed in `imagemagick-types'. The listed +the ImageMagick types listed by `imagemagick-types'. The listed image types are not registered by `imagemagick-register-types'. If the value is t, inhibit the use of ImageMagick for images. +If you change this without using customize, you must call +`imagemagick-register-types' afterwards. + If Emacs is compiled without ImageMagick support, this variable has no effect." :type '(choice (const :tag "Support all ImageMagick types" nil) (const :tag "Disable all ImageMagick types" t) (repeat symbol)) + :initialize 'custom-initialize-default + :set (lambda (symbol value) + (set-default symbol value) + (imagemagick-register-types)) + :version "24.3" + :group 'image) + +(defcustom imagemagick-enabled-types + '(3FR ART ARW AVS BMP BMP2 BMP3 CAL CALS CMYK CMYKA CR2 CRW + CUR CUT DCM DCR DCX DDS DJVU DNG DPX EXR FAX FITS GBR GIF + GIF87 GRB HRZ ICB ICO ICON J2C JNG JP2 JPC JPEG JPG JPX K25 + KDC MIFF MNG MRW MSL MSVG MTV NEF ORF OTB PBM PCD PCDS PCL + PCT PCX PDB PEF PGM PICT PIX PJPEG PNG PNG24 PNG32 PNG8 PNM + PPM PSD PTIF PWP RAF RAS RBG RGB RGBA RGBO RLA RLE SCR SCT + SFW SGI SR2 SRF SUN SVG SVGZ TGA TIFF TIFF64 TILE TIM TTF + UYVY VDA VICAR VID VIFF VST WBMP WPG X3F XBM XC XCF XPM XV + XWD YCbCr YCbCrA YUV) + "List of ImageMagick types to treat as images. +Each list element should be a string or symbol, representing one +of the image types returned by `imagemagick-types'. If the +element is a string, it is handled as a regexp that enables all +matching types. + +The value of `imagemagick-enabled-types' may also be t, meaning +to enable all types that ImageMagick supports. + +The variable `imagemagick-types-inhibit' overrides this variable. + +If you change this without using customize, you must call +`imagemagick-register-types' afterwards. + +If Emacs is compiled without ImageMagick support, this variable +has no effect." + :type '(choice (const :tag "Support all ImageMagick types" t) + (const :tag "Disable all ImageMagick types" nil) + (repeat :tag "List of types" + (choice (symbol :tag "type") + (regexp :tag "regexp")))) + :initialize 'custom-initialize-default :set (lambda (symbol value) (set-default symbol value) (imagemagick-register-types)) - :version "24.1" + :version "24.3" :group 'image) +(imagemagick-register-types) + (provide 'image) ;;; image.el ends here