From 7478e6ae7d047abd19263578605e64df714f5a43 Mon Sep 17 00:00:00 2001 From: Alan Third Date: Thu, 12 Feb 2026 18:30:30 +0000 Subject: [PATCH] Fix SVG CSS handling (bug#80384) This reverts commit 9f5d17cd7219f72066488c6c57f77e4db9ca2563, 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. --- src/image.c | 61 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/src/image.c b/src/image.c index c81da7e7b25..8dfab77ce43 100644 --- a/src/image.c +++ b/src/image.c @@ -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[] = "" - "" "" "" ""; @@ -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 ();