1#[allow(unused_imports)]
6use crate::codegen_prelude::*;
7
8#[derive(Debug, Clone, Copy)]
10#[doc(hidden)]
11pub struct MaxpMarker {
12 max_points_byte_start: Option<usize>,
13 max_contours_byte_start: Option<usize>,
14 max_composite_points_byte_start: Option<usize>,
15 max_composite_contours_byte_start: Option<usize>,
16 max_zones_byte_start: Option<usize>,
17 max_twilight_points_byte_start: Option<usize>,
18 max_storage_byte_start: Option<usize>,
19 max_function_defs_byte_start: Option<usize>,
20 max_instruction_defs_byte_start: Option<usize>,
21 max_stack_elements_byte_start: Option<usize>,
22 max_size_of_instructions_byte_start: Option<usize>,
23 max_component_elements_byte_start: Option<usize>,
24 max_component_depth_byte_start: Option<usize>,
25}
26
27impl MaxpMarker {
28 pub fn version_byte_range(&self) -> Range<usize> {
29 let start = 0;
30 start..start + Version16Dot16::RAW_BYTE_LEN
31 }
32
33 pub fn num_glyphs_byte_range(&self) -> Range<usize> {
34 let start = self.version_byte_range().end;
35 start..start + u16::RAW_BYTE_LEN
36 }
37
38 pub fn max_points_byte_range(&self) -> Option<Range<usize>> {
39 let start = self.max_points_byte_start?;
40 Some(start..start + u16::RAW_BYTE_LEN)
41 }
42
43 pub fn max_contours_byte_range(&self) -> Option<Range<usize>> {
44 let start = self.max_contours_byte_start?;
45 Some(start..start + u16::RAW_BYTE_LEN)
46 }
47
48 pub fn max_composite_points_byte_range(&self) -> Option<Range<usize>> {
49 let start = self.max_composite_points_byte_start?;
50 Some(start..start + u16::RAW_BYTE_LEN)
51 }
52
53 pub fn max_composite_contours_byte_range(&self) -> Option<Range<usize>> {
54 let start = self.max_composite_contours_byte_start?;
55 Some(start..start + u16::RAW_BYTE_LEN)
56 }
57
58 pub fn max_zones_byte_range(&self) -> Option<Range<usize>> {
59 let start = self.max_zones_byte_start?;
60 Some(start..start + u16::RAW_BYTE_LEN)
61 }
62
63 pub fn max_twilight_points_byte_range(&self) -> Option<Range<usize>> {
64 let start = self.max_twilight_points_byte_start?;
65 Some(start..start + u16::RAW_BYTE_LEN)
66 }
67
68 pub fn max_storage_byte_range(&self) -> Option<Range<usize>> {
69 let start = self.max_storage_byte_start?;
70 Some(start..start + u16::RAW_BYTE_LEN)
71 }
72
73 pub fn max_function_defs_byte_range(&self) -> Option<Range<usize>> {
74 let start = self.max_function_defs_byte_start?;
75 Some(start..start + u16::RAW_BYTE_LEN)
76 }
77
78 pub fn max_instruction_defs_byte_range(&self) -> Option<Range<usize>> {
79 let start = self.max_instruction_defs_byte_start?;
80 Some(start..start + u16::RAW_BYTE_LEN)
81 }
82
83 pub fn max_stack_elements_byte_range(&self) -> Option<Range<usize>> {
84 let start = self.max_stack_elements_byte_start?;
85 Some(start..start + u16::RAW_BYTE_LEN)
86 }
87
88 pub fn max_size_of_instructions_byte_range(&self) -> Option<Range<usize>> {
89 let start = self.max_size_of_instructions_byte_start?;
90 Some(start..start + u16::RAW_BYTE_LEN)
91 }
92
93 pub fn max_component_elements_byte_range(&self) -> Option<Range<usize>> {
94 let start = self.max_component_elements_byte_start?;
95 Some(start..start + u16::RAW_BYTE_LEN)
96 }
97
98 pub fn max_component_depth_byte_range(&self) -> Option<Range<usize>> {
99 let start = self.max_component_depth_byte_start?;
100 Some(start..start + u16::RAW_BYTE_LEN)
101 }
102}
103
104impl MinByteRange for MaxpMarker {
105 fn min_byte_range(&self) -> Range<usize> {
106 0..self.num_glyphs_byte_range().end
107 }
108}
109
110impl TopLevelTable for Maxp<'_> {
111 const TAG: Tag = Tag::new(b"maxp");
113}
114
115impl<'a> FontRead<'a> for Maxp<'a> {
116 fn read(data: FontData<'a>) -> Result<Self, ReadError> {
117 let mut cursor = data.cursor();
118 let version: Version16Dot16 = cursor.read()?;
119 cursor.advance::<u16>();
120 let max_points_byte_start = version
121 .compatible((1u16, 0u16))
122 .then(|| cursor.position())
123 .transpose()?;
124 version
125 .compatible((1u16, 0u16))
126 .then(|| cursor.advance::<u16>());
127 let max_contours_byte_start = version
128 .compatible((1u16, 0u16))
129 .then(|| cursor.position())
130 .transpose()?;
131 version
132 .compatible((1u16, 0u16))
133 .then(|| cursor.advance::<u16>());
134 let max_composite_points_byte_start = version
135 .compatible((1u16, 0u16))
136 .then(|| cursor.position())
137 .transpose()?;
138 version
139 .compatible((1u16, 0u16))
140 .then(|| cursor.advance::<u16>());
141 let max_composite_contours_byte_start = version
142 .compatible((1u16, 0u16))
143 .then(|| cursor.position())
144 .transpose()?;
145 version
146 .compatible((1u16, 0u16))
147 .then(|| cursor.advance::<u16>());
148 let max_zones_byte_start = version
149 .compatible((1u16, 0u16))
150 .then(|| cursor.position())
151 .transpose()?;
152 version
153 .compatible((1u16, 0u16))
154 .then(|| cursor.advance::<u16>());
155 let max_twilight_points_byte_start = version
156 .compatible((1u16, 0u16))
157 .then(|| cursor.position())
158 .transpose()?;
159 version
160 .compatible((1u16, 0u16))
161 .then(|| cursor.advance::<u16>());
162 let max_storage_byte_start = version
163 .compatible((1u16, 0u16))
164 .then(|| cursor.position())
165 .transpose()?;
166 version
167 .compatible((1u16, 0u16))
168 .then(|| cursor.advance::<u16>());
169 let max_function_defs_byte_start = version
170 .compatible((1u16, 0u16))
171 .then(|| cursor.position())
172 .transpose()?;
173 version
174 .compatible((1u16, 0u16))
175 .then(|| cursor.advance::<u16>());
176 let max_instruction_defs_byte_start = version
177 .compatible((1u16, 0u16))
178 .then(|| cursor.position())
179 .transpose()?;
180 version
181 .compatible((1u16, 0u16))
182 .then(|| cursor.advance::<u16>());
183 let max_stack_elements_byte_start = version
184 .compatible((1u16, 0u16))
185 .then(|| cursor.position())
186 .transpose()?;
187 version
188 .compatible((1u16, 0u16))
189 .then(|| cursor.advance::<u16>());
190 let max_size_of_instructions_byte_start = version
191 .compatible((1u16, 0u16))
192 .then(|| cursor.position())
193 .transpose()?;
194 version
195 .compatible((1u16, 0u16))
196 .then(|| cursor.advance::<u16>());
197 let max_component_elements_byte_start = version
198 .compatible((1u16, 0u16))
199 .then(|| cursor.position())
200 .transpose()?;
201 version
202 .compatible((1u16, 0u16))
203 .then(|| cursor.advance::<u16>());
204 let max_component_depth_byte_start = version
205 .compatible((1u16, 0u16))
206 .then(|| cursor.position())
207 .transpose()?;
208 version
209 .compatible((1u16, 0u16))
210 .then(|| cursor.advance::<u16>());
211 cursor.finish(MaxpMarker {
212 max_points_byte_start,
213 max_contours_byte_start,
214 max_composite_points_byte_start,
215 max_composite_contours_byte_start,
216 max_zones_byte_start,
217 max_twilight_points_byte_start,
218 max_storage_byte_start,
219 max_function_defs_byte_start,
220 max_instruction_defs_byte_start,
221 max_stack_elements_byte_start,
222 max_size_of_instructions_byte_start,
223 max_component_elements_byte_start,
224 max_component_depth_byte_start,
225 })
226 }
227}
228
229pub type Maxp<'a> = TableRef<'a, MaxpMarker>;
231
232#[allow(clippy::needless_lifetimes)]
233impl<'a> Maxp<'a> {
234 pub fn version(&self) -> Version16Dot16 {
236 let range = self.shape.version_byte_range();
237 self.data.read_at(range.start).unwrap()
238 }
239
240 pub fn num_glyphs(&self) -> u16 {
242 let range = self.shape.num_glyphs_byte_range();
243 self.data.read_at(range.start).unwrap()
244 }
245
246 pub fn max_points(&self) -> Option<u16> {
248 let range = self.shape.max_points_byte_range()?;
249 Some(self.data.read_at(range.start).unwrap())
250 }
251
252 pub fn max_contours(&self) -> Option<u16> {
254 let range = self.shape.max_contours_byte_range()?;
255 Some(self.data.read_at(range.start).unwrap())
256 }
257
258 pub fn max_composite_points(&self) -> Option<u16> {
260 let range = self.shape.max_composite_points_byte_range()?;
261 Some(self.data.read_at(range.start).unwrap())
262 }
263
264 pub fn max_composite_contours(&self) -> Option<u16> {
266 let range = self.shape.max_composite_contours_byte_range()?;
267 Some(self.data.read_at(range.start).unwrap())
268 }
269
270 pub fn max_zones(&self) -> Option<u16> {
273 let range = self.shape.max_zones_byte_range()?;
274 Some(self.data.read_at(range.start).unwrap())
275 }
276
277 pub fn max_twilight_points(&self) -> Option<u16> {
279 let range = self.shape.max_twilight_points_byte_range()?;
280 Some(self.data.read_at(range.start).unwrap())
281 }
282
283 pub fn max_storage(&self) -> Option<u16> {
285 let range = self.shape.max_storage_byte_range()?;
286 Some(self.data.read_at(range.start).unwrap())
287 }
288
289 pub fn max_function_defs(&self) -> Option<u16> {
291 let range = self.shape.max_function_defs_byte_range()?;
292 Some(self.data.read_at(range.start).unwrap())
293 }
294
295 pub fn max_instruction_defs(&self) -> Option<u16> {
297 let range = self.shape.max_instruction_defs_byte_range()?;
298 Some(self.data.read_at(range.start).unwrap())
299 }
300
301 pub fn max_stack_elements(&self) -> Option<u16> {
305 let range = self.shape.max_stack_elements_byte_range()?;
306 Some(self.data.read_at(range.start).unwrap())
307 }
308
309 pub fn max_size_of_instructions(&self) -> Option<u16> {
311 let range = self.shape.max_size_of_instructions_byte_range()?;
312 Some(self.data.read_at(range.start).unwrap())
313 }
314
315 pub fn max_component_elements(&self) -> Option<u16> {
318 let range = self.shape.max_component_elements_byte_range()?;
319 Some(self.data.read_at(range.start).unwrap())
320 }
321
322 pub fn max_component_depth(&self) -> Option<u16> {
324 let range = self.shape.max_component_depth_byte_range()?;
325 Some(self.data.read_at(range.start).unwrap())
326 }
327}
328
329#[cfg(feature = "experimental_traverse")]
330impl<'a> SomeTable<'a> for Maxp<'a> {
331 fn type_name(&self) -> &str {
332 "Maxp"
333 }
334 fn get_field(&self, idx: usize) -> Option<Field<'a>> {
335 let version = self.version();
336 match idx {
337 0usize => Some(Field::new("version", self.version())),
338 1usize => Some(Field::new("num_glyphs", self.num_glyphs())),
339 2usize if version.compatible((1u16, 0u16)) => {
340 Some(Field::new("max_points", self.max_points().unwrap()))
341 }
342 3usize if version.compatible((1u16, 0u16)) => {
343 Some(Field::new("max_contours", self.max_contours().unwrap()))
344 }
345 4usize if version.compatible((1u16, 0u16)) => Some(Field::new(
346 "max_composite_points",
347 self.max_composite_points().unwrap(),
348 )),
349 5usize if version.compatible((1u16, 0u16)) => Some(Field::new(
350 "max_composite_contours",
351 self.max_composite_contours().unwrap(),
352 )),
353 6usize if version.compatible((1u16, 0u16)) => {
354 Some(Field::new("max_zones", self.max_zones().unwrap()))
355 }
356 7usize if version.compatible((1u16, 0u16)) => Some(Field::new(
357 "max_twilight_points",
358 self.max_twilight_points().unwrap(),
359 )),
360 8usize if version.compatible((1u16, 0u16)) => {
361 Some(Field::new("max_storage", self.max_storage().unwrap()))
362 }
363 9usize if version.compatible((1u16, 0u16)) => Some(Field::new(
364 "max_function_defs",
365 self.max_function_defs().unwrap(),
366 )),
367 10usize if version.compatible((1u16, 0u16)) => Some(Field::new(
368 "max_instruction_defs",
369 self.max_instruction_defs().unwrap(),
370 )),
371 11usize if version.compatible((1u16, 0u16)) => Some(Field::new(
372 "max_stack_elements",
373 self.max_stack_elements().unwrap(),
374 )),
375 12usize if version.compatible((1u16, 0u16)) => Some(Field::new(
376 "max_size_of_instructions",
377 self.max_size_of_instructions().unwrap(),
378 )),
379 13usize if version.compatible((1u16, 0u16)) => Some(Field::new(
380 "max_component_elements",
381 self.max_component_elements().unwrap(),
382 )),
383 14usize if version.compatible((1u16, 0u16)) => Some(Field::new(
384 "max_component_depth",
385 self.max_component_depth().unwrap(),
386 )),
387 _ => None,
388 }
389 }
390}
391
392#[cfg(feature = "experimental_traverse")]
393#[allow(clippy::needless_lifetimes)]
394impl<'a> std::fmt::Debug for Maxp<'a> {
395 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
396 (self as &dyn SomeTable<'a>).fmt(f)
397 }
398}