mirror of
https://github.com/Xevion/time-banner.git
synced 2025-12-14 10:13:23 -06:00
Rewrite into encapsulated struct (maintain fontdb)
This commit is contained in:
@@ -42,7 +42,9 @@ async fn main() {
|
||||
|
||||
// basic handler that responds with a static string
|
||||
async fn root_handler(connect_info: ConnectInfo<SocketAddr>) -> 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()
|
||||
|
||||
32
src/svg.rs
32
src/svg.rs
@@ -17,33 +17,39 @@ impl std::fmt::Display for RenderError {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get() -> Result<Vec<u8>, 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
|
||||
}
|
||||
}
|
||||
|
||||
pub fn render(&self, svg_data: &[u8]) -> Result<Vec<u8>, 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(&fontdb);
|
||||
tree.convert_text(&self.font_db);
|
||||
|
||||
resvg::Tree::from_usvg(&tree)
|
||||
};
|
||||
|
||||
let pixmap_size = rtree.size.to_int_size();
|
||||
let pixmap_size = tree.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());
|
||||
tree.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()) })
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 149 B After Width: | Height: | Size: 149 B |
Reference in New Issue
Block a user