1use crate::error::Result;
2use crate::stream::FontReader;
3use crate::tables::TtfTable;
4
5#[derive(Debug, Clone)]
7pub struct MaxpTable {
8 pub version: f32,
9 pub num_glyphs: u16,
10 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 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 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}