handmade/text/
images_map.rs1use 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}