On Sat, Apr 25, 2020 at 12:20 PM Clément Pit-Claudel 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.