From b728620a756db78b8cb0a41afa72db6209102cdf Mon Sep 17 00:00:00 2001 From: "Basil L. Contovounesios" Date: Tue, 16 Jul 2019 22:51:27 +0100 Subject: [PATCH] Allow counter-clockwise rotations in image-rotate * lisp/image.el (image-rotate): Extend with an optional argument specifying the rotation in degrees (bug#35421). * doc/lispref/display.texi (Showing Images): * etc/NEWS: Document the change. * test/lisp/image-tests.el (image-rotate): New test. --- doc/lispref/display.texi | 3 ++- etc/NEWS | 5 +++++ lisp/image.el | 22 +++++++++++++--------- test/lisp/image-tests.el | 23 +++++++++++++++++++++++ 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi index a38569f7263..4b10788862e 100644 --- a/doc/lispref/display.texi +++ b/doc/lispref/display.texi @@ -5992,7 +5992,8 @@ Decrease the image size (@code{image-increase-size}). A prefix value of @samp{4} means to decrease the size by 40%. The default is 20%. @item r -Rotate the image by 90 degrees (@code{image-rotate}). +Rotate the image by 90 degrees clockwise (@code{image-rotate}). +A prefix means to rotate by 90 degrees counter-clockwise instead. @item o Save the image to a file (@code{image-save}). diff --git a/etc/NEWS b/etc/NEWS index 62418f998c1..41debac50e0 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2257,6 +2257,11 @@ The image parameters 'image-transform-rotation', buffer-local, so each buffer could have its own values for these parameters. ++++ +*** The command 'image-rotate' now accepts a prefix argument. +With a prefix argument, 'image-rotate' now rotates the image at point +90 degrees counter-clockwise, instead of the default clockwise. + ** Modules *** The function 'load' now behaves correctly when loading modules. diff --git a/lisp/image.el b/lisp/image.el index b58b1dc9542..c3e28655c38 100644 --- a/lisp/image.el +++ b/lisp/image.el @@ -1028,16 +1028,20 @@ default is 20%." (display-width (car (image-size image t)))) (/ (float display-width) image-width))) -(defun image-rotate () - "Rotate the image under point by 90 degrees clockwise." - (interactive) +(defun image-rotate (&optional angle) + "Rotate the image under point by ANGLE degrees clockwise. +If nil, ANGLE defaults to 90. Interactively, rotate the image 90 +degrees clockwise with no prefix argument, and counter-clockwise +with a prefix argument. Note that most image types support +rotations by only multiples of 90 degrees." + (interactive (and current-prefix-arg '(-90))) (let ((image (image--get-imagemagick-and-warn))) - (plist-put (cdr image) :rotation - (float (mod (+ (or (plist-get (cdr image) :rotation) 0) 90) - ;; We don't want to exceed 360 degrees - ;; rotation, because it's not seen as valid - ;; in exif data. - 360))))) + (setf (image-property image :rotation) + (float (mod (+ (or (image-property image :rotation) 0) + (or angle 90)) + ;; We don't want to exceed 360 degrees rotation, + ;; because it's not seen as valid in Exif data. + 360))))) (defun image-save () "Save the image under point." diff --git a/test/lisp/image-tests.el b/test/lisp/image-tests.el index 5a5b8ea1f71..01c81e3022f 100644 --- a/test/lisp/image-tests.el +++ b/test/lisp/image-tests.el @@ -21,6 +21,8 @@ (require 'ert) (require 'image) +(eval-when-compile + (require 'cl-lib)) (defconst image-tests--emacs-images-directory (expand-file-name "../etc/images" (getenv "EMACS_TEST_DIRECTORY")) @@ -53,4 +55,25 @@ (expand-file-name "splash.svg" image-tests--emacs-images-directory))))) +(ert-deftest image-rotate () + "Test `image-rotate'." + (cl-letf* ((image (list 'image)) + ((symbol-function 'image--get-imagemagick-and-warn) + (lambda () image))) + (let ((current-prefix-arg '(4))) + (call-interactively #'image-rotate)) + (should (equal image '(image :rotation 270.0))) + (call-interactively #'image-rotate) + (should (equal image '(image :rotation 0.0))) + (image-rotate) + (should (equal image '(image :rotation 90.0))) + (image-rotate 0) + (should (equal image '(image :rotation 90.0))) + (image-rotate 1) + (should (equal image '(image :rotation 91.0))) + (image-rotate 1234.5) + (should (equal image '(image :rotation 245.5))) + (image-rotate -154.5) + (should (equal image '(image :rotation 91.0))))) + ;;; image-tests.el ends here -- 2.39.2