From f720cb6daa6859874837328d4fe659d81f7c1ab0 Mon Sep 17 00:00:00 2001 From: Xevion Date: Fri, 16 Jun 2023 23:05:45 -0500 Subject: [PATCH] Rewrite into encapsulated struct (maintain fontdb) --- src/main.rs | 4 ++- src/svg.rs | 44 ++++++++++++++++------------- test.svg => src/templates/basic.svg | 0 3 files changed, 28 insertions(+), 20 deletions(-) rename test.svg => src/templates/basic.svg (100%) diff --git a/src/main.rs b/src/main.rs index 20cd081..ac3b6e1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,7 +42,9 @@ async fn main() { // basic handler that responds with a static string async fn root_handler(connect_info: ConnectInfo) -> impl IntoResponse { - let raw_image = svg::get(); + let renderer = svg::Renderer::new(); + let data = include_bytes!("./templates/basic.svg"); + let raw_image = renderer.render(data); if raw_image.is_err() { return Response::builder() diff --git a/src/svg.rs b/src/svg.rs index b649019..285f459 100644 --- a/src/svg.rs +++ b/src/svg.rs @@ -17,33 +17,39 @@ impl std::fmt::Display for RenderError { } } -pub fn get() -> Result, RenderError> { - let rtree = { - let mut opt = usvg::Options::default(); - // Get file's absolute directory. - opt.resources_dir = std::fs::canonicalize("") - .ok() - .and_then(|p| p.parent().map(|p| p.to_path_buf())); +pub struct Renderer { + font_db: fontdb::Database, +} +impl Renderer { + pub fn new() -> Self { let mut fontdb = fontdb::Database::new(); fontdb.load_system_fonts(); fontdb.load_fonts_dir("./fonts"); - let svg_data = include_bytes!("../test.svg"); + Self { + font_db: fontdb + } + } - let mut tree_result = usvg::Tree::from_data(svg_data, &opt); - if tree_result.is_err() { return Err(RenderError { message: Some("Failed to parse".to_string()) }); } + pub fn render(&self, svg_data: &[u8]) -> Result, RenderError> { + let tree = { + let mut opt = usvg::Options::default(); + let mut tree_result = usvg::Tree::from_data(svg_data, &opt); + if tree_result.is_err() { return Err(RenderError { message: Some("Failed to parse".to_string()) }); } + let tree = tree_result.as_mut().unwrap(); + tree.convert_text(&self.font_db); - let tree = tree_result.as_mut().unwrap(); - tree.convert_text(&fontdb); + resvg::Tree::from_usvg(&tree) + }; - resvg::Tree::from_usvg(&tree) - }; + let pixmap_size = tree.size.to_int_size(); + let mut pixmap = tiny_skia::Pixmap::new(pixmap_size.width(), pixmap_size.height()).unwrap(); + tree.render(tiny_skia::Transform::default(), &mut pixmap.as_mut()); - let pixmap_size = rtree.size.to_int_size(); - let mut pixmap = tiny_skia::Pixmap::new(pixmap_size.width(), pixmap_size.height()).unwrap(); - rtree.render(tiny_skia::Transform::default(), &mut pixmap.as_mut()); - - pixmap.encode_png().map_err(|_| RenderError { message: Some("Failed to encode".to_string()) }) + pixmap + .encode_png() + .map_err(|_| RenderError { message: Some("Failed to encode".to_string()) }) + } } \ No newline at end of file diff --git a/test.svg b/src/templates/basic.svg similarity index 100% rename from test.svg rename to src/templates/basic.svg