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:
parent
6b882ea353
commit
b728620a75
4 changed files with 43 additions and 10 deletions
|
|
@ -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}).
|
||||
|
|
|
|||
5
etc/NEWS
5
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.
|
||||
|
|
|
|||
|
|
@ -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."
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue