]> code.delx.au - gnu-emacs/blobdiff - lisp/image-mode.el
ChangeLog typo fix
[gnu-emacs] / lisp / image-mode.el
index 46ce6aa14d31ba43f4d6f5ab6e7f9d2733fc44c9..a95dde1d999cb13175d649b6a1f20ab802b57d0a 100644 (file)
@@ -1,6 +1,6 @@
-;;; image-mode.el --- support for visiting image files
+;;; image-mode.el --- support for visiting image files  -*- lexical-binding: t -*-
 ;;
-;; Copyright (C) 2005-2012 Free Software Foundation, Inc.
+;; Copyright (C) 2005-2013 Free Software Foundation, Inc.
 ;;
 ;; Author: Richard Stallman <rms@gnu.org>
 ;; Keywords: multimedia
 ;; resulting buffer file is saved to another name it will correctly save
 ;; the image data to the new file.
 
+;; Todo:
+
+;; Consolidate with doc-view to make them work on directories of images or on
+;; image files containing various "pages".
+
 ;;; Code:
 
 (require 'image)
-(eval-when-compile (require 'cl))
+(eval-when-compile (require 'cl-lib))
 
 ;;; Image mode window-info management.
 
-(defvar image-mode-winprops-alist t)
-(make-variable-buffer-local 'image-mode-winprops-alist)
+(defvar-local image-mode-winprops-alist t)
 
 (defvar image-mode-new-window-functions nil
   "Special hook run when image data is requested in a new window.
@@ -47,16 +51,21 @@ It is called with one argument, the initial WINPROPS.")
 
 (defun image-mode-winprops (&optional window cleanup)
   "Return winprops of WINDOW.
-A winprops object has the shape (WINDOW . ALIST)."
+A winprops object has the shape (WINDOW . ALIST).
+WINDOW defaults to `selected-window' if it displays the current buffer, and
+otherwise it defaults to t, used for times when the buffer is not displayed."
   (cond ((null window)
-        (setq window (selected-window)))
+         (setq window
+               (if (eq (current-buffer) (window-buffer)) (selected-window) t)))
+        ((eq window t))
        ((not (windowp window))
         (error "Not a window: %s" window)))
   (when cleanup
     (setq image-mode-winprops-alist
          (delq nil (mapcar (lambda (winprop)
-                             (if (window-live-p (car-safe winprop))
-                                 winprop))
+                             (let ((w (car-safe winprop)))
+                               (if (or (not (windowp w)) (window-live-p w))
+                                   winprop)))
                            image-mode-winprops-alist))))
   (let ((winprops (assq window image-mode-winprops-alist)))
     ;; For new windows, set defaults from the latest.
@@ -70,12 +79,11 @@ A winprops object has the shape (WINDOW . ALIST)."
     winprops))
 
 (defun image-mode-window-get (prop &optional winprops)
+  (declare (gv-setter (lambda (val)
+                        `(image-mode-window-put ,prop ,val ,winprops))))
   (unless (consp winprops) (setq winprops (image-mode-winprops winprops)))
   (cdr (assq prop (cdr winprops))))
 
-(defsetf image-mode-window-get (prop &optional winprops) (val)
-  `(image-mode-window-put ,prop ,val ,winprops))
-
 (defun image-mode-window-put (prop val &optional winprops)
   (unless (consp winprops) (setq winprops (image-mode-winprops winprops)))
   (setcdr winprops (cons (cons prop val)
@@ -692,20 +700,20 @@ a slightly different angle.  Currently this is done for values
 close to a multiple of 90, see `image-transform-right-angle-fudge'."
   (cond ((< (abs (- (mod (+ image-transform-rotation 90) 180) 90))
            image-transform-right-angle-fudge)
-        (assert (not (zerop width)) t)
+        (cl-assert (not (zerop width)) t)
         (setq image-transform-rotation
               (float (round image-transform-rotation))
               image-transform-scale (/ (float length) width))
         (cons length nil))
        ((< (abs (- (mod (+ image-transform-rotation 45) 90) 45))
            image-transform-right-angle-fudge)
-        (assert (not (zerop height)) t)
+        (cl-assert (not (zerop height)) t)
         (setq image-transform-rotation
               (float (round image-transform-rotation))
               image-transform-scale (/ (float length) height))
         (cons nil length))
        (t
-        (assert (not (and (zerop width) (zerop height))) t)
+        (cl-assert (not (and (zerop width) (zerop height))) t)
         (setq image-transform-scale
               (/ (float (1- length)) (image-transform-width width height)))
         ;; Assume we have a w x h image and an angle A, and let l =
@@ -739,16 +747,22 @@ close to a multiple of 90, see `image-transform-right-angle-fudge'."
            h)))))
 
 (defun image-transform-check-size ()
-  "Check that the image exactly fits the width/height of the window."
-  (unless (numberp image-transform-resize)
+  "Check that the image exactly fits the width/height of the window.
+
+Do this for an image of type `imagemagick' to make sure that the
+elisp code matches the way ImageMagick computes the bounding box
+of a rotated image."
+  (when (and (not (numberp image-transform-resize))
+            (boundp 'image-type)
+            (eq image-type 'imagemagick))
     (let ((size (image-display-size (image-get-display-property) t)))
       (cond ((eq image-transform-resize 'fit-width)
-            (assert (= (car size)
+            (cl-assert (= (car size)
                        (- (nth 2 (window-inside-pixel-edges))
                           (nth 0 (window-inside-pixel-edges))))
                     t))
            ((eq image-transform-resize 'fit-height)
-            (assert (= (cdr size)
+            (cl-assert (= (cdr size)
                        (- (nth 3 (window-inside-pixel-edges))
                           (nth 1 (window-inside-pixel-edges))))
                     t))))))