quad_svg/
lib.rs

1use macroquad::{prelude::ImageFormat, texture::Texture2D};
2use resvg::usvg_text_layout::{fontdb, TreeTextToPath};
3
4/*
5    TODO: include font file in package to not rely on system fonts
6*/
7
8/*
9    rasterize svg to png image
10*/
11pub fn svg_to_png(svg_str: &str) -> Vec<u8> {
12    let opt = resvg::usvg::Options::default();
13    let mut tree = resvg::usvg::Tree::from_str(svg_str, &opt).unwrap();
14    let mut fontdb = fontdb::Database::new();
15    fontdb.load_system_fonts();
16    tree.convert_text(&fontdb, opt.keep_named_groups);
17    let pixmap_size = tree.size.to_screen_size();
18    let mut pixmap =
19        resvg::tiny_skia::Pixmap::new(pixmap_size.width(), pixmap_size.height()).unwrap();
20
21    resvg::render(
22        &tree,
23        resvg::usvg::FitTo::Original,
24        resvg::tiny_skia::Transform::default(),
25        pixmap.as_mut(),
26    )
27    .unwrap();
28    pixmap.encode_png().unwrap()
29}
30
31/*
32    rasterize svg and create Texture2D
33*/
34pub fn svg_to_texture(svg_str: &str) -> Texture2D {
35    let png_data = svg_to_png(&svg_str);
36    Texture2D::from_file_with_format(&png_data, Some(ImageFormat::Png))
37}