summaryrefslogtreecommitdiff
path: root/lisp/image-mode.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/image-mode.el')
-rw-r--r--lisp/image-mode.el123
1 files changed, 103 insertions, 20 deletions
diff --git a/lisp/image-mode.el b/lisp/image-mode.el
index b30a43080d6..396264b3501 100644
--- a/lisp/image-mode.el
+++ b/lisp/image-mode.el
@@ -4,6 +4,7 @@
;;
;; Author: Richard Stallman <rms@gnu.org>
;; Keywords: multimedia
+;; Package: emacs
;; This file is part of GNU Emacs.
@@ -35,18 +36,6 @@
(require 'image)
(eval-when-compile (require 'cl))
-;;;###autoload (push (cons (purecopy "\\.jpe?g\\'") 'image-mode) auto-mode-alist)
-;;;###autoload (push (cons (purecopy "\\.png\\'") 'image-mode) auto-mode-alist)
-;;;###autoload (push (cons (purecopy "\\.gif\\'") 'image-mode) auto-mode-alist)
-;;;###autoload (push (cons (purecopy "\\.tiff?\\'") 'image-mode) auto-mode-alist)
-;;;###autoload (push (cons (purecopy "\\.p[bpgn]m\\'") 'image-mode) auto-mode-alist)
-
-;;;###autoload (push (cons (purecopy "\\.x[bp]m\\'") 'c-mode) auto-mode-alist)
-;;;###autoload (push (cons (purecopy "\\.x[bp]m\\'") 'image-mode) auto-mode-alist)
-
-;;;###autoload (push (cons (purecopy "\\.svgz?\\'") 'xml-mode) auto-mode-alist)
-;;;###autoload (push (cons (purecopy "\\.svgz?\\'") 'image-mode) auto-mode-alist)
-
;;; Image mode window-info management.
(defvar image-mode-winprops-alist t)
@@ -320,10 +309,14 @@ This variable is used to display the current image type in the mode line.")
(define-key map (kbd "DEL") 'image-scroll-down)
(define-key map [remap forward-char] 'image-forward-hscroll)
(define-key map [remap backward-char] 'image-backward-hscroll)
+ (define-key map [remap right-char] 'image-forward-hscroll)
+ (define-key map [remap left-char] 'image-backward-hscroll)
(define-key map [remap previous-line] 'image-previous-line)
(define-key map [remap next-line] 'image-next-line)
(define-key map [remap scroll-up] 'image-scroll-up)
(define-key map [remap scroll-down] 'image-scroll-down)
+ (define-key map [remap scroll-up-command] 'image-scroll-up)
+ (define-key map [remap scroll-down-command] 'image-scroll-down)
(define-key map [remap move-beginning-of-line] 'image-bol)
(define-key map [remap move-end-of-line] 'image-eol)
(define-key map [remap beginning-of-buffer] 'image-bob)
@@ -377,6 +370,7 @@ to toggle between display as an image and display as text."
(image-mode-setup-winprops)
(add-hook 'change-major-mode-hook 'image-toggle-display-text nil t)
+ (add-hook 'after-revert-hook 'image-after-revert-hook nil t)
(run-mode-hooks 'image-mode-hook)
(message "%s" (concat
(substitute-command-keys
@@ -468,7 +462,7 @@ Remove text properties that display the image."
(defvar archive-superior-buffer)
(defvar tar-superior-buffer)
-(declare-function image-refresh "image.c" (spec &optional frame))
+(declare-function image-flush "image.c" (spec &optional frame))
(defun image-toggle-display-image ()
"Show the image of the image file.
@@ -488,7 +482,10 @@ was inserted."
(buffer-substring-no-properties (point-min) (point-max)))
filename))
(type (image-type file-or-data nil data-p))
- (image (create-image file-or-data type data-p))
+ (image0 (create-animated-image file-or-data type data-p))
+ (image (append image0
+ (image-transform-properties image0)
+ ))
(props
`(display ,image
intangible ,image
@@ -497,7 +494,7 @@ was inserted."
(inhibit-read-only t)
(buffer-undo-list t)
(modified (buffer-modified-p)))
- (image-refresh image)
+ (image-flush image)
(let ((buffer-file-truename nil)) ; avoid changing dir mtime by lock_file
(add-text-properties (point-min) (point-max) props)
(restore-buffer-modified-p modified))
@@ -523,17 +520,25 @@ the image file and `image-mode' showing the image as an image."
(if (image-get-display-property)
(image-mode-as-text)
(image-mode)))
+
+(defun image-after-revert-hook ()
+ (when (image-get-display-property)
+ (image-toggle-display-text)
+ ;; Update image display.
+ (redraw-frame (selected-frame))
+ (image-toggle-display-image)))
+
;;; Support for bookmark.el
-(declare-function bookmark-make-record-default "bookmark"
- (&optional point-only))
+(declare-function bookmark-make-record-default
+ "bookmark" (&optional no-file no-context posn))
(declare-function bookmark-prop-get "bookmark" (bookmark prop))
(declare-function bookmark-default-handler "bookmark" (bmk))
(defun image-bookmark-make-record ()
- (nconc (bookmark-make-record-default)
- `((image-type . ,image-type)
- (handler . image-bookmark-jump))))
+ `(,@(bookmark-make-record-default nil 'no-context 0)
+ (image-type . ,image-type)
+ (handler . image-bookmark-jump)))
;;;###autoload
(defun image-bookmark-jump (bmk)
@@ -543,6 +548,84 @@ the image file and `image-mode' showing the image as an image."
(when (not (string= image-type (bookmark-prop-get bmk 'image-type)))
(image-toggle-display))))
+
+(defvar image-transform-minor-mode-map
+ (let ((map (make-sparse-keymap)))
+; (define-key map [(control ?+)] 'image-scale-in)
+; (define-key map [(control ?-)] 'image-scale-out)
+; (define-key map [(control ?=)] 'image-scale-none)
+;; (define-key map "c f h" 'image-scale-fit-height)
+;; (define-key map "c ]" 'image-rotate-right)
+ map)
+ "Minor mode keymap for transforming the view of images Image mode.")
+
+(define-minor-mode image-transform-mode
+ "minor mode for scaleing and rotation"
+ nil "image-transform"
+ image-transform-minor-mode-map)
+
+(defvar image-transform-resize nil
+ "The image resize operation. See the command
+ `image-transform-set-scale' for more information." )
+
+(defvar image-transform-rotation 0.0)
+
+
+(defun image-transform-properties (display)
+ "Calculate the display properties for transformations; scaling
+and rotation. "
+ (let*
+ ((size (image-size display t))
+ (height
+ (cond
+ ((and (numberp image-transform-resize) (eq 100 image-transform-resize))
+ nil)
+ ((numberp image-transform-resize)
+ (* image-transform-resize (cdr size)))
+ ((eq image-transform-resize 'fit-height)
+ (- (nth 3 (window-inside-pixel-edges)) (nth 1 (window-inside-pixel-edges))))
+ (t nil)))
+ (width (if (eq image-transform-resize 'fit-width)
+ (- (nth 2 (window-inside-pixel-edges)) (nth 0 (window-inside-pixel-edges))))))
+
+ `(,@(if height (list :height height))
+ ,@(if width (list :width width))
+ ,@(if (not (equal 0.0 image-transform-rotation))
+ (list :rotation image-transform-rotation))
+ ;;TODO fit-to-* should consider the rotation angle
+ )))
+
+(defun image-transform-set-scale (scale)
+ "SCALE sets the scaling for images. "
+ (interactive "nscale:")
+ (image-transform-set-resize (float scale)))
+
+(defun image-transform-fit-to-height ()
+ "Fit image height to window height. "
+ (interactive)
+ (image-transform-set-resize 'fit-height))
+
+(defun image-transform-fit-to-width ()
+ "Fit image width to window width. "
+ (interactive)
+ (image-transform-set-resize 'fit-width))
+
+(defun image-transform-set-resize (resize)
+ "Set the resize mode for images. The RESIZE value can be the
+symbol fit-height which fits the image to the window height. The
+symbol fit-width fits the image to the window width. A number
+indicates a scaling factor. nil indicates scale to 100%. "
+ (setq image-transform-resize resize)
+ (if (eq 'image-mode major-mode) (image-toggle-display-image)))
+
+(defun image-transform-set-rotation (rotation)
+ "Set the image ROTATION angle. "
+ (interactive "nrotation:")
+ ;;TODO 0 90 180 270 degrees are the only reasonable angles here
+ ;;otherwise combining with rescaling will get very awkward
+ (setq image-transform-rotation (float rotation))
+ (if (eq major-mode 'image-mode) (image-toggle-display-image)))
+
(provide 'image-mode)
;; arch-tag: b5b2b7e6-26a7-4b79-96e3-1546b5c4c6cb