word_cloud/visualization/
canvas_renderer.rs

1use image::Rgb;
2use rusttype::Scale;
3
4use crate::{
5    geometry::Rectangle,
6    visualization::{Canvas, Image},
7    words::FontProvider,
8};
9
10pub struct CanvasRenderer {}
11
12impl CanvasRenderer {
13    pub fn render(
14        font_provider: &FontProvider,
15        viewport: &Rectangle,
16        canvas: &Canvas,
17        bg_color: Rgb<u8>,
18    ) -> Image {
19        let mut img = Image::new(viewport.x2(), viewport.y2(), Some(bg_color));
20
21        for word in canvas.list() {
22            if cfg!(debug_assertions) {
23                println!(
24                    "Drawing word '{}' at [{}, {}]",
25                    word.text, word.pos.0, word.pos.1
26                );
27            }
28
29            let scale = Scale::uniform(word.size as f32);
30            let Ok(font) = font_provider.get_font(&word.font_name) else {
31                panic!("Font not found: {}", word.font_name);
32            };
33            img.draw_text(
34                (word.pos.0 as i32, word.pos.1 as i32),
35                &word.text,
36                font,
37                scale,
38                word.color,
39                &word.orientation,
40            );
41            if cfg!(debug_assertions) {
42                let r = font
43                    .get_bounding_box(word, scale)
44                    .displace(word.pos.0 as isize, word.pos.1 as isize)
45                    .unwrap();
46
47                img.draw_rect(
48                    r.pos().0 as i32,
49                    r.pos().1 as i32,
50                    r.size().0,
51                    r.size().1,
52                    Rgb([255, 0, 0]),
53                );
54            }
55        }
56
57        img
58    }
59
60    pub fn save(
61        font_provider: &FontProvider,
62        viewport: &Rectangle,
63        canvas: &Canvas,
64        filename: &str,
65        bg_color: Rgb<u8>,
66    ) {
67        let img = Self::render(font_provider, viewport, canvas, bg_color);
68        img.save(filename).unwrap();
69    }
70}