read_fonts/generated/
generated_cff2.rs1#[allow(unused_imports)]
6use crate::codegen_prelude::*;
7
8impl<'a> MinByteRange<'a> for Cff2Header<'a> {
9 fn min_byte_range(&self) -> Range<usize> {
10 0..self.trailing_data_byte_range().end
11 }
12 fn min_table_bytes(&self) -> &'a [u8] {
13 let range = self.min_byte_range();
14 self.data.as_bytes().get(range).unwrap_or_default()
15 }
16}
17
18impl ReadArgs for Cff2Header<'_> {
19 type Args = ();
20}
21
22impl<'a> FontRead<'a> for Cff2Header<'a> {
23 fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
24 #[allow(clippy::absurd_extreme_comparisons)]
25 if data.len() < Self::MIN_SIZE {
26 return Err(ReadError::OutOfBounds);
27 }
28 Ok(Self { data })
29 }
30}
31
32#[derive(Clone)]
34pub struct Cff2Header<'a> {
35 data: FontData<'a>,
36}
37
38#[allow(clippy::needless_lifetimes)]
39impl<'a> Cff2Header<'a> {
40 pub const MIN_SIZE: usize =
41 (u8::RAW_BYTE_LEN + u8::RAW_BYTE_LEN + u8::RAW_BYTE_LEN + u16::RAW_BYTE_LEN);
42 basic_table_impls!(impl_the_methods);
43
44 pub fn major_version(&self) -> u8 {
46 let range = self.major_version_byte_range();
47 self.data.read_at(range.start).ok().unwrap()
48 }
49
50 pub fn minor_version(&self) -> u8 {
52 let range = self.minor_version_byte_range();
53 self.data.read_at(range.start).ok().unwrap()
54 }
55
56 pub fn header_size(&self) -> u8 {
58 let range = self.header_size_byte_range();
59 self.data.read_at(range.start).ok().unwrap()
60 }
61
62 pub fn top_dict_length(&self) -> u16 {
64 let range = self.top_dict_length_byte_range();
65 self.data.read_at(range.start).ok().unwrap()
66 }
67
68 pub fn _padding(&self) -> &'a [u8] {
70 let range = self._padding_byte_range();
71 self.data.read_array(range).ok().unwrap_or_default()
72 }
73
74 pub fn top_dict_data(&self) -> &'a [u8] {
76 let range = self.top_dict_data_byte_range();
77 self.data.read_array(range).ok().unwrap_or_default()
78 }
79
80 pub fn trailing_data(&self) -> &'a [u8] {
82 let range = self.trailing_data_byte_range();
83 self.data.read_array(range).ok().unwrap_or_default()
84 }
85
86 pub fn major_version_byte_range(&self) -> Range<usize> {
87 let start = 0;
88 let end = start + u8::RAW_BYTE_LEN;
89 start..end
90 }
91
92 pub fn minor_version_byte_range(&self) -> Range<usize> {
93 let start = self.major_version_byte_range().end;
94 let end = start + u8::RAW_BYTE_LEN;
95 start..end
96 }
97
98 pub fn header_size_byte_range(&self) -> Range<usize> {
99 let start = self.minor_version_byte_range().end;
100 let end = start + u8::RAW_BYTE_LEN;
101 start..end
102 }
103
104 pub fn top_dict_length_byte_range(&self) -> Range<usize> {
105 let start = self.header_size_byte_range().end;
106 let end = start + u16::RAW_BYTE_LEN;
107 start..end
108 }
109
110 pub fn _padding_byte_range(&self) -> Range<usize> {
111 let header_size = self.header_size();
112 let start = self.top_dict_length_byte_range().end;
113 let end =
114 start + (transforms::subtract(header_size, 5_usize)).saturating_mul(u8::RAW_BYTE_LEN);
115 start..end
116 }
117
118 pub fn top_dict_data_byte_range(&self) -> Range<usize> {
119 let top_dict_length = self.top_dict_length();
120 let start = self._padding_byte_range().end;
121 let end = start + (transforms::to_usize(top_dict_length)).saturating_mul(u8::RAW_BYTE_LEN);
122 start..end
123 }
124
125 pub fn trailing_data_byte_range(&self) -> Range<usize> {
126 let start = self.top_dict_data_byte_range().end;
127 let end =
128 start + self.data.len().saturating_sub(start) / u8::RAW_BYTE_LEN * u8::RAW_BYTE_LEN;
129 start..end
130 }
131}
132
133const _: () = assert!(FontData::default_data_long_enough(Cff2Header::MIN_SIZE));
134
135impl Default for Cff2Header<'_> {
136 fn default() -> Self {
137 Self {
138 data: FontData::default_table_data(),
139 }
140 }
141}
142
143impl<'a> MinByteRange<'a> for Index<'a> {
144 fn min_byte_range(&self) -> Range<usize> {
145 0..self.data_byte_range().end
146 }
147 fn min_table_bytes(&self) -> &'a [u8] {
148 let range = self.min_byte_range();
149 self.data.as_bytes().get(range).unwrap_or_default()
150 }
151}
152
153impl ReadArgs for Index<'_> {
154 type Args = ();
155}
156
157impl<'a> FontRead<'a> for Index<'a> {
158 fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
159 #[allow(clippy::absurd_extreme_comparisons)]
160 if data.len() < Self::MIN_SIZE {
161 return Err(ReadError::OutOfBounds);
162 }
163 Ok(Self { data })
164 }
165}
166
167#[derive(Clone)]
169pub struct Index<'a> {
170 data: FontData<'a>,
171}
172
173#[allow(clippy::needless_lifetimes)]
174impl<'a> Index<'a> {
175 pub const MIN_SIZE: usize = (u32::RAW_BYTE_LEN + u8::RAW_BYTE_LEN);
176 basic_table_impls!(impl_the_methods);
177
178 pub fn count(&self) -> u32 {
180 let range = self.count_byte_range();
181 self.data.read_at(range.start).ok().unwrap()
182 }
183
184 pub fn off_size(&self) -> u8 {
186 let range = self.off_size_byte_range();
187 self.data.read_at(range.start).ok().unwrap()
188 }
189
190 pub fn offsets(&self) -> &'a [u8] {
192 let range = self.offsets_byte_range();
193 self.data.read_array(range).ok().unwrap_or_default()
194 }
195
196 pub fn data(&self) -> &'a [u8] {
198 let range = self.data_byte_range();
199 self.data.read_array(range).ok().unwrap_or_default()
200 }
201
202 pub fn count_byte_range(&self) -> Range<usize> {
203 let start = 0;
204 let end = start + u32::RAW_BYTE_LEN;
205 start..end
206 }
207
208 pub fn off_size_byte_range(&self) -> Range<usize> {
209 let start = self.count_byte_range().end;
210 let end = start + u8::RAW_BYTE_LEN;
211 start..end
212 }
213
214 pub fn offsets_byte_range(&self) -> Range<usize> {
215 let count = self.count();
216 let off_size = self.off_size();
217 let start = self.off_size_byte_range().end;
218 let end = start
219 + (transforms::add_multiply(count, 1_usize, off_size)).saturating_mul(u8::RAW_BYTE_LEN);
220 start..end
221 }
222
223 pub fn data_byte_range(&self) -> Range<usize> {
224 let start = self.offsets_byte_range().end;
225 let end =
226 start + self.data.len().saturating_sub(start) / u8::RAW_BYTE_LEN * u8::RAW_BYTE_LEN;
227 start..end
228 }
229}
230
231const _: () = assert!(FontData::default_data_long_enough(Index::MIN_SIZE));
232
233impl Default for Index<'_> {
234 fn default() -> Self {
235 Self {
236 data: FontData::default_table_data(),
237 }
238 }
239}