GNU bug report logs -
#40845
SVG rendering issues
Previous Next
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
On Sat, Apr 25, 2020 at 12:20 PM Clément Pit-Claudel
<cpitclaudel <at> gmail.com> wrote:
>
> Hi all,
>
> As discussed on the mailing list, a number of issues currently exist with our SVG rendering implementation. I have tried to summarize the ones I'm aware of in the following example.
>
> (with-current-buffer (get-buffer-create "*svg bugs*")
> (erase-buffer)
> (require 'face-remap)
> (setq text-scale-mode-amount 10)
> (text-scale-mode)
> (let ((svg (svg-create 16 16)))
> (svg-ellipse svg 8 8 4 4)
> (insert "Text: ")
> (print (svg-image svg :ascent 100))
> (insert-image (svg-image svg :ascent 100))
> (insert-image (svg-image svg :scale 5.0 :ascent 'center :foreground "red" :background "darkgreen"))
> (add-text-properties
> (point-min) (point-max)
> '(face (:foreground "orange" :background "purple")
> mouse-face '(:foreground "purple" :background "orange"))))
> (pop-to-buffer (current-buffer)))
>
> The issues:
>
> 1. Manually scaling an image, as is done for the second image, doesn't re-render the svg: is scales the bitmap-rendered version of it, causing blurriness.
> 2. The SVG images don't inherit the background of the current face; instead, they inherit the background of the default face.
> 3. The SVG images don't inherit the foreground of the current face; instead, they use a black foreground.
> 4. The :foreground keyword has no effect on svg images.
> 5. The images are not scaled with the text: changing text-scale-mode-amount doesn't change the size of the images.
I would like to add
6. When the cursor is over an SVG image, it is displayed with a box
around it rather than with inverted video as characters are.
I've played around a while ago in an attempt to fix these issues, and
be able to define "character-like" SVG glyphs. My approach was to add
a display spec of the form (gen FN), which calls FN with the current
face parameters as arguments whenever redisplaying the spec, then uses
the return value (an image spec) as the actual spec to be displayed.
It's probably quite slow, but (as of June last) it works, even when
displaying the same buffer twice. Calling elisp from the redisplay
engine is, of course, something we don't really want to have more of,
but we'd do so anyway for a `when' spec (in fact, an alternative
approach to get this working with old Emacsen was to abuse a `when'
spec to set the image spec correctly).
The attached patch, IIRC, is the main part. As you can see, it leaves
most of the work to the Lisp side of things. It can fix all issues
mentioned above by modifying the SVG as required.
Also, IIRC, 3 is an rsvg issue.
[gen.diff (text/x-patch, attachment)]
This bug report was last modified 4 years and 270 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.