diff options
author | Gerd Moellmann <gerd@gnu.org> | 2001-08-08 10:54:12 +0000 |
---|---|---|
committer | Gerd Moellmann <gerd@gnu.org> | 2001-08-08 10:54:12 +0000 |
commit | 8a8ef149d07a98d1ddc09e60fb6edfe81b717373 (patch) | |
tree | 43b232842105963f41253de57a44fac24232de2f /lisp/image.el | |
parent | 057b57f6f9710e7e2a09dcb768f0e069bef16fc0 (diff) | |
download | emacs-8a8ef149d07a98d1ddc09e60fb6edfe81b717373.tar.gz |
(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.
Diffstat (limited to 'lisp/image.el')
-rw-r--r-- | lisp/image.el | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/lisp/image.el b/lisp/image.el index e0d19f5b776..9603f1ea95c 100644 --- a/lisp/image.el +++ b/lisp/image.el @@ -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 @@ be determined." (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)) |