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.
This commit is contained in:
Basil L. Contovounesios 2019-07-16 22:51:27 +01:00
parent 6b882ea353
commit b728620a75
4 changed files with 43 additions and 10 deletions

View file

@ -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}).

View file

@ -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.

View file

@ -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."

View file

@ -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