hayro_cmap/bcmap/
embedded.rs1use std::ops::Range;
2use std::sync::LazyLock;
3
4use super::huffman::{self, HuffmanTable};
5use super::reader::Reader;
6use crate::CMapName;
7
8pub(super) static BUNDLE: LazyLock<Bundle> = LazyLock::new(|| {
9 let compressed = include_bytes!("../../assets/cmaps.brotli");
13 let mut decompressed = Vec::new();
14 let mut reader = compressed.as_slice();
15
16 brotli::BrotliDecompress(&mut reader, &mut decompressed)
17 .ok()
18 .unwrap();
19
20 let mut reader = Reader::new(&decompressed);
21 let huff_size = reader.read_u32().unwrap() as usize;
22 let huff_data = reader.read_bytes(huff_size).unwrap();
23 let (delta_table, count_table) = huffman::decode_tables(huff_data).unwrap();
24
25 let mut entries = Vec::new();
26
27 while !reader.at_end() {
28 let start = reader.position();
29
30 reader.read_bytes(6).unwrap();
32 let file_len = reader.read_u32().unwrap() as usize;
33
34 reader.read_bytes(file_len - 10).unwrap();
35 entries.push(start..start + file_len);
36 }
37
38 Bundle {
39 data: decompressed,
40 delta_table,
41 count_table,
42 entries,
43 }
44});
45
46pub(super) struct Bundle {
47 data: Vec<u8>,
48 pub(super) delta_table: HuffmanTable,
49 pub(super) count_table: HuffmanTable,
50 entries: Vec<Range<usize>>,
51}
52
53pub fn load_embedded(name: CMapName<'_>) -> Option<&'static [u8]> {
55 let idx = match name {
58 CMapName::N83pvRksjH => 0,
59 CMapName::N90msRksjH => 1,
60 CMapName::N90msRksjV => 2,
61 CMapName::N90mspRksjH => 3,
62 CMapName::N90mspRksjV => 4,
63 CMapName::N90pvRksjH => 5,
64 CMapName::AddRksjH => 6,
65 CMapName::AddRksjV => 7,
66 CMapName::AdobeCns1Ucs2 => 8,
67 CMapName::AdobeGb1Ucs2 => 9,
68 CMapName::AdobeJapan1Ucs2 => 10,
69 CMapName::AdobeKorea1Ucs2 => 11,
70 CMapName::B5pcH => 12,
71 CMapName::B5pcV => 13,
72 CMapName::CnsEucH => 14,
73 CMapName::CnsEucV => 15,
74 CMapName::ETenB5H => 16,
75 CMapName::ETenB5V => 17,
76 CMapName::ETenmsB5H => 18,
77 CMapName::ETenmsB5V => 19,
78 CMapName::EucH => 20,
79 CMapName::EucV => 21,
80 CMapName::ExtRksjH => 22,
81 CMapName::ExtRksjV => 23,
82 CMapName::GbEucH => 24,
83 CMapName::GbEucV => 25,
84 CMapName::GbkEucH => 26,
85 CMapName::GbkEucV => 27,
86 CMapName::Gbk2kH => 28,
87 CMapName::Gbk2kV => 29,
88 CMapName::GbkpEucH => 30,
89 CMapName::GbkpEucV => 31,
90 CMapName::GbpcEucH => 32,
91 CMapName::GbpcEucV => 33,
92 CMapName::H => 34,
93 CMapName::HKscsB5H => 35,
94 CMapName::HKscsB5V => 36,
95 CMapName::IdentityH => 37,
96 CMapName::IdentityV => 38,
97 CMapName::KscEucH => 39,
98 CMapName::KscEucV => 40,
99 CMapName::KscmsUhcH => 41,
100 CMapName::KscmsUhcHwH => 42,
101 CMapName::KscmsUhcHwV => 43,
102 CMapName::KscmsUhcV => 44,
103 CMapName::KscpcEucH => 45,
104 CMapName::UniCnsUcs2H => 46,
105 CMapName::UniCnsUcs2V => 47,
106 CMapName::UniCnsUtf16H => 48,
107 CMapName::UniCnsUtf16V => 49,
108 CMapName::UniGbUcs2H => 50,
109 CMapName::UniGbUcs2V => 51,
110 CMapName::UniGbUtf16H => 52,
111 CMapName::UniGbUtf16V => 53,
112 CMapName::UniJisUcs2H => 54,
113 CMapName::UniJisUcs2HwH => 55,
114 CMapName::UniJisUcs2HwV => 56,
115 CMapName::UniJisUcs2V => 57,
116 CMapName::UniJisUtf16H => 58,
117 CMapName::UniJisUtf16V => 59,
118 CMapName::UniKsUcs2H => 60,
119 CMapName::UniKsUcs2V => 61,
120 CMapName::UniKsUtf16H => 62,
121 CMapName::UniKsUtf16V => 63,
122 CMapName::V => 64,
123 CMapName::Custom(_) => return None,
124 };
125
126 let range = BUNDLE.entries.get(idx)?;
127
128 Some(&BUNDLE.data[range.clone()])
129}