read_fonts/generated/
generated_maxp.rs

1// THIS FILE IS AUTOGENERATED.
2// Any changes to this file will be overwritten.
3// For more information about how codegen works, see font-codegen/README.md
4
5#[allow(unused_imports)]
6use crate::codegen_prelude::*;
7
8/// [`maxp`](https://docs.microsoft.com/en-us/typography/opentype/spec/maxp)
9#[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    /// `maxp`
112    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
229/// [`maxp`](https://docs.microsoft.com/en-us/typography/opentype/spec/maxp)
230pub type Maxp<'a> = TableRef<'a, MaxpMarker>;
231
232#[allow(clippy::needless_lifetimes)]
233impl<'a> Maxp<'a> {
234    /// The version: 0x00005000 for version 0.5, 0x00010000 for version 1.0.
235    pub fn version(&self) -> Version16Dot16 {
236        let range = self.shape.version_byte_range();
237        self.data.read_at(range.start).unwrap()
238    }
239
240    /// The number of glyphs in the font.
241    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    /// Maximum points in a non-composite glyph.
247    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    /// Maximum contours in a non-composite glyph.
253    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    /// Maximum points in a composite glyph.
259    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    /// Maximum contours in a composite glyph.
265    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    /// 1 if instructions do not use the twilight zone (Z0), or 2 if
271    /// instructions do use Z0; should be set to 2 in most cases.
272    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    /// Maximum points used in Z0.
278    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    /// Number of Storage Area locations.
284    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    /// Number of FDEFs, equal to the highest function number + 1.
290    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    /// Number of IDEFs.
296    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    /// Maximum stack depth across Font Program ('fpgm' table), CVT
302    /// Program ('prep' table) and all glyph instructions (in the
303    /// 'glyf' table).
304    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    /// Maximum byte count for glyph instructions.
310    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    /// Maximum number of components referenced at “top level” for
316    /// any composite glyph.
317    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    /// Maximum levels of recursion; 1 for simple components.
323    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}