Skip to main content

ttf_rs/tables/
maxp.rs

1use crate::error::Result;
2use crate::stream::FontReader;
3use crate::tables::TtfTable;
4
5/// MAXP table - Maximum profile
6#[derive(Debug, Clone)]
7pub struct MaxpTable {
8    pub version: f32,
9    pub num_glyphs: u16,
10    // Version 1.0 fields
11    pub max_points: Option<u16>,
12    pub max_contours: Option<u16>,
13    pub max_composite_points: Option<u16>,
14    pub max_composite_contours: Option<u16>,
15    pub max_zones: Option<u16>,
16    pub max_twilight_points: Option<u16>,
17    pub max_storage: Option<u16>,
18    pub max_function_defs: Option<u16>,
19    pub max_instruction_defs: Option<u16>,
20    pub max_stack_elements: Option<u16>,
21    pub max_size_of_instructions: Option<u16>,
22    pub max_component_elements: Option<u16>,
23    pub max_component_depth: Option<u16>,
24}
25
26impl MaxpTable {
27    pub const VERSION_0_5: f32 = 0.5;
28    pub const VERSION_1_0: f32 = 1.0;
29
30    pub fn is_version_0_5(&self) -> bool {
31        self.version == Self::VERSION_0_5
32    }
33
34    pub fn is_version_1_0(&self) -> bool {
35        self.version == Self::VERSION_1_0
36    }
37}
38
39impl TtfTable for MaxpTable {
40    fn from_reader(reader: &mut FontReader, _length: u32) -> Result<Self> {
41        let version = reader.read_fixed()?;
42        let num_glyphs = reader.read_u16()?;
43
44        if version == Self::VERSION_0_5 {
45            // Version 0.5 only has num_glyphs
46            return Ok(MaxpTable {
47                version,
48                num_glyphs,
49                max_points: None,
50                max_contours: None,
51                max_composite_points: None,
52                max_composite_contours: None,
53                max_zones: None,
54                max_twilight_points: None,
55                max_storage: None,
56                max_function_defs: None,
57                max_instruction_defs: None,
58                max_stack_elements: None,
59                max_size_of_instructions: None,
60                max_component_elements: None,
61                max_component_depth: None,
62            });
63        }
64
65        // Version 1.0 has additional fields
66        let max_points = Some(reader.read_u16()?);
67        let max_contours = Some(reader.read_u16()?);
68        let max_composite_points = Some(reader.read_u16()?);
69        let max_composite_contours = Some(reader.read_u16()?);
70        let max_zones = Some(reader.read_u16()?);
71        let max_twilight_points = Some(reader.read_u16()?);
72        let max_storage = Some(reader.read_u16()?);
73        let max_function_defs = Some(reader.read_u16()?);
74        let max_instruction_defs = Some(reader.read_u16()?);
75        let max_stack_elements = Some(reader.read_u16()?);
76        let max_size_of_instructions = Some(reader.read_u16()?);
77        let max_component_elements = Some(reader.read_u16()?);
78        let max_component_depth = Some(reader.read_u16()?);
79
80        Ok(MaxpTable {
81            version,
82            num_glyphs,
83            max_points,
84            max_contours,
85            max_composite_points,
86            max_composite_contours,
87            max_zones,
88            max_twilight_points,
89            max_storage,
90            max_function_defs,
91            max_instruction_defs,
92            max_stack_elements,
93            max_size_of_instructions,
94            max_component_elements,
95            max_component_depth,
96        })
97    }
98}