From: Stefan Kangas Date: Fri, 5 Nov 2021 03:22:12 +0000 (+0100) Subject: New user option image-auto-resize-max-scale-percent X-Git-Tag: emacs-29.0.90~3671^2~173 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=569d7f6a73c939e4f0b9c42cfea95cd3ed5ca8d0;p=emacs.git 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. --- diff --git a/etc/NEWS b/etc/NEWS index 149ddb57a75..8aba24ac5ee 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -395,6 +395,10 @@ The keybinding for 'image-transform-fit-to-width' is now 's i'. *** User option 'image-auto-resize' can now be set to 'fit-window'. This works like 'image-transform-fit-to-window'. +*** New user option 'image-auto-resize-max-scale-percent'. +The new 'fit-window' options will never scale an image more than this +much (in percent). It is nil by default. + ** Image-Dired +++ 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