word_cloud/visualization/
canvas_renderer.rs1use 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}