cn_font_split/pre_subset/features/
cmap.rs1use opentype::truetype::tables::character_mapping::{
2 Encoding, Encoding0, Encoding12, Encoding4, Encoding6,
3};
4use opentype::truetype::tables::CharacterMapping;
5use opentype::Font;
6use std::collections::HashMap;
7use std::io::Cursor;
8pub fn analyze_cmap(
9 font: &Font,
10 font_file: &mut Cursor<&[u8]>,
11) -> HashMap<u16, u32> {
12 let data: CharacterMapping = font.take(font_file).unwrap().unwrap();
14 let mut cmap: HashMap<u16, u32> = HashMap::new();
15 fn inject_unicode_glyph_id_map(
16 map: HashMap<u32, u16>,
17 cmap: &mut HashMap<u16, u32>,
18 ) {
19 map.iter().for_each(|(k, v)| {
20 cmap.insert(v.clone(), k.clone() as u32);
21 })
22 }
23 data.encodings.iter().for_each(|e| {
24 match e {
25 Encoding::Format0(e) => {
26 let map = Encoding0::mapping::<u32>(e);
31 inject_unicode_glyph_id_map(map, &mut cmap);
32 }
33 Encoding::Format4(e) => {
34 let map = Encoding4::mapping::<u32>(e);
35 inject_unicode_glyph_id_map(map, &mut cmap)
36 }
37 Encoding::Format6(e) => {
38 let map = Encoding6::mapping::<u32>(e);
39 inject_unicode_glyph_id_map(map, &mut cmap)
40 }
41 Encoding::Format12(e) => {
42 let map = Encoding12::mapping::<u32>(e);
43 inject_unicode_glyph_id_map(map, &mut cmap)
44 }
45 Encoding::Format14(_e) => {}
46 Encoding::Unknown(_e) => {}
47 }
48 });
49 cmap
50}