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<'a> FontRead<'a> for Hhea<'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#[derive(Clone)]
35pub struct Hhea<'a> {
36 data: FontData<'a>,
37}
38
39#[allow(clippy::needless_lifetimes)]
40impl<'a> Hhea<'a> {
41 pub const MIN_SIZE: usize = (MajorMinor::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 pub fn version(&self) -> MajorMinor {
62 let range = self.version_byte_range();
63 self.data.read_at(range.start).ok().unwrap()
64 }
65
66 pub fn ascender(&self) -> FWord {
68 let range = self.ascender_byte_range();
69 self.data.read_at(range.start).ok().unwrap()
70 }
71
72 pub fn descender(&self) -> FWord {
74 let range = self.descender_byte_range();
75 self.data.read_at(range.start).ok().unwrap()
76 }
77
78 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 pub fn advance_width_max(&self) -> UfWord {
87 let range = self.advance_width_max_byte_range();
88 self.data.read_at(range.start).ok().unwrap()
89 }
90
91 pub fn min_left_side_bearing(&self) -> FWord {
94 let range = self.min_left_side_bearing_byte_range();
95 self.data.read_at(range.start).ok().unwrap()
96 }
97
98 pub fn min_right_side_bearing(&self) -> FWord {
101 let range = self.min_right_side_bearing_byte_range();
102 self.data.read_at(range.start).ok().unwrap()
103 }
104
105 pub fn x_max_extent(&self) -> FWord {
107 let range = self.x_max_extent_byte_range();
108 self.data.read_at(range.start).ok().unwrap()
109 }
110
111 pub fn caret_slope_rise(&self) -> i16 {
114 let range = self.caret_slope_rise_byte_range();
115 self.data.read_at(range.start).ok().unwrap()
116 }
117
118 pub fn caret_slope_run(&self) -> i16 {
120 let range = self.caret_slope_run_byte_range();
121 self.data.read_at(range.start).ok().unwrap()
122 }
123
124 pub fn caret_offset(&self) -> i16 {
128 let range = self.caret_offset_byte_range();
129 self.data.read_at(range.start).ok().unwrap()
130 }
131
132 pub fn metric_data_format(&self) -> i16 {
134 let range = self.metric_data_format_byte_range();
135 self.data.read_at(range.start).ok().unwrap()
136 }
137
138 pub fn number_of_h_metrics(&self) -> u16 {
140 let range = self.number_of_h_metrics_byte_range();
141 self.data.read_at(range.start).ok().unwrap()
142 }
143
144 pub fn version_byte_range(&self) -> Range<usize> {
145 let start = 0;
146 let end = start + MajorMinor::RAW_BYTE_LEN;
147 start..end
148 }
149
150 pub fn ascender_byte_range(&self) -> Range<usize> {
151 let start = self.version_byte_range().end;
152 let end = start + FWord::RAW_BYTE_LEN;
153 start..end
154 }
155
156 pub fn descender_byte_range(&self) -> Range<usize> {
157 let start = self.ascender_byte_range().end;
158 let end = start + FWord::RAW_BYTE_LEN;
159 start..end
160 }
161
162 pub fn line_gap_byte_range(&self) -> Range<usize> {
163 let start = self.descender_byte_range().end;
164 let end = start + FWord::RAW_BYTE_LEN;
165 start..end
166 }
167
168 pub fn advance_width_max_byte_range(&self) -> Range<usize> {
169 let start = self.line_gap_byte_range().end;
170 let end = start + UfWord::RAW_BYTE_LEN;
171 start..end
172 }
173
174 pub fn min_left_side_bearing_byte_range(&self) -> Range<usize> {
175 let start = self.advance_width_max_byte_range().end;
176 let end = start + FWord::RAW_BYTE_LEN;
177 start..end
178 }
179
180 pub fn min_right_side_bearing_byte_range(&self) -> Range<usize> {
181 let start = self.min_left_side_bearing_byte_range().end;
182 let end = start + FWord::RAW_BYTE_LEN;
183 start..end
184 }
185
186 pub fn x_max_extent_byte_range(&self) -> Range<usize> {
187 let start = self.min_right_side_bearing_byte_range().end;
188 let end = start + FWord::RAW_BYTE_LEN;
189 start..end
190 }
191
192 pub fn caret_slope_rise_byte_range(&self) -> Range<usize> {
193 let start = self.x_max_extent_byte_range().end;
194 let end = start + i16::RAW_BYTE_LEN;
195 start..end
196 }
197
198 pub fn caret_slope_run_byte_range(&self) -> Range<usize> {
199 let start = self.caret_slope_rise_byte_range().end;
200 let end = start + i16::RAW_BYTE_LEN;
201 start..end
202 }
203
204 pub fn caret_offset_byte_range(&self) -> Range<usize> {
205 let start = self.caret_slope_run_byte_range().end;
206 let end = start + i16::RAW_BYTE_LEN;
207 start..end
208 }
209
210 pub fn reserved1_byte_range(&self) -> Range<usize> {
211 let start = self.caret_offset_byte_range().end;
212 let end = start + i16::RAW_BYTE_LEN;
213 start..end
214 }
215
216 pub fn reserved2_byte_range(&self) -> Range<usize> {
217 let start = self.reserved1_byte_range().end;
218 let end = start + i16::RAW_BYTE_LEN;
219 start..end
220 }
221
222 pub fn reserved3_byte_range(&self) -> Range<usize> {
223 let start = self.reserved2_byte_range().end;
224 let end = start + i16::RAW_BYTE_LEN;
225 start..end
226 }
227
228 pub fn reserved4_byte_range(&self) -> Range<usize> {
229 let start = self.reserved3_byte_range().end;
230 let end = start + i16::RAW_BYTE_LEN;
231 start..end
232 }
233
234 pub fn metric_data_format_byte_range(&self) -> Range<usize> {
235 let start = self.reserved4_byte_range().end;
236 let end = start + i16::RAW_BYTE_LEN;
237 start..end
238 }
239
240 pub fn number_of_h_metrics_byte_range(&self) -> Range<usize> {
241 let start = self.metric_data_format_byte_range().end;
242 let end = start + u16::RAW_BYTE_LEN;
243 start..end
244 }
245}
246
247const _: () = assert!(FontData::default_data_long_enough(Hhea::MIN_SIZE));
248
249impl Default for Hhea<'_> {
250 fn default() -> Self {
251 Self {
252 data: FontData::default_table_data(),
253 }
254 }
255}
256
257#[cfg(feature = "experimental_traverse")]
258impl<'a> SomeTable<'a> for Hhea<'a> {
259 fn type_name(&self) -> &str {
260 "Hhea"
261 }
262 fn get_field(&self, idx: usize) -> Option<Field<'a>> {
263 match idx {
264 0usize => Some(Field::new("version", self.version())),
265 1usize => Some(Field::new("ascender", self.ascender())),
266 2usize => Some(Field::new("descender", self.descender())),
267 3usize => Some(Field::new("line_gap", self.line_gap())),
268 4usize => Some(Field::new("advance_width_max", self.advance_width_max())),
269 5usize => Some(Field::new(
270 "min_left_side_bearing",
271 self.min_left_side_bearing(),
272 )),
273 6usize => Some(Field::new(
274 "min_right_side_bearing",
275 self.min_right_side_bearing(),
276 )),
277 7usize => Some(Field::new("x_max_extent", self.x_max_extent())),
278 8usize => Some(Field::new("caret_slope_rise", self.caret_slope_rise())),
279 9usize => Some(Field::new("caret_slope_run", self.caret_slope_run())),
280 10usize => Some(Field::new("caret_offset", self.caret_offset())),
281 11usize => Some(Field::new("metric_data_format", self.metric_data_format())),
282 12usize => Some(Field::new(
283 "number_of_h_metrics",
284 self.number_of_h_metrics(),
285 )),
286 _ => None,
287 }
288 }
289}
290
291#[cfg(feature = "experimental_traverse")]
292#[allow(clippy::needless_lifetimes)]
293impl<'a> std::fmt::Debug for Hhea<'a> {
294 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
295 (self as &dyn SomeTable<'a>).fmt(f)
296 }
297}