bug-gnu-emacs
[Top][All Lists]
Advanced

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

bug#67533: SVG images confound position pixel measurements


From: JD Smith
Subject: bug#67533: SVG images confound position pixel measurements
Date: Wed, 29 Nov 2023 15:31:43 -0500

(As posted on emacs-devel)
++++++++++++++++++++++

In developing a new pixel-precise smooth scrolling mode, I’ve noticed that 
inline SVG images confuse Emacs regarding pixel positions of surrounding 
elements.  You sometimes also experience this while visiting SVG image-rich 
files (think org-latex-preview) while in visual line mode.  In this case, 
previous/next-line sometimes jump from one side of the window to the other.  

But it’s easiest to reproduce with line-truncation in effect.  Run the snippet 
below with your frame either expanded wide enough to accommodate the full width 
of the 1st line of text, or too narrow (eliciting truncation).  While truly 
truncated and with point on the SVG, pixel text measurements above are 
erroneous (reporting zero pixel height above), as if it thinks it’s on the 
prior line.  At other points in line 2, the pixel-size values are correct.  

This erroneous pixel size/position result occurs whether the image appears via 
an overlay or a text-property.

Tested in Emacs 29.1 NS and Mac ports.

Small update:  this only occurs when the image is at the start of the line.  
And PNG images exhibit the same issue.

+++++++

;;; test-svg-pixel-position --- test pixel position for SVG images

;;; This small code creates a buffer with two lines, the first of
;;; which is long, and the second of which has an SVG image at start.
;;; Line truncation is turned on.  `window-text-pixel-size` returns
;;; differing results depending on whether truncation is actually in
;;; effect (alter the frame width to see this).

;;; Code:
(require 'svg)
(let ((buf "svg-pixel-demo")
     (svg (svg-create 50 25)))
 (svg-circle svg 25 25 25 :stroke-color "green")
 (with-current-buffer (get-buffer-create buf)
   (erase-buffer)
   (insert "Pellentesque condimentum, magna ut suscipit hendrerit, ipsum augue 
ornare nulla, non luctus diam neque sit amet urna.\n")
   (insert (propertize "THISISACIRCLE" 'display (svg-image svg)))
   (insert " Aliquam posuere.\n")
   (pop-to-buffer buf)
   (goto-char (point-max))
   (forward-line -1)
   (toggle-truncate-lines 1)
   (message "PIXEL SIZE OF LINE ABOVE IMAGE: %S"
             (window-text-pixel-size nil (cons (point) -1) (point) nil nil nil 
t))))




reply via email to

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