Fix SVG CSS handling (bug#80384)

This reverts commit 9f5d17cd72, but
includes the fix for adding user CSS after the generated CSS.

* src/image.c (svg_load_image): Set the CSS stylesheet using the librsvg
functions, instead of inserting it into the wrapper.
This commit is contained in:
Alan Third 2026-02-12 18:30:30 +00:00
parent f3555fc846
commit 7478e6ae7d

View file

@ -12156,6 +12156,31 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
rsvg_handle_set_dpi_x_y (rsvg_handle, FRAME_DISPLAY_INFO (f)->resx,
FRAME_DISPLAY_INFO (f)->resy);
#if LIBRSVG_CHECK_VERSION (2, 48, 0)
Lisp_Object user_css = image_spec_value (img->spec, QCcss, NULL);
if (!STRINGP (user_css))
user_css = make_string("", 0);
/* Generate the CSS for the SVG image.
We use this to set the font (font-family in CSS lingo) and the font
size. We can extend this to handle any CSS values SVG supports,
however it's only available in librsvg 2.48 and above so some
things we could set here are handled in the wrapper below. */
Lisp_Object css = make_formatted_string ("svg{"
" font-family: \"%s\";"
" font-size:%dpx;"
"}"
"%s",
img->face_font_family,
img->face_font_size,
SDATA(user_css));
rsvg_handle_set_stylesheet (rsvg_handle, (guint8 *) SDATA (css),
SBYTES (css), NULL);
#endif
#else
/* Make a handle to a new rsvg object. */
rsvg_handle = rsvg_handle_new ();
@ -12323,9 +12348,9 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
static char const wrapper[] =
"<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" "
"xmlns:xi=\"http://www.w3.org/2001/XInclude\" "
"style=\"color: #%06X;\" "
"width=\"%d\" height=\"%d\" preserveAspectRatio=\"none\" "
"viewBox=\"0 0 %f %f\">"
"<style>%s</style>"
"<rect width=\"100%%\" height=\"100%%\" fill=\"#%06X\"/>"
"<xi:include href=\"data:image/svg+xml;base64,%s\"></xi:include>"
"</svg>";
@ -12354,33 +12379,10 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
#endif
unsigned int color = foreground & 0xFFFFFF, fill = background & 0xFFFFFF;
Lisp_Object user_css = image_spec_value (img->spec, QCcss, NULL);
if (!STRINGP (user_css))
user_css = make_string("", 0);
/* Generate the CSS for the SVG image.
We use this to set the "current color", font (font-family in CSS
lingo) and the font size. We can extend this to handle any CSS
values SVG supports. We append the user CSS, which should allow
the user to over-ride anything we set in our defaults. This gets
inserted in the SVG's style element. */
Lisp_Object css = make_formatted_string ("svg{"
" font-family: \"%s\";"
" font-size: %dpx;"
" color: #%06X;"
"}"
"%s",
img->face_font_family,
img->face_font_size,
color, SDATA(user_css));
wrapped_contents
= make_formatted_string (wrapper, width, height,
= make_formatted_string (wrapper, color, width, height,
viewbox_width, viewbox_height,
SDATA(css), fill,
SSDATA (encoded_contents));
fill, SSDATA (encoded_contents));
}
/* Now we parse the wrapped version. */
@ -12402,6 +12404,13 @@ svg_load_image (struct frame *f, struct image *img, char *contents,
rsvg_handle_set_dpi_x_y (rsvg_handle, FRAME_DISPLAY_INFO (f)->resx,
FRAME_DISPLAY_INFO (f)->resy);
#if LIBRSVG_CHECK_VERSION (2, 48, 0)
/* Set the CSS for the wrapped SVG. See the comment above the
previous use of 'css'. */
rsvg_handle_set_stylesheet (rsvg_handle, (guint8 *) SDATA (css),
SBYTES (css), NULL);
#endif
#else
/* Make a handle to a new rsvg object. */
rsvg_handle = rsvg_handle_new ();