mirror of
https://github.com/Xevion/time-banner.git
synced 2025-12-15 18:13:26 -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
|
// basic handler that responds with a static string
|
||||||
async fn root_handler(connect_info: ConnectInfo<SocketAddr>) -> impl IntoResponse {
|
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() {
|
if raw_image.is_err() {
|
||||||
return Response::builder()
|
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> {
|
pub struct Renderer {
|
||||||
let rtree = {
|
font_db: fontdb::Database,
|
||||||
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()));
|
|
||||||
|
|
||||||
|
impl Renderer {
|
||||||
|
pub fn new() -> Self {
|
||||||
let mut fontdb = fontdb::Database::new();
|
let mut fontdb = fontdb::Database::new();
|
||||||
fontdb.load_system_fonts();
|
fontdb.load_system_fonts();
|
||||||
fontdb.load_fonts_dir("./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);
|
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()) }); }
|
if tree_result.is_err() { return Err(RenderError { message: Some("Failed to parse".to_string()) }); }
|
||||||
|
|
||||||
|
|
||||||
let tree = tree_result.as_mut().unwrap();
|
let tree = tree_result.as_mut().unwrap();
|
||||||
tree.convert_text(&fontdb);
|
tree.convert_text(&self.font_db);
|
||||||
|
|
||||||
resvg::Tree::from_usvg(&tree)
|
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();
|
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