emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Image transforms as a benchmark?


From: Arthur Miller
Subject: Image transforms as a benchmark?
Date: Sun, 12 Sep 2021 13:45:39 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux)

I tried to make another little benchmark, I saw with optimization flags, that
quite some loops have got unrolled and vectorized in image.c, so I wanted to see
if it matters when doing some transforms on images. I tested so far just with
svg.

I wonder if image-rotate is handled completely by external libraries? I see
no effect on performance, regardless of how many time I rotate some image. Is it
same situation for scaling down? I see big difference when scaling up images so
I guess that is handled by Emacs own code?

#+begin_src emacs-lisp
(require 'svg)

(defun svg-position (image)
  "Return buffer position of the svg image."
  (let ((marker (cdr (assoc :image (car-safe (cdr image))))))
    (when (markerp marker)
      (marker-position marker))))

(defun svg-image-rotate (svg &optional angle)
  (let ((image (image--get-image (svg-position svg))))
    (setf (image-property image :rotation)
          (float (mod (+ (or (image-property image :rotation) 0)
                         (or angle 90))
                      360)))))

(defun svg-increase-size ()
  (with-temp-buffer
    (let ((svg (svg-create 10 10))
          (max-image-size t))
      (svg-rectangle svg 0 0 10 10)
      (svg-insert-image svg)
      (dotimes (_ 40)
      ;; use internal image--change-size
      ;; to bypass the optimization with idle-timer.
        (image--change-size
         (1+ (/ (prefix-numeric-value 2) 10.0))
         (svg-position svg))))))

(defun svg-decrease-size ()
  (with-temp-buffer
    (let ((svg (svg-create 10 10)))
      (svg-rectangle svg 0 0 10 10)
      (svg-insert-image svg)
      (dotimes (_ 20)
        (image--change-size
         (- 1 (/ (prefix-numeric-value 0.1) 10.0))
         (svg-position svg))))))
#+end_src



reply via email to

[Prev in Thread] Current Thread [Next in Thread]