changeset 74972:94afc7cac404

(image-type-header-regexps, image-type-from-data, image-type-from-buffer, image-type-from-file-header): Revert changes from 2006-12-26. (image-type-auto-detectable): New variable. (image-type-auto-detected-p): New function.
author Juanma Barranquero <lekktu@gmail.com>
date Sat, 30 Dec 2006 01:51:24 +0000
parents 5a0fef17fd44
children 7f729944fa45
files lisp/image.el
diffstat 1 files changed, 53 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/image.el	Sat Dec 30 00:55:06 2006 +0000
+++ b/lisp/image.el	Sat Dec 30 01:51:24 2006 +0000
@@ -34,27 +34,20 @@
 
 
 (defconst image-type-header-regexps
-  '(("\\`/[\t\n\r ]*\\*.*XPM.\\*/" xpm)
-    ("\\`P[1-6][[:space:]]+\\(?:#.*[[:space:]]+\\)*[0-9]+[[:space:]]+[0-9]+" pbm)
-    ("\\`GIF8" gif)
-    ("\\`\x89PNG\r\n\x1a\n" png)
-    ("\\`[\t\n\r ]*#define" xbm)
-    ("\\`\\(?:MM\0\\*\\|II\\*\0\\)" tiff)
-    ("\\`[\t\n\r ]*%!PS" postscript t)
-    ("\\`\xff\xd8" (image-jpeg-p . jpeg)))
-  "Alist of (REGEXP IMAGE-TYPE) pairs used to auto-detect image types.
+  '(("\\`/[\t\n\r ]*\\*.*XPM.\\*/" . xpm)
+    ("\\`P[1-6][[:space:]]+\\(?:#.*[[:space:]]+\\)*[0-9]+[[:space:]]+[0-9]+" . pbm)
+    ("\\`GIF8" . gif)
+    ("\\`\x89PNG\r\n\x1a\n" . png)
+    ("\\`[\t\n\r ]*#define" . xbm)
+    ("\\`\\(?:MM\0\\*\\|II\\*\0\\)" . tiff)
+    ("\\`[\t\n\r ]*%!PS" . postscript)
+    ("\\`\xff\xd8" . (image-jpeg-p . jpeg)))
+  "Alist of (REGEXP . IMAGE-TYPE) pairs used to auto-detect image types.
 When the first bytes of an image file match REGEXP, it is assumed to
-be of image type IMAGE-TYPE if IMAGE-TYPE is a symbol.
-
-An element can also be (REGEXP IMAGE-TYPE NOT-ALWAYS).  If
-NOT-ALWAYS is non-nil, that means that REGEXP identifies a
-file that _can_ be treated as an image of type IMAGE-TYPE,
-but such files should not be spontaneously treated as images.
-
-IMAGE-TYPE can be a pair (PREDICATE . TYPE) instead of a
-symbol.  Then PREDICATE is called with one argument, a
-string containing the image data.  If PREDICATE returns a
-non-nil value, TYPE is the image's type.")
+be of image type IMAGE-TYPE if IMAGE-TYPE is a symbol.  If not a symbol,
+IMAGE-TYPE must be a pair (PREDICATE . TYPE).  PREDICATE is called
+with one argument, a string containing the image data.  If PREDICATE returns
+a non-nil value, TYPE is the image's type.")
 
 (defconst image-type-file-name-regexps
   '(("\\.png\\'" . png)
@@ -70,6 +63,24 @@
 When the name of an image file match REGEXP, it is assumed to
 be of image type IMAGE-TYPE.")
 
+(defvar image-type-auto-detectable
+  '((pbm . t)
+    (xbm . t)
+    (bmp . maybe)
+    (gif . maybe)
+    (png . maybe)
+    (xpm . maybe)
+    (jpeg . maybe)
+    (tiff . maybe)
+    (postscript . nil))
+  "Alist of (IMAGE-TYPE . AUTODETECT) pairs used to auto-detect image files.
+\(See `image-type-auto-detected-p').
+
+AUTODETECT can be
+ - t      always auto-detect.
+ - nil    never auto-detect.
+ - maybe  auto-detect only if the image type is available
+	    (see `image-type-available-p').")
 
 (defvar image-load-path nil
   "List of locations in which to search for image files.
@@ -212,7 +223,7 @@
 	type)
     (while types
       (let ((regexp (car (car types)))
-	    (image-type (nth 1 (car types))))
+	    (image-type (cdr (car types))))
 	(if (or (and (symbolp image-type)
 		     (string-match regexp data))
 		(and (consp image-type)
@@ -225,22 +236,17 @@
 
 
 ;;;###autoload
-(defun image-type-from-buffer (&optional include-maybes)
+(defun image-type-from-buffer ()
   "Determine the image type from data in the current buffer.
-Value is a symbol specifying the image type, or nil if none
-corresponds to the buffer contents.
-
-If INCLUDE-MAYBES is nil (the default), we return nil for 
-file types that should not always be treated as images
-even though they can be so treated."
+Value is a symbol specifying the image type or nil if type cannot
+be determined."
   (let ((types image-type-header-regexps)
 	type
 	(opoint (point)))
     (goto-char (point-min))
     (while types
       (let ((regexp (car (car types)))
-	    (image-type (nth 1 (car types)))
-	    (not-always (nth 2 (car types)))
+	    (image-type (cdr (car types)))
 	    data)
 	(if (or (and (symbolp image-type)
 		     (looking-at regexp))
@@ -253,10 +259,7 @@
 					 (min (point-max)
 					      (+ (point-min) 256))))))
 		     (setq image-type (cdr image-type))))
-	    ;; If this entry says "not always",
-	    ;; treat it as nil, unless INCLUDE-MAYBES is t.
-	    (setq type (if (or include-maybes (not not-always))
-			   image-type)
+	    (setq type image-type
 		  types nil)
 	  (setq types (cdr types)))))
     (goto-char opoint)
@@ -276,7 +279,7 @@
        (with-temp-buffer
 	 (set-buffer-multibyte nil)
 	 (insert-file-contents-literally file nil 0 256)
-	 (image-type-from-buffer t))))
+	 (image-type-from-buffer))))
 
 
 ;;;###autoload
@@ -323,6 +326,7 @@
     (error "Invalid image type `%s'" type))
   type)
 
+
 ;;;###autoload
 (defun image-type-available-p (type)
   "Return non-nil if image type TYPE is available.
@@ -332,6 +336,20 @@
 
 
 ;;;###autoload
+(defun image-type-auto-detected-p ()
+  "Return t iff the current buffer contains an auto-detectable image.
+Whether image types are auto-detectable or not depends on the setting
+of the variable `image-type-auto-detectable'.
+
+This function is intended to be used from `magic-mode-alist' (which see)."
+  (let* ((type (image-type-from-buffer))
+	 (auto (and type (cdr (assq type image-type-auto-detectable)))))
+    (and auto
+	 (or (eq auto t)
+	     (image-type-available-p type)))))
+
+
+;;;###autoload
 (defun create-image (file-or-data &optional type data-p &rest props)
   "Create an image.
 FILE-OR-DATA is an image file name or image data.