diff options
author | Stefan Kangas <stefan@marxist.se> | 2021-11-05 04:22:12 +0100 |
---|---|---|
committer | Stefan Kangas <stefan@marxist.se> | 2021-11-06 20:45:37 +0100 |
commit | 569d7f6a73c939e4f0b9c42cfea95cd3ed5ca8d0 (patch) | |
tree | d6e09c10cbb5c88b0dcdba6f1b24148a2e0208bb /lisp/image-mode.el | |
parent | fd141116f67313c0d9787936cbaa4f12cfaffb9d (diff) | |
download | emacs-569d7f6a73c939e4f0b9c42cfea95cd3ed5ca8d0.tar.gz |
New user option image-auto-resize-max-scale-percent
* lisp/image-mode.el (image-auto-resize-max-scale-percent): New
user option to limit how much 'fit-window' will scale up an image.
(image--scale-within-limits-p): New function.
(image-toggle-display-image): Respect above new user option.
Diffstat (limited to 'lisp/image-mode.el')
-rw-r--r-- | lisp/image-mode.el | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/lisp/image-mode.el b/lisp/image-mode.el index a911027a9aa..624c852cb8e 100644 --- a/lisp/image-mode.el +++ b/lisp/image-mode.el @@ -74,6 +74,15 @@ Resizing will always preserve the aspect ratio of the image." :version "29.1" :group 'image) +(defcustom image-auto-resize-max-scale-percent nil + "Max size (in percent) to scale up to when `image-auto-resize' is `fit-window'. +Can be either a number larger than 100, or nil, which means no +max size." + :type '(choice (const nil "No max") + natnum) + :version "29.1" + :group 'image) + (defcustom image-auto-resize-on-window-resize 1 "Non-nil to resize the image whenever the window's dimensions change. This will always keep the image fit to the window. @@ -810,6 +819,21 @@ Remove text properties that display the image." (defvar tar-superior-buffer) (declare-function image-flush "image.c" (spec &optional frame)) +(defun image--scale-within-limits-p (image) + "Return t if `fit-window' will scale image within the customized limits. +The limits are given by the user option +`image-auto-resize-max-scale-percent'." + (or (not image-auto-resize-max-scale-percent) + (let ((scale (/ image-auto-resize-max-scale-percent 100)) + (mw (plist-get (cdr image) :max-width)) + (mh (plist-get (cdr image) :max-height)) + ;; Note: `image-size' looks up and thus caches the + ;; untransformed image. There's no easy way to + ;; prevent that. + (size (image-size image t))) + (or (<= mw (* (car size) scale)) + (<= mh (* (cdr size) scale)))))) + (defun image-toggle-display-image () "Show the image of the image file. Turn the image data into a real image, but only if the whole file @@ -893,7 +917,8 @@ was inserted." :format (and filename data-p)))) ;; Handle `fit-window'. - (when (eq image-transform-resize 'fit-window) + (when (and (eq image-transform-resize 'fit-window) + (image--scale-within-limits-p image)) (setq image (cons (car image) (plist-put (cdr image) :width |