1 | //! A [Horizontal Header Table]( |
2 | //! https://docs.microsoft.com/en-us/typography/opentype/spec/hhea) implementation. |
3 | |
4 | use crate::parser::Stream; |
5 | |
6 | /// A [Horizontal Header Table](https://docs.microsoft.com/en-us/typography/opentype/spec/hhea). |
7 | #[derive (Clone, Copy, Debug)] |
8 | pub 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 | |
19 | impl 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 | |