cn_font_split/pre_subset/features/
cmap.rs

1use 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    // GSUB
13    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                // e.glyph_ids.iter().enumerate().for_each(|(index, glyph_id)| {
27                //     // 因为这个固定是由 0x80 开始的
28                //     cmap.insert(0x80 + glyph_id.clone() as u32, index as u32).unwrap();
29                // })
30                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}