;; Copyright (C) 1996 Dan Rich
;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;; Dan Rich <drich@morpheus.corp.sgi.com>
+;; Dan Rich <drich@morpheus.corp.sgi.com>
+;; Daiki Ueno <ueno@ueda.info.waseda.ac.jp>
+;; Katsumi Yamaoka <yamaoka@jpl.org>
;; Maintainer: MORIOKA Tomohiko <morioka@jaist.ac.jp>
;; Created: 1995/12/15
;; Renamed: 1997/2/21 from tm-image.el
;;; Code:
+(eval-when-compile (require 'static))
+
(require 'mime-view)
(require 'alist)
(require 'path-util)
-(cond
- ((featurep 'xemacs)
+(cond
+ ((featurep 'xemacs)
(require 'images)
(or (memq format image-native-formats)
(find-if (function
(lambda (native)
- (image-converter-chain format native)
- ))
- image-native-formats)
- ))
-
+ (image-converter-chain format native)))
+ image-native-formats)))
+
(image-register-netpbm-utilities)
(image-register-converter 'pic 'ppm "pictoppm")
(image-register-converter 'mag 'ppm "magtoppm")
-
+
(defun image-insert-at-point (image)
(let ((e (make-extent (point) (point))))
(set-extent-end-glyph e (make-glyph image))))
(defsubst-maybe image-invalid-glyph-p (glyph)
(or (null (aref glyph 0))
(null (aref glyph 2))
- (equal (aref glyph 2) "")
- ))
- )
- ((featurep 'mule)
+ (equal (aref glyph 2) ""))))
+ ((featurep 'mule)
- (eval-when-compile (require 'static))
+ (eval-when-compile (ignore-errors (require 'image)))
(eval-and-compile
- (autoload 'bitmap-insert-xbm-buffer "bitmap")
- )
+ (autoload 'bitmap-insert-xbm-buffer "bitmap"))
(static-if (fboundp 'image-type-available-p)
(defalias-maybe 'image-inline-p 'image-type-available-p)
(defun-maybe image-inline-p (format)
(memq format image-native-formats)))
+ (static-unless (or (not (fboundp 'create-image))
+ (memq 'data-p (aref (symbol-function 'create-image) 0)))
+ (defadvice create-image
+ (around data-p (file-or-data &optional type data-p &rest props) activate)
+ (if (ad-get-arg 2)
+ (setq ad-return-value
+ (nconc
+ (list 'image ':type (ad-get-arg 1) ':data (ad-get-arg 0))
+ props))
+ (ad-set-args 0 (list (ad-get-arg 0) (ad-get-arg 1) (ad-get-arg 3)))
+ ad-do-it)))
+
(defun-maybe image-normalize (format data)
(if (memq format '(xbm xpm))
- (list 'image ':type format ':data data)
- (let ((image-file
- (make-temp-name
+ (create-image data format 'data)
+ (let ((image-file
+ (make-temp-name
(expand-file-name "tm" temporary-file-directory))))
(with-temp-buffer
- (set-buffer-multibyte nil)
(insert data)
- (write-region (point-min)(point-max) image-file))
- (list 'image ':type format ':file image-file)
- )))
+ (write-region-as-binary (point-min)(point-max) image-file))
+ (create-image image-file format))))
(defun image-insert-at-point (image)
(static-if (fboundp 'insert-image)
(sit-for 0)))
(let ((file (plist-get (cdr image) ':file)))
(and file (file-exists-p file)
- (delete-file file)
- )))
+ (delete-file file))))
(when (eq (plist-get (cdr image) ':type) 'xbm)
(save-restriction
(narrow-to-region (point)(point))
(insert (plist-get (cdr image) ':data))
(let ((mark (set-marker (make-marker) (point))))
(bitmap-insert-xbm-buffer (current-buffer))
- (delete-region (point-min) mark))
- ))))
+ (delete-region (point-min) mark))))))
(defsubst-maybe image-invalid-glyph-p (glyph)
- (not (eq 'image (nth 0 glyph))))
- ))
+ (not (eq 'image (nth 0 glyph))))))
;;
;; X-Face
((module-installed-p 'highlight-headers)
(eval-and-compile
(autoload 'highlight-headers "highlight-headers"))
-
+
(defun mime-preview-x-face-function-use-highlight-headers ()
- (highlight-headers (point-min) (re-search-forward "^$" nil t) t)
- )
+ (highlight-headers (point-min) (re-search-forward "^$" nil t) t))
(add-hook 'mime-display-header-hook
- 'mime-preview-x-face-function-use-highlight-headers)
- )
+ 'mime-preview-x-face-function-use-highlight-headers))
((featurep 'mule)
(require 'x-face-mule)
(when (exec-installed-p uncompface-program exec-path)
(add-hook 'mime-display-header-hook
- 'x-face-decode-message-header))
- ))
+ 'x-face-decode-message-header))))
(defvar mime-image-format-alist
'((image jpeg jpeg)
(list (cons 'type type)(cons 'subtype subtype)
'(body . visible)
(cons 'body-presentation-method #'mime-display-image)
- (cons 'image-format format))
- ))))
+ (cons 'image-format format))))))
;;; @ content filter for images
;;;
;; (for XEmacs 19.12 or later)
+(eval-when-compile
+ (defmacro mime-image-normalize-xbm (entity)
+ (` (with-temp-buffer
+ (mime-insert-entity-content (, entity))
+ (let ((cur (current-buffer))
+ width height)
+ (goto-char (point-min))
+ (search-forward "width ")
+ (setq width (read cur))
+ (goto-char (point-min))
+ (search-forward "height ")
+ (setq height (read cur))
+ (goto-char (point-min))
+ (search-forward "{")
+ (delete-region (point-min) (point))
+ (insert "\"")
+ (search-forward "}")
+ (delete-region (1- (point)) (point-max))
+ (insert "\"")
+ (goto-char (point-min))
+ (while (re-search-forward "[^\"0-9A-FXa-fx]+" nil t)
+ (replace-match ""))
+ (goto-char (point-min))
+ (while (search-forward "0x" nil t)
+ (replace-match "\\\\x"))
+ (goto-char (point-min))
+ (, (if (featurep 'xemacs)
+ (` (vector 'xbm :data
+ (list width height (read cur))))
+ '(` (image :type xbm :width (, width) :height (, height)
+ :data (, (read cur)))))))))))
+
(defun mime-display-image (entity situation)
(message "Decoding image...")
- (let ((image (image-normalize (cdr (assq 'image-format situation))
- (mime-entity-content entity))))
+ (let* ((format (cdr (assq 'image-format situation)))
+ (image (if (or (featurep 'xemacs) (boundp 'image-types))
+ (if (eq 'xbm format)
+ (mime-image-normalize-xbm entity)
+ (image-normalize format (mime-entity-content entity)))
+ (image-normalize format (mime-entity-content entity)))))
(if (image-invalid-glyph-p image)
(message "Invalid glyph!")
(image-insert-at-point image)
(message "Decoding image... done")))
- (insert "\n")
- )
+ (static-when (featurep 'xemacs)
+ (insert "\n")))
;;; @ end