Skip to main content

handmade/text/
images_map.rs

1use std::{rc::Rc, cell::{RefCell}, collections::HashMap};
2use image::RgbaImage;
3
4use super::{Letter, PageProps, CHARS};
5
6
7#[derive(Debug)]
8pub struct ImagesMap<'a> {
9    map: RefCell<HashMap<String, Rc<RgbaImage>>>,
10    page_props: &'a PageProps<'a>,
11    dic_name: Option<&'a str>
12}
13
14impl<'a> ImagesMap<'a> {
15    pub fn new(page_props: &'a PageProps<'a>) -> ImagesMap {
16        ImagesMap {
17            map: RefCell::new(HashMap::new()),
18            page_props,
19            dic_name: None
20        }
21    }
22
23    pub fn new_with_dic_name(page_props: &'a PageProps<'a>, dic_name: &'a str) -> ImagesMap<'a> {
24        ImagesMap {
25            map: RefCell::new(HashMap::new()),
26            page_props,
27            dic_name: Some(dic_name)
28        }
29    }
30
31    pub fn keygen(letter : char) -> String {
32        Letter::char_name(letter)
33    }
34
35    pub fn insert_letter(&self, letter : char) {
36        let key = ImagesMap::keygen(letter);
37        let image = Letter::get_resized_image(letter, self.page_props.line_height, &self.dic_name);
38        self.map.borrow_mut().insert(key, Rc::new(image));
39    }
40
41    pub fn populate(&self) {
42        for letter in CHARS.iter() {
43            self.insert_letter(*letter);
44            self.insert_letter(letter.to_lowercase().next().unwrap());
45        }
46    }
47
48    pub fn get(&self, letter : char) -> Option<Rc<RgbaImage>> {
49        let key = ImagesMap::keygen(letter);
50        self.map.borrow().get(&key).map(|i| Rc::clone(i))
51    }
52}