read_fonts/generated/
generated_hhea.rs1#[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 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#[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 pub fn version(&self) -> MajorMinor {
66 let range = self.version_byte_range();
67 self.data.read_at(range.start).ok().unwrap()
68 }
69
70 pub fn ascender(&self) -> FWord {
72 let range = self.ascender_byte_range();
73 self.data.read_at(range.start).ok().unwrap()
74 }
75
76 pub fn descender(&self) -> FWord {
78 let range = self.descender_byte_range();
79 self.data.read_at(range.start).ok().unwrap()
80 }
81
82 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 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 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 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 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 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 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 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 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 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}