# HG changeset patch # User Gerd Moellmann # Date 997268026 0 # Node ID 24fe4f884e822b59d9ec629b2e17eb96e9bd10c4 # Parent 7eaa1dbf3c86b8202141c513ea3e3a7594b020d4 (image-type-regexps): Allow predicates. Change the way JPEG images are recognized. (image-jpeg-p): New function. (image-type-from-data): Handle predicates in image-type-regexps. diff -r 7eaa1dbf3c86 -r 24fe4f884e82 lisp/image.el --- a/lisp/image.el Wed Aug 08 10:51:56 2001 +0000 +++ b/lisp/image.el Wed Aug 08 10:53:46 2001 +0000 @@ -34,15 +34,37 @@ '(("\\`/\\*.*XPM.\\*/" . xpm) ("\\`P[1-6]" . pbm) ("\\`GIF8" . gif) - ;; The following is from JPEG File Interchange Format, Version 1.02. - ("\\`\xff\xd8\xff\xe0..JFIF\0" . jpeg) ("\\`\211PNG\r\n" . png) ("\\`#define" . xbm) ("\\`\\(MM\0\\*\\)\\|\\(II\\*\0\\)" . tiff) - ("\\`%!PS" . postscript)) + ("\\`%!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.") +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 ") + + +(defun image-jpeg-p (data) + "Value is non-nil if DATA, a string, consists of JFIF image data." + (when (string-match "\\`\xff\xd8" data) + (catch 'jfif + (let ((len (length data)) (i 2)) + (while (< i len) + (when (/= (aref data i) #xff) + (throw 'jfif nil)) + (setq i (1+ i)) + (when (>= (+ i 2) len) + (throw 'jfif nil)) + (let ((nbytes (+ (lsh (aref data (+ i 1)) 8) + (aref data (+ i 2))))) + (when (= (aref data i) #xe0) + ;; APP0 LEN1 LEN2 "JFIF\0" + (throw 'jfif (string-match "\\`\xe0..JFIF\0" + (substring data i (+ i 10))))) + (setq i (+ i nbytes)))))))) ;;;###autoload @@ -55,7 +77,11 @@ (while (and types (null type)) (let ((regexp (car (car types))) (image-type (cdr (car types)))) - (when (string-match regexp data) + (when (or (and (symbolp image-type) + (string-match regexp data)) + (and (consp image-type) + (funcall (car image-type) data) + (setq image-type (cdr image-type)))) (setq type image-type)) (setq types (cdr types)))) type))