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)]
6 use crate::codegen_prelude::*;
7 
8 /// [hhea](https://docs.microsoft.com/en-us/typography/opentype/spec/hhea) Horizontal Header Table
9 #[derive(Debug, Clone, Copy)]
10 #[doc(hidden)]
11 pub struct HheaMarker {}
12 
13 impl HheaMarker {
version_byte_range(&self) -> Range<usize>14     fn version_byte_range(&self) -> Range<usize> {
15         let start = 0;
16         start..start + MajorMinor::RAW_BYTE_LEN
17     }
ascender_byte_range(&self) -> Range<usize>18     fn ascender_byte_range(&self) -> Range<usize> {
19         let start = self.version_byte_range().end;
20         start..start + FWord::RAW_BYTE_LEN
21     }
descender_byte_range(&self) -> Range<usize>22     fn descender_byte_range(&self) -> Range<usize> {
23         let start = self.ascender_byte_range().end;
24         start..start + FWord::RAW_BYTE_LEN
25     }
line_gap_byte_range(&self) -> Range<usize>26     fn line_gap_byte_range(&self) -> Range<usize> {
27         let start = self.descender_byte_range().end;
28         start..start + FWord::RAW_BYTE_LEN
29     }
advance_width_max_byte_range(&self) -> Range<usize>30     fn advance_width_max_byte_range(&self) -> Range<usize> {
31         let start = self.line_gap_byte_range().end;
32         start..start + UfWord::RAW_BYTE_LEN
33     }
min_left_side_bearing_byte_range(&self) -> Range<usize>34     fn min_left_side_bearing_byte_range(&self) -> Range<usize> {
35         let start = self.advance_width_max_byte_range().end;
36         start..start + FWord::RAW_BYTE_LEN
37     }
min_right_side_bearing_byte_range(&self) -> Range<usize>38     fn min_right_side_bearing_byte_range(&self) -> Range<usize> {
39         let start = self.min_left_side_bearing_byte_range().end;
40         start..start + FWord::RAW_BYTE_LEN
41     }
x_max_extent_byte_range(&self) -> Range<usize>42     fn x_max_extent_byte_range(&self) -> Range<usize> {
43         let start = self.min_right_side_bearing_byte_range().end;
44         start..start + FWord::RAW_BYTE_LEN
45     }
caret_slope_rise_byte_range(&self) -> Range<usize>46     fn caret_slope_rise_byte_range(&self) -> Range<usize> {
47         let start = self.x_max_extent_byte_range().end;
48         start..start + i16::RAW_BYTE_LEN
49     }
caret_slope_run_byte_range(&self) -> Range<usize>50     fn caret_slope_run_byte_range(&self) -> Range<usize> {
51         let start = self.caret_slope_rise_byte_range().end;
52         start..start + i16::RAW_BYTE_LEN
53     }
caret_offset_byte_range(&self) -> Range<usize>54     fn caret_offset_byte_range(&self) -> Range<usize> {
55         let start = self.caret_slope_run_byte_range().end;
56         start..start + i16::RAW_BYTE_LEN
57     }
reserved1_byte_range(&self) -> Range<usize>58     fn reserved1_byte_range(&self) -> Range<usize> {
59         let start = self.caret_offset_byte_range().end;
60         start..start + i16::RAW_BYTE_LEN
61     }
reserved2_byte_range(&self) -> Range<usize>62     fn reserved2_byte_range(&self) -> Range<usize> {
63         let start = self.reserved1_byte_range().end;
64         start..start + i16::RAW_BYTE_LEN
65     }
reserved3_byte_range(&self) -> Range<usize>66     fn reserved3_byte_range(&self) -> Range<usize> {
67         let start = self.reserved2_byte_range().end;
68         start..start + i16::RAW_BYTE_LEN
69     }
reserved4_byte_range(&self) -> Range<usize>70     fn reserved4_byte_range(&self) -> Range<usize> {
71         let start = self.reserved3_byte_range().end;
72         start..start + i16::RAW_BYTE_LEN
73     }
metric_data_format_byte_range(&self) -> Range<usize>74     fn metric_data_format_byte_range(&self) -> Range<usize> {
75         let start = self.reserved4_byte_range().end;
76         start..start + i16::RAW_BYTE_LEN
77     }
number_of_long_metrics_byte_range(&self) -> Range<usize>78     fn number_of_long_metrics_byte_range(&self) -> Range<usize> {
79         let start = self.metric_data_format_byte_range().end;
80         start..start + u16::RAW_BYTE_LEN
81     }
82 }
83 
84 impl TopLevelTable for Hhea<'_> {
85     /// `hhea`
86     const TAG: Tag = Tag::new(b"hhea");
87 }
88 
89 impl<'a> FontRead<'a> for Hhea<'a> {
read(data: FontData<'a>) -> Result<Self, ReadError>90     fn read(data: FontData<'a>) -> Result<Self, ReadError> {
91         let mut cursor = data.cursor();
92         cursor.advance::<MajorMinor>();
93         cursor.advance::<FWord>();
94         cursor.advance::<FWord>();
95         cursor.advance::<FWord>();
96         cursor.advance::<UfWord>();
97         cursor.advance::<FWord>();
98         cursor.advance::<FWord>();
99         cursor.advance::<FWord>();
100         cursor.advance::<i16>();
101         cursor.advance::<i16>();
102         cursor.advance::<i16>();
103         cursor.advance::<i16>();
104         cursor.advance::<i16>();
105         cursor.advance::<i16>();
106         cursor.advance::<i16>();
107         cursor.advance::<i16>();
108         cursor.advance::<u16>();
109         cursor.finish(HheaMarker {})
110     }
111 }
112 
113 /// [hhea](https://docs.microsoft.com/en-us/typography/opentype/spec/hhea) Horizontal Header Table
114 pub type Hhea<'a> = TableRef<'a, HheaMarker>;
115 
116 impl<'a> Hhea<'a> {
117     /// The major/minor version (1, 0)
version(&self) -> MajorMinor118     pub fn version(&self) -> MajorMinor {
119         let range = self.shape.version_byte_range();
120         self.data.read_at(range.start).unwrap()
121     }
122 
123     /// Typographic ascent.
ascender(&self) -> FWord124     pub fn ascender(&self) -> FWord {
125         let range = self.shape.ascender_byte_range();
126         self.data.read_at(range.start).unwrap()
127     }
128 
129     /// Typographic descent.
descender(&self) -> FWord130     pub fn descender(&self) -> FWord {
131         let range = self.shape.descender_byte_range();
132         self.data.read_at(range.start).unwrap()
133     }
134 
135     /// Typographic line gap. Negative LineGap values are treated as
136     /// zero in some legacy platform implementations.
line_gap(&self) -> FWord137     pub fn line_gap(&self) -> FWord {
138         let range = self.shape.line_gap_byte_range();
139         self.data.read_at(range.start).unwrap()
140     }
141 
142     /// Maximum advance width value in 'hmtx' table.
advance_width_max(&self) -> UfWord143     pub fn advance_width_max(&self) -> UfWord {
144         let range = self.shape.advance_width_max_byte_range();
145         self.data.read_at(range.start).unwrap()
146     }
147 
148     /// Minimum left sidebearing value in 'hmtx' table for glyphs with
149     /// contours (empty glyphs should be ignored).
min_left_side_bearing(&self) -> FWord150     pub fn min_left_side_bearing(&self) -> FWord {
151         let range = self.shape.min_left_side_bearing_byte_range();
152         self.data.read_at(range.start).unwrap()
153     }
154 
155     /// Minimum right sidebearing value; calculated as min(aw - (lsb +
156     /// xMax - xMin)) for glyphs with contours (empty glyphs should be ignored).
min_right_side_bearing(&self) -> FWord157     pub fn min_right_side_bearing(&self) -> FWord {
158         let range = self.shape.min_right_side_bearing_byte_range();
159         self.data.read_at(range.start).unwrap()
160     }
161 
162     /// Max(lsb + (xMax-xMin))
x_max_extent(&self) -> FWord163     pub fn x_max_extent(&self) -> FWord {
164         let range = self.shape.x_max_extent_byte_range();
165         self.data.read_at(range.start).unwrap()
166     }
167 
168     /// Used to calculate the slope of the cursor (rise/run); 1 for
169     /// vertical caret, 0 for horizontal.
caret_slope_rise(&self) -> i16170     pub fn caret_slope_rise(&self) -> i16 {
171         let range = self.shape.caret_slope_rise_byte_range();
172         self.data.read_at(range.start).unwrap()
173     }
174 
175     /// 0 for vertical caret, 1 for horizontal.
caret_slope_run(&self) -> i16176     pub fn caret_slope_run(&self) -> i16 {
177         let range = self.shape.caret_slope_run_byte_range();
178         self.data.read_at(range.start).unwrap()
179     }
180 
181     /// The amount by which a slanted highlight on a glyph needs to be
182     /// shifted to produce the best appearance. Set to 0 for
183     /// non-slanted fonts
caret_offset(&self) -> i16184     pub fn caret_offset(&self) -> i16 {
185         let range = self.shape.caret_offset_byte_range();
186         self.data.read_at(range.start).unwrap()
187     }
188 
189     /// 0 for current format.
metric_data_format(&self) -> i16190     pub fn metric_data_format(&self) -> i16 {
191         let range = self.shape.metric_data_format_byte_range();
192         self.data.read_at(range.start).unwrap()
193     }
194 
195     /// Number of LongMetric entries in 'hmtx'/'vmtx' table
number_of_long_metrics(&self) -> u16196     pub fn number_of_long_metrics(&self) -> u16 {
197         let range = self.shape.number_of_long_metrics_byte_range();
198         self.data.read_at(range.start).unwrap()
199     }
200 }
201 
202 #[cfg(feature = "traversal")]
203 impl<'a> SomeTable<'a> for Hhea<'a> {
type_name(&self) -> &str204     fn type_name(&self) -> &str {
205         "Hhea"
206     }
get_field(&self, idx: usize) -> Option<Field<'a>>207     fn get_field(&self, idx: usize) -> Option<Field<'a>> {
208         match idx {
209             0usize => Some(Field::new("version", self.version())),
210             1usize => Some(Field::new("ascender", self.ascender())),
211             2usize => Some(Field::new("descender", self.descender())),
212             3usize => Some(Field::new("line_gap", self.line_gap())),
213             4usize => Some(Field::new("advance_width_max", self.advance_width_max())),
214             5usize => Some(Field::new(
215                 "min_left_side_bearing",
216                 self.min_left_side_bearing(),
217             )),
218             6usize => Some(Field::new(
219                 "min_right_side_bearing",
220                 self.min_right_side_bearing(),
221             )),
222             7usize => Some(Field::new("x_max_extent", self.x_max_extent())),
223             8usize => Some(Field::new("caret_slope_rise", self.caret_slope_rise())),
224             9usize => Some(Field::new("caret_slope_run", self.caret_slope_run())),
225             10usize => Some(Field::new("caret_offset", self.caret_offset())),
226             11usize => Some(Field::new("metric_data_format", self.metric_data_format())),
227             12usize => Some(Field::new(
228                 "number_of_long_metrics",
229                 self.number_of_long_metrics(),
230             )),
231             _ => None,
232         }
233     }
234 }
235 
236 #[cfg(feature = "traversal")]
237 impl<'a> std::fmt::Debug for Hhea<'a> {
fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result238     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
239         (self as &dyn SomeTable<'a>).fmt(f)
240     }
241 }
242