From f4c5f71bfcdb0382437d487303743811480aa226 Mon Sep 17 00:00:00 2001 From: Nico Burns Date: Mon, 29 Jul 2024 15:09:16 +1200 Subject: [PATCH] Render text + fix transforms (#26) Fixes #16 This enables naive text rendering support using usvg's support for flattening text into paths. It also fixes application of transform for nested SVGs. With this patch, `vello_svg` can now render the "badges" from the Xilem README: Screenshot 2024-07-29 at 11 14 21 --- CHANGELOG.md | 8 ++++++++ src/lib.rs | 3 ++- src/render.rs | 12 +++++++----- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 430e57f..993a3c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,14 @@ Subheadings to categorize changes are `added, changed, deprecated, removed, fixe This release has an [MSRV][] of 1.75. +### Added + +- Support for rendering basic text + +### Fixed + +- Transform of nested SVGs + ## 0.3.0 This release has an [MSRV][] of 1.75. diff --git a/src/lib.rs b/src/lib.rs index 037f5ce..6129a9e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -35,6 +35,7 @@ pub use vello; /// Re-export usvg. pub use usvg; +use vello::kurbo::Affine; /// Render a [`Scene`] from an SVG string, with default error handling. /// @@ -95,5 +96,5 @@ pub fn append_tree_with( svg: &usvg::Tree, error_handler: &mut F, ) { - render::render_group(scene, svg.root(), error_handler); + render::render_group(scene, svg.root(), Affine::IDENTITY, error_handler); } diff --git a/src/render.rs b/src/render.rs index a376803..7cbe233 100644 --- a/src/render.rs +++ b/src/render.rs @@ -2,16 +2,18 @@ // SPDX-License-Identifier: Apache-2.0 OR MIT use crate::util; +use vello::kurbo::Affine; use vello::peniko::{BlendMode, Fill}; use vello::Scene; pub(crate) fn render_group( scene: &mut Scene, group: &usvg::Group, + transform: Affine, error_handler: &mut F, ) { for node in group.children() { - let transform = util::to_affine(&node.abs_transform()); + let transform = transform * util::to_affine(&node.abs_transform()); match node { usvg::Node::Group(g) => { let mut pushed_clip = false; @@ -32,7 +34,7 @@ pub(crate) fn render_group( } } - render_group(scene, g, error_handler); + render_group(scene, g, Affine::IDENTITY, error_handler); if pushed_clip { scene.pop_layer(); @@ -110,12 +112,12 @@ pub(crate) fn render_group( scene.draw_image(&image, image_ts); } usvg::ImageKind::SVG(svg) => { - render_group(scene, svg.root(), error_handler); + render_group(scene, svg.root(), transform, error_handler); } } } - usvg::Node::Text(_) => { - error_handler(scene, node); + usvg::Node::Text(text) => { + render_group(scene, text.flattened(), transform, error_handler); } } }