vello_svg API Reference
Overview
vello_svg converts SVG content into vello Scene objects for GPU-accelerated rendering. Simple API: string in, Scene out.
Quick Reference
| Function | Input | Output | Error Handler |
|---|---|---|---|
render(svg) | &str | Result<Scene, Error> | Default (red boxes) |
append(scene, svg) | &mut Scene, &str | Result<(), Error> | Default |
append_with(scene, svg, handler) | &mut Scene, &str, FnMut | Result<(), Error> | Custom |
render_tree(tree) | &usvg::Tree | Scene | Default |
append_tree(scene, tree) | &mut Scene, &usvg::Tree | () | Default |
append_tree_with(scene, tree, handler) | &mut Scene, &usvg::Tree, FnMut | () | Custom |
Re-exports
rust
// Use these for version compatibility use vello_svg::vello; // vello crate (0.7.0) use vello_svg::usvg; // usvg crate (0.46.0) use vello_svg::Error; // wraps usvg::Error
Common Patterns
Basic rendering
rust
let scene = vello_svg::render(svg_string)?;
Append to existing scene
rust
let mut scene = vello_svg::vello::Scene::new(); vello_svg::append(&mut scene, svg_string)?;
Pre-parsed tree (custom usvg options)
rust
use vello_svg::usvg; let tree = usvg::Tree::from_str(svg_string, &usvg::Options::default())?; let scene = vello_svg::render_tree(&tree);
Custom error handling
rust
// Handler signature: FnMut(&mut Scene, &usvg::Node)
// Node variants: Group, Path, Image, Text
// bounding_box() returns usvg::Rect with left(), top(), right(), bottom(), width(), height()
vello_svg::append_with(&mut scene, svg_string, &mut |_scene, node| {
let bb = node.bounding_box();
eprintln!("Unsupported at ({}, {}) size {}x{}",
bb.left(), bb.top(), bb.width(), bb.height());
});
Unsupported SVG Features
Default handler draws semi-transparent red boxes. Unsupported:
- •Filter effects
- •Masking
- •Patterns
- •Group opacity
- •Mix-blend-modes
- •Complex clipping (single-path clips work)
- •Group background
- •Path shape-rendering
Note: Text elements ARE rendered - usvg flattens them to paths automatically via text.flattened().
Utility Functions (vello_svg::util)
- •
to_affine(&usvg::Transform) -> Affine - •
to_stroke(&usvg::Stroke) -> Stroke - •
to_bez_path(&usvg::Path) -> BezPath - •
to_brush(&usvg::Paint, Opacity) -> Option<(Brush, Affine)> - •
default_error_handler(&mut Scene, &usvg::Node) - •
into_image(image::RgbaImage) -> ImageBrush(requiresimagefeature) - •
decode_raw_raster_image(&usvg::ImageKind) -> Result<RgbaImage, ImageError>(requiresimagefeature)
Feature Flags
toml
[dependencies]
vello_svg = { version = "0.9", features = ["wgpu"] }
# Image formats enabled by default: png, gif, jpeg, webp
# Optional: image (for decode_raw_raster_image)
Common Mistakes
| Mistake | Fix |
|---|---|
| Import vello/usvg separately | Use vello_svg::vello and vello_svg::usvg re-exports |
Look for RenderOptions type | No options struct - use usvg::Options for parsing |
Call render::render_svg_string() | Use vello_svg::render() directly |
Use node.tag() in error handler | Node is an enum - use bounding_box() which returns Rect |
Access bb.x0, bb.y0 on bounding box | Use bb.left(), bb.top(), bb.width(), bb.height() |
| Manually convert text to paths | Not needed - usvg auto-flattens text via text.flattened() |