Skip to main content

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