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
143#[cfg(feature = "experimental_traverse")]
144impl<'a> SomeTable<'a> for Cff2Header<'a> {
145 fn type_name(&self) -> &str {
146 "Cff2Header"
147 }
148 fn get_field(&self, idx: usize) -> Option<Field<'a>> {
149 match idx {
150 0usize => Some(Field::new("major_version", self.major_version())),
151 1usize => Some(Field::new("minor_version", self.minor_version())),
152 2usize => Some(Field::new("header_size", self.header_size())),
153 3usize => Some(Field::new("top_dict_length", self.top_dict_length())),
154 4usize => Some(Field::new("_padding", self._padding())),
155 5usize => Some(Field::new("top_dict_data", self.top_dict_data())),
156 6usize => Some(Field::new("trailing_data", self.trailing_data())),
157 _ => None,
158 }
159 }
160}
161
162#[cfg(feature = "experimental_traverse")]
163#[allow(clippy::needless_lifetimes)]
164impl<'a> std::fmt::Debug for Cff2Header<'a> {
165 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
166 (self as &dyn SomeTable<'a>).fmt(f)
167 }
168}
169
170impl<'a> MinByteRange<'a> for Index<'a> {
171 fn min_byte_range(&self) -> Range<usize> {
172 0..self.data_byte_range().end
173 }
174 fn min_table_bytes(&self) -> &'a [u8] {
175 let range = self.min_byte_range();
176 self.data.as_bytes().get(range).unwrap_or_default()
177 }
178}
179
180impl ReadArgs for Index<'_> {
181 type Args = ();
182}
183
184impl<'a> FontRead<'a> for Index<'a> {
185 fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
186 #[allow(clippy::absurd_extreme_comparisons)]
187 if data.len() < Self::MIN_SIZE {
188 return Err(ReadError::OutOfBounds);
189 }
190 Ok(Self { data })
191 }
192}
193
194#[derive(Clone)]
196pub struct Index<'a> {
197 data: FontData<'a>,
198}
199
200#[allow(clippy::needless_lifetimes)]
201impl<'a> Index<'a> {
202 pub const MIN_SIZE: usize = (u32::RAW_BYTE_LEN + u8::RAW_BYTE_LEN);
203 basic_table_impls!(impl_the_methods);
204
205 pub fn count(&self) -> u32 {
207 let range = self.count_byte_range();
208 self.data.read_at(range.start).ok().unwrap()
209 }
210
211 pub fn off_size(&self) -> u8 {
213 let range = self.off_size_byte_range();
214 self.data.read_at(range.start).ok().unwrap()
215 }
216
217 pub fn offsets(&self) -> &'a [u8] {
219 let range = self.offsets_byte_range();
220 self.data.read_array(range).ok().unwrap_or_default()
221 }
222
223 pub fn data(&self) -> &'a [u8] {
225 let range = self.data_byte_range();
226 self.data.read_array(range).ok().unwrap_or_default()
227 }
228
229 pub fn count_byte_range(&self) -> Range<usize> {
230 let start = 0;
231 let end = start + u32::RAW_BYTE_LEN;
232 start..end
233 }
234
235 pub fn off_size_byte_range(&self) -> Range<usize> {
236 let start = self.count_byte_range().end;
237 let end = start + u8::RAW_BYTE_LEN;
238 start..end
239 }
240
241 pub fn offsets_byte_range(&self) -> Range<usize> {
242 let count = self.count();
243 let off_size = self.off_size();
244 let start = self.off_size_byte_range().end;
245 let end = start
246 + (transforms::add_multiply(count, 1_usize, off_size)).saturating_mul(u8::RAW_BYTE_LEN);
247 start..end
248 }
249
250 pub fn data_byte_range(&self) -> Range<usize> {
251 let start = self.offsets_byte_range().end;
252 let end =
253 start + self.data.len().saturating_sub(start) / u8::RAW_BYTE_LEN * u8::RAW_BYTE_LEN;
254 start..end
255 }
256}
257
258const _: () = assert!(FontData::default_data_long_enough(Index::MIN_SIZE));
259
260impl Default for Index<'_> {
261 fn default() -> Self {
262 Self {
263 data: FontData::default_table_data(),
264 }
265 }
266}
267
268#[cfg(feature = "experimental_traverse")]
269impl<'a> SomeTable<'a> for Index<'a> {
270 fn type_name(&self) -> &str {
271 "Index"
272 }
273 fn get_field(&self, idx: usize) -> Option<Field<'a>> {
274 match idx {
275 0usize => Some(Field::new("count", self.count())),
276 1usize => Some(Field::new("off_size", self.off_size())),
277 2usize => Some(Field::new("offsets", self.offsets())),
278 3usize => Some(Field::new("data", self.data())),
279 _ => None,
280 }
281 }
282}
283
284#[cfg(feature = "experimental_traverse")]
285#[allow(clippy::needless_lifetimes)]
286impl<'a> std::fmt::Debug for Index<'a> {
287 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
288 (self as &dyn SomeTable<'a>).fmt(f)
289 }
290}