Skip to main content

read_fonts/generated/
generated_hhea.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
8impl<'a> MinByteRange<'a> for Hhea<'a> {
9    fn min_byte_range(&self) -> Range<usize> {
10        0..self.number_of_h_metrics_byte_range().end
11    }
12    fn min_table_bytes(&self) -> &'a [u8] {
13        let range = self.min_byte_range();
14        self.data.as_bytes().get(range).unwrap_or_default()
15    }
16}
17
18impl TopLevelTable for Hhea<'_> {
19    /// `hhea`
20    const TAG: Tag = Tag::new(b"hhea");
21}
22
23impl ReadArgs for Hhea<'_> {
24    type Args = ();
25}
26
27impl<'a> FontRead<'a> for Hhea<'a> {
28    fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
29        #[allow(clippy::absurd_extreme_comparisons)]
30        if data.len() < Self::MIN_SIZE {
31            return Err(ReadError::OutOfBounds);
32        }
33        Ok(Self { data })
34    }
35}
36
37/// [hhea](https://docs.microsoft.com/en-us/typography/opentype/spec/hhea) Horizontal Header Table
38#[derive(Clone)]
39pub struct Hhea<'a> {
40    data: FontData<'a>,
41}
42
43#[allow(clippy::needless_lifetimes)]
44impl<'a> Hhea<'a> {
45    pub const MIN_SIZE: usize = (MajorMinor::RAW_BYTE_LEN
46        + FWord::RAW_BYTE_LEN
47        + FWord::RAW_BYTE_LEN
48        + FWord::RAW_BYTE_LEN
49        + UfWord::RAW_BYTE_LEN
50        + FWord::RAW_BYTE_LEN
51        + FWord::RAW_BYTE_LEN
52        + FWord::RAW_BYTE_LEN
53        + i16::RAW_BYTE_LEN
54        + i16::RAW_BYTE_LEN
55        + i16::RAW_BYTE_LEN
56        + i16::RAW_BYTE_LEN
57        + i16::RAW_BYTE_LEN
58        + i16::RAW_BYTE_LEN
59        + i16::RAW_BYTE_LEN
60        + i16::RAW_BYTE_LEN
61        + u16::RAW_BYTE_LEN);
62    basic_table_impls!(impl_the_methods);
63
64    /// The major/minor version (1, 0)
65    pub fn version(&self) -> MajorMinor {
66        let range = self.version_byte_range();
67        self.data.read_at(range.start).ok().unwrap()
68    }
69
70    /// Typographic ascent.
71    pub fn ascender(&self) -> FWord {
72        let range = self.ascender_byte_range();
73        self.data.read_at(range.start).ok().unwrap()
74    }
75
76    /// Typographic descent.
77    pub fn descender(&self) -> FWord {
78        let range = self.descender_byte_range();
79        self.data.read_at(range.start).ok().unwrap()
80    }
81
82    /// Typographic line gap. Negative LineGap values are treated as
83    /// zero in some legacy platform implementations.
84    pub fn line_gap(&self) -> FWord {
85        let range = self.line_gap_byte_range();
86        self.data.read_at(range.start).ok().unwrap()
87    }
88
89    /// Maximum advance width value in 'hmtx' table.
90    pub fn advance_width_max(&self) -> UfWord {
91        let range = self.advance_width_max_byte_range();
92        self.data.read_at(range.start).ok().unwrap()
93    }
94
95    /// Minimum left sidebearing value in 'hmtx' table for glyphs with
96    /// contours (empty glyphs should be ignored).
97    pub fn min_left_side_bearing(&self) -> FWord {
98        let range = self.min_left_side_bearing_byte_range();
99        self.data.read_at(range.start).ok().unwrap()
100    }
101
102    /// Minimum right sidebearing value; calculated as min(aw - (lsb +
103    /// xMax - xMin)) for glyphs with contours (empty glyphs should be ignored).
104    pub fn min_right_side_bearing(&self) -> FWord {
105        let range = self.min_right_side_bearing_byte_range();
106        self.data.read_at(range.start).ok().unwrap()
107    }
108
109    /// Max(lsb + (xMax-xMin))
110    pub fn x_max_extent(&self) -> FWord {
111        let range = self.x_max_extent_byte_range();
112        self.data.read_at(range.start).ok().unwrap()
113    }
114
115    /// Used to calculate the slope of the cursor (rise/run); 1 for
116    /// vertical caret, 0 for horizontal.
117    pub fn caret_slope_rise(&self) -> i16 {
118        let range = self.caret_slope_rise_byte_range();
119        self.data.read_at(range.start).ok().unwrap()
120    }
121
122    /// 0 for vertical caret, 1 for horizontal.
123    pub fn caret_slope_run(&self) -> i16 {
124        let range = self.caret_slope_run_byte_range();
125        self.data.read_at(range.start).ok().unwrap()
126    }
127
128    /// The amount by which a slanted highlight on a glyph needs to be
129    /// shifted to produce the best appearance. Set to 0 for
130    /// non-slanted fonts
131    pub fn caret_offset(&self) -> i16 {
132        let range = self.caret_offset_byte_range();
133        self.data.read_at(range.start).ok().unwrap()
134    }
135
136    /// 0 for current format.
137    pub fn metric_data_format(&self) -> i16 {
138        let range = self.metric_data_format_byte_range();
139        self.data.read_at(range.start).ok().unwrap()
140    }
141
142    /// Number of hMetric entries in 'hmtx' table
143    pub fn number_of_h_metrics(&self) -> u16 {
144        let range = self.number_of_h_metrics_byte_range();
145        self.data.read_at(range.start).ok().unwrap()
146    }
147
148    pub fn version_byte_range(&self) -> Range<usize> {
149        let start = 0;
150        let end = start + MajorMinor::RAW_BYTE_LEN;
151        start..end
152    }
153
154    pub fn ascender_byte_range(&self) -> Range<usize> {
155        let start = self.version_byte_range().end;
156        let end = start + FWord::RAW_BYTE_LEN;
157        start..end
158    }
159
160    pub fn descender_byte_range(&self) -> Range<usize> {
161        let start = self.ascender_byte_range().end;
162        let end = start + FWord::RAW_BYTE_LEN;
163        start..end
164    }
165
166    pub fn line_gap_byte_range(&self) -> Range<usize> {
167        let start = self.descender_byte_range().end;
168        let end = start + FWord::RAW_BYTE_LEN;
169        start..end
170    }
171
172    pub fn advance_width_max_byte_range(&self) -> Range<usize> {
173        let start = self.line_gap_byte_range().end;
174        let end = start + UfWord::RAW_BYTE_LEN;
175        start..end
176    }
177
178    pub fn min_left_side_bearing_byte_range(&self) -> Range<usize> {
179        let start = self.advance_width_max_byte_range().end;
180        let end = start + FWord::RAW_BYTE_LEN;
181        start..end
182    }
183
184    pub fn min_right_side_bearing_byte_range(&self) -> Range<usize> {
185        let start = self.min_left_side_bearing_byte_range().end;
186        let end = start + FWord::RAW_BYTE_LEN;
187        start..end
188    }
189
190    pub fn x_max_extent_byte_range(&self) -> Range<usize> {
191        let start = self.min_right_side_bearing_byte_range().end;
192        let end = start + FWord::RAW_BYTE_LEN;
193        start..end
194    }
195
196    pub fn caret_slope_rise_byte_range(&self) -> Range<usize> {
197        let start = self.x_max_extent_byte_range().end;
198        let end = start + i16::RAW_BYTE_LEN;
199        start..end
200    }
201
202    pub fn caret_slope_run_byte_range(&self) -> Range<usize> {
203        let start = self.caret_slope_rise_byte_range().end;
204        let end = start + i16::RAW_BYTE_LEN;
205        start..end
206    }
207
208    pub fn caret_offset_byte_range(&self) -> Range<usize> {
209        let start = self.caret_slope_run_byte_range().end;
210        let end = start + i16::RAW_BYTE_LEN;
211        start..end
212    }
213
214    pub fn reserved1_byte_range(&self) -> Range<usize> {
215        let start = self.caret_offset_byte_range().end;
216        let end = start + i16::RAW_BYTE_LEN;
217        start..end
218    }
219
220    pub fn reserved2_byte_range(&self) -> Range<usize> {
221        let start = self.reserved1_byte_range().end;
222        let end = start + i16::RAW_BYTE_LEN;
223        start..end
224    }
225
226    pub fn reserved3_byte_range(&self) -> Range<usize> {
227        let start = self.reserved2_byte_range().end;
228        let end = start + i16::RAW_BYTE_LEN;
229        start..end
230    }
231
232    pub fn reserved4_byte_range(&self) -> Range<usize> {
233        let start = self.reserved3_byte_range().end;
234        let end = start + i16::RAW_BYTE_LEN;
235        start..end
236    }
237
238    pub fn metric_data_format_byte_range(&self) -> Range<usize> {
239        let start = self.reserved4_byte_range().end;
240        let end = start + i16::RAW_BYTE_LEN;
241        start..end
242    }
243
244    pub fn number_of_h_metrics_byte_range(&self) -> Range<usize> {
245        let start = self.metric_data_format_byte_range().end;
246        let end = start + u16::RAW_BYTE_LEN;
247        start..end
248    }
249}
250
251const _: () = assert!(FontData::default_data_long_enough(Hhea::MIN_SIZE));
252
253impl Default for Hhea<'_> {
254    fn default() -> Self {
255        Self {
256            data: FontData::default_table_data(),
257        }
258    }
259}
260
261#[cfg(feature = "experimental_traverse")]
262impl<'a> SomeTable<'a> for Hhea<'a> {
263    fn type_name(&self) -> &str {
264        "Hhea"
265    }
266    fn get_field(&self, idx: usize) -> Option<Field<'a>> {
267        match idx {
268            0usize => Some(Field::new("version", self.version())),
269            1usize => Some(Field::new("ascender", self.ascender())),
270            2usize => Some(Field::new("descender", self.descender())),
271            3usize => Some(Field::new("line_gap", self.line_gap())),
272            4usize => Some(Field::new("advance_width_max", self.advance_width_max())),
273            5usize => Some(Field::new(
274                "min_left_side_bearing",
275                self.min_left_side_bearing(),
276            )),
277            6usize => Some(Field::new(
278                "min_right_side_bearing",
279                self.min_right_side_bearing(),
280            )),
281            7usize => Some(Field::new("x_max_extent", self.x_max_extent())),
282            8usize => Some(Field::new("caret_slope_rise", self.caret_slope_rise())),
283            9usize => Some(Field::new("caret_slope_run", self.caret_slope_run())),
284            10usize => Some(Field::new("caret_offset", self.caret_offset())),
285            11usize => Some(Field::new("metric_data_format", self.metric_data_format())),
286            12usize => Some(Field::new(
287                "number_of_h_metrics",
288                self.number_of_h_metrics(),
289            )),
290            _ => None,
291        }
292    }
293}
294
295#[cfg(feature = "experimental_traverse")]
296#[allow(clippy::needless_lifetimes)]
297impl<'a> std::fmt::Debug for Hhea<'a> {
298    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
299        (self as &dyn SomeTable<'a>).fmt(f)
300    }
301}