1//! A [Horizontal Header Table](
2//! https://docs.microsoft.com/en-us/typography/opentype/spec/hhea) implementation.
3
4use crate::parser::Stream;
5
6/// A [Horizontal Header Table](https://docs.microsoft.com/en-us/typography/opentype/spec/hhea).
7#[derive(Clone, Copy, Debug)]
8pub struct Table {
9 /// Face ascender.
10 pub ascender: i16,
11 /// Face descender.
12 pub descender: i16,
13 /// Face line gap.
14 pub line_gap: i16,
15 /// Number of metrics in the `hmtx` table.
16 pub number_of_metrics: u16,
17}
18
19impl Table {
20 /// Parses a table from raw data.
21 pub fn parse(data: &[u8]) -> Option<Self> {
22 // Do not check the exact length, because some fonts include
23 // padding in table's length in table records, which is incorrect.
24 if data.len() < 36 {
25 return None;
26 }
27
28 let mut s = Stream::new(data);
29 s.skip::<u32>(); // version
30 let ascender = s.read::<i16>()?;
31 let descender = s.read::<i16>()?;
32 let line_gap = s.read::<i16>()?;
33 s.advance(24);
34 let number_of_metrics = s.read::<u16>()?;
35
36 Some(Table {
37 ascender,
38 descender,
39 line_gap,
40 number_of_metrics,
41 })
42 }
43}
44