🐛 Export svg-raw shapes through WASM SVG draw_svg (#11567)

SVG export treated SVGRaw like a fill/stroke leaf and never called
draw_svg, so imported SVG content exported as an empty document.

Relates to #10546
This commit is contained in:
Alejandro Alonso 2026-09-09 11:16:01 +02:00 committed by GitHub
parent 91860f6916
commit e67ebacef2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 52 additions and 0 deletions

View File

@ -209,6 +209,20 @@ pub(super) fn add_group(
}
}
/// SVG-raw leaf with markup (same form `get-static-markup` uploads to WASM).
pub(super) fn add_svg_raw(
pool: &mut ShapesPool,
id: Uuid,
parent: Uuid,
(l, t, r, b): (f32, f32, f32, f32),
content: &str,
) {
let shape = pool.add_shape(id);
shape.set_parent(parent);
shape.set_svg_raw_content(content.to_string());
shape.set_selrect(l, t, r, b);
}
/// Adds a single-line text shape using the embedded default font.
pub(super) fn add_solid_text(
pool: &mut ShapesPool,

View File

@ -194,6 +194,14 @@ fn render_leaf(
{
if matches!(element.shape_type, Type::Text(_)) {
render_text_fill(builder, shared, element)?;
} else if matches!(element.shape_type, Type::SVGRaw(_)) {
let matrix = element.centered_transform();
let canvas = builder.canvas();
canvas.save();
canvas.concat(&matrix);
let mut renderer = VectorRenderer::new(canvas, shared, scale, false);
renderer.draw_svg(element)?;
canvas.restore();
} else {
emit_fills(builder, shared, element, &element.fills, tree, scale)?;

View File

@ -125,6 +125,36 @@ fn exports_a_group_with_two_rects_and_group_opacity() {
insta::assert_snapshot!(svg);
}
#[test]
fn loads_svg_raw_dom_like_wasm_upload() {
// Production paints svg-raw via Dom::render after set_shape_svg_raw_content.
// Native SkSVGCanvas does not serialize those draws, so the export string
// stays empty here; we assert Dom parse + that export does not panic.
let mut pool = ShapesPool::new();
let id = uid(1);
add_svg_raw(
&mut pool,
id,
Uuid::nil(),
(0.0, 0.0, 307.0, 243.0),
concat!(
r#"<svg xmlns="http://www.w3.org/2000/svg">"#,
r#"<text x="10" y="24" fill="black">HOLA</text>"#,
r#"</svg>"#,
),
);
let resources = crate::render::RenderResources::try_new_headless().expect("headless");
let font_manager = skia::FontMgr::from(resources.fonts.font_provider().clone());
{
let shape = pool.get_mut(&id).unwrap();
shape.update_svg_raw_content(font_manager);
assert!(shape.svg.is_some(), "Dom must parse like WASM upload");
}
let _svg = render(&pool, id);
}
#[test]
fn exports_a_clipped_frame_with_overflowing_child() {
let mut pool = ShapesPool::new();