use image::Rgb;
use rusttype::Scale;
use crate::{
geometry::Rectangle,
visualization::{Canvas, Image},
words::FontProvider,
};
pub struct CanvasRenderer {}
impl CanvasRenderer {
pub fn render(
font_provider: &FontProvider,
viewport: &Rectangle,
canvas: &Canvas,
bg_color: Rgb<u8>,
) -> Image {
let mut img = Image::new(viewport.x2(), viewport.y2(), Some(bg_color));
for word in canvas.list() {
if cfg!(debug_assertions) {
println!(
"Drawing word '{}' at [{}, {}]",
word.text, word.pos.0, word.pos.1
);
}
let scale = Scale::uniform(word.size as f32);
let Ok(font) = font_provider.get_font(&word.font_name) else {
panic!("Font not found: {}", word.font_name);
};
img.draw_text(
(word.pos.0 as i32, word.pos.1 as i32),
&word.text,
font,
scale,
word.color,
&word.orientation,
);
if cfg!(debug_assertions) {
let r = font
.get_bounding_box(word, scale)
.displace(word.pos.0 as isize, word.pos.1 as isize)
.unwrap();
img.draw_rect(
r.pos().0 as i32,
r.pos().1 as i32,
r.size().0,
r.size().1,
Rgb([255, 0, 0]),
);
}
}
img
}
pub fn save(
font_provider: &FontProvider,
viewport: &Rectangle,
canvas: &Canvas,
filename: &str,
bg_color: Rgb<u8>,
) {
let img = Self::render(font_provider, viewport, canvas, bg_color);
img.save(filename).unwrap();
}
}