Mercurial > hg > xemacs-beta
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/modes/image-mode.el Mon Aug 13 09:45:46 2007 +0200 @@ -0,0 +1,165 @@ +;;; image-mode.el --- Major mode for navigate images + +;; Copyright (C) 1997 MORIOKA Tomohiko + +;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp> +;; Created: 1997/6/27 +;; Version: $Id: image-mode.el,v 1.1 1997/06/29 23:12:55 steve Exp $ +;; Keywords: image, graphics + +;; This file is part of XEmacs. + +;; XEmacs is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; XEmacs is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with XEmacs; see the file COPYING. If not, write to the Free +;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +;; 02111-1307, USA. + +;;; Code: + +(defvar buffer-image-format nil) +(make-variable-buffer-local 'buffer-image-format) + +(defsubst image-decode (start end type) + "Decode the image between START and END which is encoded in TYPE." + (save-excursion + (let ((image (make-image-instance + (vector type :data (buffer-string)) nil nil 'no-error))) + (delete-region start end) + (if image + (let ((glyph (make-glyph image))) + (set-extent-begin-glyph (make-extent start start) glyph) + (setq buffer-read-only t) + ) + (insert (format "%s is not supported!\n" type)) + (let ((overriding-local-map image-mode-map)) + (insert + (substitute-command-keys + " +Please type `\\[image-toggle-decoding]' if you would like to display +raw data. +Please type `\\[image-enter-hexl-mode]' if you would like to edit hex +data. +Please type `\\[image-start-external-viewer]' if you would like to +display contents of this buffer by external viewer.\n"))) + (call-interactively 'fill-paragraph) + ) + start))) + +(defvar image-mode-map (make-keymap)) +(suppress-keymap image-mode-map) +(define-key image-mode-map "v" 'image-start-external-viewer) +(define-key image-mode-map "t" 'image-toggle-decoding) +(define-key image-mode-map "h" 'image-enter-hexl-mode) +(define-key image-mode-map "q" 'image-mode-quit) + +(defvar image-external-viewer + (cond ((exec-installed-p "display") "display") ; ImageMagic + ((exec-installed-p "xv") "xv") ; xv + ) + "*External viewer for image-mode.") + +(defun image-start-external-viewer () + "Start external image viewer for current-buffer. +It uses `image-external-viewer' as external image viewer." + (interactive) + (start-process "external image viewer" nil + image-external-viewer buffer-file-name) + ) + +(defun image-toggle-decoding () + "Toggle image display mode in current buffer." + (interactive) + (if buffer-file-format + (progn + (setq buffer-read-only nil) + (erase-buffer) + (map-extents (function + (lambda (extent maparg) + (delete-extent extent) + )) nil (point-min)(point-min)) + (setq buffer-file-format nil) + (insert-file-contents-literally buffer-file-name) + (set-buffer-modified-p nil) + ) + (format-decode-buffer buffer-image-format) + )) + +(defun image-exit-hexl-mode-function () + (format-decode-buffer) + (remove-hook 'hexl-mode-exit-hook 'image-exit-hexl-mode-function) + ) + +(defun image-enter-hexl-mode () + "Enter to hexl-mode." + (interactive) + (when buffer-file-format + (setq buffer-read-only nil) + (erase-buffer) + (map-extents (function + (lambda (extent maparg) + (delete-extent extent) + )) nil (point-min)(point-min)) + (setq buffer-file-format nil) + (insert-file-contents-literally buffer-file-name) + (set-buffer-modified-p nil) + (add-hook 'hexl-mode-exit-hook 'image-exit-hexl-mode-function) + ) + (hexl-mode) + ) + +(defun image-mode-quit () + "Exit image-mode." + (interactive) + (kill-buffer (current-buffer)) + ) + +;;;###autoload +(defun image-mode (&optional arg) + "\\{image-mode-map}" + (interactive) + (setq major-mode 'image-mode) + (setq mode-name "Image") + (use-local-map image-mode-map) + ) + +;;;###autoload +(defun image-decode-jpeg (start end) + "Decode JPEG image between START and END." + (setq buffer-image-format 'image/jpeg) + (image-decode start end 'jpeg) + ) + +;;;###autoload +(defun image-decode-gif (start end) + "Decode GIF image between START and END." + (setq buffer-image-format 'image/gif) + (image-decode start end 'gif) + ) + +;;;###autoload +(defun image-decode-png (start end) + "Decode PNG image between START and END." + (setq buffer-image-format 'image/png) + (image-decode start end 'png) + ) + +;;;###autoload +(defun image-decode-xpm (start end) + "Decode XPM image between START and END." + (setq buffer-image-format 'image/x-xpm) + (image-decode start end 'xpm) + ) + +(provide 'image-mode) + +;;; image-mode.el ends here