Mercurial > hg > xemacs-beta
comparison lisp/modes/image-mode.el @ 167:85ec50267440 r20-3b10
Import from CVS: tag r20-3b10
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:45:46 +0200 |
parents | |
children | 15872534500d |
comparison
equal
deleted
inserted
replaced
166:7a77eb660975 | 167:85ec50267440 |
---|---|
1 ;;; image-mode.el --- Major mode for navigate images | |
2 | |
3 ;; Copyright (C) 1997 MORIOKA Tomohiko | |
4 | |
5 ;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp> | |
6 ;; Created: 1997/6/27 | |
7 ;; Version: $Id: image-mode.el,v 1.1 1997/06/29 23:12:55 steve Exp $ | |
8 ;; Keywords: image, graphics | |
9 | |
10 ;; This file is part of XEmacs. | |
11 | |
12 ;; XEmacs is free software; you can redistribute it and/or modify it | |
13 ;; under the terms of the GNU General Public License as published by | |
14 ;; the Free Software Foundation; either version 2, or (at your option) | |
15 ;; any later version. | |
16 | |
17 ;; XEmacs is distributed in the hope that it will be useful, but | |
18 ;; WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
20 ;; General Public License for more details. | |
21 | |
22 ;; You should have received a copy of the GNU General Public License | |
23 ;; along with XEmacs; see the file COPYING. If not, write to the Free | |
24 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
25 ;; 02111-1307, USA. | |
26 | |
27 ;;; Code: | |
28 | |
29 (defvar buffer-image-format nil) | |
30 (make-variable-buffer-local 'buffer-image-format) | |
31 | |
32 (defsubst image-decode (start end type) | |
33 "Decode the image between START and END which is encoded in TYPE." | |
34 (save-excursion | |
35 (let ((image (make-image-instance | |
36 (vector type :data (buffer-string)) nil nil 'no-error))) | |
37 (delete-region start end) | |
38 (if image | |
39 (let ((glyph (make-glyph image))) | |
40 (set-extent-begin-glyph (make-extent start start) glyph) | |
41 (setq buffer-read-only t) | |
42 ) | |
43 (insert (format "%s is not supported!\n" type)) | |
44 (let ((overriding-local-map image-mode-map)) | |
45 (insert | |
46 (substitute-command-keys | |
47 " | |
48 Please type `\\[image-toggle-decoding]' if you would like to display | |
49 raw data. | |
50 Please type `\\[image-enter-hexl-mode]' if you would like to edit hex | |
51 data. | |
52 Please type `\\[image-start-external-viewer]' if you would like to | |
53 display contents of this buffer by external viewer.\n"))) | |
54 (call-interactively 'fill-paragraph) | |
55 ) | |
56 start))) | |
57 | |
58 (defvar image-mode-map (make-keymap)) | |
59 (suppress-keymap image-mode-map) | |
60 (define-key image-mode-map "v" 'image-start-external-viewer) | |
61 (define-key image-mode-map "t" 'image-toggle-decoding) | |
62 (define-key image-mode-map "h" 'image-enter-hexl-mode) | |
63 (define-key image-mode-map "q" 'image-mode-quit) | |
64 | |
65 (defvar image-external-viewer | |
66 (cond ((exec-installed-p "display") "display") ; ImageMagic | |
67 ((exec-installed-p "xv") "xv") ; xv | |
68 ) | |
69 "*External viewer for image-mode.") | |
70 | |
71 (defun image-start-external-viewer () | |
72 "Start external image viewer for current-buffer. | |
73 It uses `image-external-viewer' as external image viewer." | |
74 (interactive) | |
75 (start-process "external image viewer" nil | |
76 image-external-viewer buffer-file-name) | |
77 ) | |
78 | |
79 (defun image-toggle-decoding () | |
80 "Toggle image display mode in current buffer." | |
81 (interactive) | |
82 (if buffer-file-format | |
83 (progn | |
84 (setq buffer-read-only nil) | |
85 (erase-buffer) | |
86 (map-extents (function | |
87 (lambda (extent maparg) | |
88 (delete-extent extent) | |
89 )) nil (point-min)(point-min)) | |
90 (setq buffer-file-format nil) | |
91 (insert-file-contents-literally buffer-file-name) | |
92 (set-buffer-modified-p nil) | |
93 ) | |
94 (format-decode-buffer buffer-image-format) | |
95 )) | |
96 | |
97 (defun image-exit-hexl-mode-function () | |
98 (format-decode-buffer) | |
99 (remove-hook 'hexl-mode-exit-hook 'image-exit-hexl-mode-function) | |
100 ) | |
101 | |
102 (defun image-enter-hexl-mode () | |
103 "Enter to hexl-mode." | |
104 (interactive) | |
105 (when buffer-file-format | |
106 (setq buffer-read-only nil) | |
107 (erase-buffer) | |
108 (map-extents (function | |
109 (lambda (extent maparg) | |
110 (delete-extent extent) | |
111 )) nil (point-min)(point-min)) | |
112 (setq buffer-file-format nil) | |
113 (insert-file-contents-literally buffer-file-name) | |
114 (set-buffer-modified-p nil) | |
115 (add-hook 'hexl-mode-exit-hook 'image-exit-hexl-mode-function) | |
116 ) | |
117 (hexl-mode) | |
118 ) | |
119 | |
120 (defun image-mode-quit () | |
121 "Exit image-mode." | |
122 (interactive) | |
123 (kill-buffer (current-buffer)) | |
124 ) | |
125 | |
126 ;;;###autoload | |
127 (defun image-mode (&optional arg) | |
128 "\\{image-mode-map}" | |
129 (interactive) | |
130 (setq major-mode 'image-mode) | |
131 (setq mode-name "Image") | |
132 (use-local-map image-mode-map) | |
133 ) | |
134 | |
135 ;;;###autoload | |
136 (defun image-decode-jpeg (start end) | |
137 "Decode JPEG image between START and END." | |
138 (setq buffer-image-format 'image/jpeg) | |
139 (image-decode start end 'jpeg) | |
140 ) | |
141 | |
142 ;;;###autoload | |
143 (defun image-decode-gif (start end) | |
144 "Decode GIF image between START and END." | |
145 (setq buffer-image-format 'image/gif) | |
146 (image-decode start end 'gif) | |
147 ) | |
148 | |
149 ;;;###autoload | |
150 (defun image-decode-png (start end) | |
151 "Decode PNG image between START and END." | |
152 (setq buffer-image-format 'image/png) | |
153 (image-decode start end 'png) | |
154 ) | |
155 | |
156 ;;;###autoload | |
157 (defun image-decode-xpm (start end) | |
158 "Decode XPM image between START and END." | |
159 (setq buffer-image-format 'image/x-xpm) | |
160 (image-decode start end 'xpm) | |
161 ) | |
162 | |
163 (provide 'image-mode) | |
164 | |
165 ;;; image-mode.el ends here |