ttf_parser/tables/cff/
dict.rs1use core::convert::TryFrom;
2use core::ops::Range;
3
4use crate::Stream;
5
6const TWO_BYTE_OPERATOR_MARK: u8 = 12;
8const END_OF_FLOAT_FLAG: u8 = 0xf;
9
10#[derive(Clone, Copy, Debug)]
11pub struct Operator(pub u16);
12
13impl Operator {
14 #[inline]
15 pub fn get(self) -> u16 { self.0 }
16}
17
18
19pub struct DictionaryParser<'a> {
20 data: &'a [u8],
21 offset: usize,
23 operands_offset: usize,
25 operands: &'a mut [i32],
27 operands_len: u16,
29}
30
31impl<'a> DictionaryParser<'a> {
32 #[inline]
33 pub fn new(data: &'a [u8], operands_buffer: &'a mut [i32]) -> Self {
34 DictionaryParser {
35 data,
36 offset: 0,
37 operands_offset: 0,
38 operands: operands_buffer,
39 operands_len: 0,
40 }
41 }
42
43 #[inline(never)]
44 pub fn parse_next(&mut self) -> Option<Operator> {
45 let mut s = Stream::new_at(self.data, self.offset)?;
46 self.operands_offset = self.offset;
47 while !s.at_end() {
48 let b: u8 = s.read()?;
49 if is_dict_one_byte_op(b) {
51 let mut operator = u16::from(b);
52
53 if b == TWO_BYTE_OPERATOR_MARK {
55 operator = 1200 + u16::from(s.read::<u8>()?);
58 }
59
60 self.offset = s.offset();
61 return Some(Operator(operator));
62 } else {
63 skip_number(b, &mut s)?;
64 }
65 }
66
67 None
68 }
69
70 pub fn parse_operands(&mut self) -> Option<()> {
81 let mut s = Stream::new_at(self.data, self.operands_offset)?;
82 self.operands_len = 0;
83 while !s.at_end() {
84 let b: u8 = s.read()?;
85 if is_dict_one_byte_op(b) {
87 break;
88 } else {
89 let op = parse_number(b, &mut s)?;
90 self.operands[usize::from(self.operands_len)] = op;
91 self.operands_len += 1;
92
93 if usize::from(self.operands_len) >= self.operands.len() {
94 break;
95 }
96 }
97 }
98
99 Some(())
100 }
101
102 #[inline]
103 pub fn operands(&self) -> &[i32] {
104 &self.operands[..usize::from(self.operands_len)]
105 }
106
107 #[inline]
108 pub fn parse_offset(&mut self) -> Option<usize> {
109 self.parse_operands()?;
110 let operands = self.operands();
111 if operands.len() == 1 {
112 usize::try_from(operands[0]).ok()
113 } else {
114 None
115 }
116 }
117
118 #[inline]
119 pub fn parse_range(&mut self) -> Option<Range<usize>> {
120 self.parse_operands()?;
121 let operands = self.operands();
122 if operands.len() == 2 {
123 let len = usize::try_from(operands[0]).ok()?;
124 let start = usize::try_from(operands[1]).ok()?;
125 let end = start.checked_add(len)?;
126 Some(start..end)
127 } else {
128 None
129 }
130 }
131}
132
133pub fn is_dict_one_byte_op(b: u8) -> bool {
136 match b {
137 0..=27 => true,
138 28..=30 => false, 31 => true, 32..=254 => false, 255 => true, }
143}
144
145pub fn parse_number(b0: u8, s: &mut Stream) -> Option<i32> {
147 match b0 {
148 28 => {
149 let n = i32::from(s.read::<i16>()?);
150 Some(n)
151 }
152 29 => {
153 let n = s.read::<i32>()?;
154 Some(n)
155 }
156 30 => {
157 while !s.at_end() {
160 let b1: u8 = s.read()?;
161 let nibble1 = b1 >> 4;
162 let nibble2 = b1 & 15;
163 if nibble1 == END_OF_FLOAT_FLAG || nibble2 == END_OF_FLOAT_FLAG {
164 break;
165 }
166 }
167 Some(0)
168 }
169 32..=246 => {
170 let n = i32::from(b0) - 139;
171 Some(n)
172 }
173 247..=250 => {
174 let b1 = i32::from(s.read::<u8>()?);
175 let n = (i32::from(b0) - 247) * 256 + b1 + 108;
176 Some(n)
177 }
178 251..=254 => {
179 let b1 = i32::from(s.read::<u8>()?);
180 let n = -(i32::from(b0) - 251) * 256 - b1 - 108;
181 Some(n)
182 }
183 _ => None,
184 }
185}
186
187pub fn skip_number(b0: u8, s: &mut Stream) -> Option<()> {
189 match b0 {
190 28 => s.skip::<u16>(),
191 29 => s.skip::<u32>(),
192 30 => {
193 while !s.at_end() {
194 let b1: u8 = s.read()?;
195 let nibble1 = b1 >> 4;
196 let nibble2 = b1 & 15;
197 if nibble1 == END_OF_FLOAT_FLAG || nibble2 == END_OF_FLOAT_FLAG {
198 break;
199 }
200 }
201 }
202 32..=246 => {}
203 247..=250 => s.skip::<u8>(),
204 251..=254 => s.skip::<u8>(),
205 _ => return None,
206 }
207
208 Some(())
209}
210
211
212#[cfg(test)]
213mod tests {
214 use super::*;
215
216 #[test]
217 fn parse_dict_number() {
218 assert_eq!(parse_number(0xFA, &mut Stream::new(&[0x7C])).unwrap(), 1000);
219 assert_eq!(parse_number(0xFE, &mut Stream::new(&[0x7C])).unwrap(), -1000);
220 assert_eq!(parse_number(0x1C, &mut Stream::new(&[0x27, 0x10])).unwrap(), 10000);
221 assert_eq!(parse_number(0x1C, &mut Stream::new(&[0xD8, 0xF0])).unwrap(), -10000);
222 assert_eq!(parse_number(0x1D, &mut Stream::new(&[0x00, 0x01, 0x86, 0xA0])).unwrap(), 100000);
223 assert_eq!(parse_number(0x1D, &mut Stream::new(&[0xFF, 0xFE, 0x79, 0x60])).unwrap(), -100000);
224 }
225}