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 start..start + MajorMinor::RAW_BYTE_LEN
147 }
148
149 pub fn ascender_byte_range(&self) -> Range<usize> {
150 let start = self.version_byte_range().end;
151 start..start + FWord::RAW_BYTE_LEN
152 }
153
154 pub fn descender_byte_range(&self) -> Range<usize> {
155 let start = self.ascender_byte_range().end;
156 start..start + FWord::RAW_BYTE_LEN
157 }
158
159 pub fn line_gap_byte_range(&self) -> Range<usize> {
160 let start = self.descender_byte_range().end;
161 start..start + FWord::RAW_BYTE_LEN
162 }
163
164 pub fn advance_width_max_byte_range(&self) -> Range<usize> {
165 let start = self.line_gap_byte_range().end;
166 start..start + UfWord::RAW_BYTE_LEN
167 }
168
169 pub fn min_left_side_bearing_byte_range(&self) -> Range<usize> {
170 let start = self.advance_width_max_byte_range().end;
171 start..start + FWord::RAW_BYTE_LEN
172 }
173
174 pub fn min_right_side_bearing_byte_range(&self) -> Range<usize> {
175 let start = self.min_left_side_bearing_byte_range().end;
176 start..start + FWord::RAW_BYTE_LEN
177 }
178
179 pub fn x_max_extent_byte_range(&self) -> Range<usize> {
180 let start = self.min_right_side_bearing_byte_range().end;
181 start..start + FWord::RAW_BYTE_LEN
182 }
183
184 pub fn caret_slope_rise_byte_range(&self) -> Range<usize> {
185 let start = self.x_max_extent_byte_range().end;
186 start..start + i16::RAW_BYTE_LEN
187 }
188
189 pub fn caret_slope_run_byte_range(&self) -> Range<usize> {
190 let start = self.caret_slope_rise_byte_range().end;
191 start..start + i16::RAW_BYTE_LEN
192 }
193
194 pub fn caret_offset_byte_range(&self) -> Range<usize> {
195 let start = self.caret_slope_run_byte_range().end;
196 start..start + i16::RAW_BYTE_LEN
197 }
198
199 pub fn reserved1_byte_range(&self) -> Range<usize> {
200 let start = self.caret_offset_byte_range().end;
201 start..start + i16::RAW_BYTE_LEN
202 }
203
204 pub fn reserved2_byte_range(&self) -> Range<usize> {
205 let start = self.reserved1_byte_range().end;
206 start..start + i16::RAW_BYTE_LEN
207 }
208
209 pub fn reserved3_byte_range(&self) -> Range<usize> {
210 let start = self.reserved2_byte_range().end;
211 start..start + i16::RAW_BYTE_LEN
212 }
213
214 pub fn reserved4_byte_range(&self) -> Range<usize> {
215 let start = self.reserved3_byte_range().end;
216 start..start + i16::RAW_BYTE_LEN
217 }
218
219 pub fn metric_data_format_byte_range(&self) -> Range<usize> {
220 let start = self.reserved4_byte_range().end;
221 start..start + i16::RAW_BYTE_LEN
222 }
223
224 pub fn number_of_h_metrics_byte_range(&self) -> Range<usize> {
225 let start = self.metric_data_format_byte_range().end;
226 start..start + u16::RAW_BYTE_LEN
227 }
228}
229
230#[cfg(feature = "experimental_traverse")]
231impl<'a> SomeTable<'a> for Hhea<'a> {
232 fn type_name(&self) -> &str {
233 "Hhea"
234 }
235 fn get_field(&self, idx: usize) -> Option<Field<'a>> {
236 match idx {
237 0usize => Some(Field::new("version", self.version())),
238 1usize => Some(Field::new("ascender", self.ascender())),
239 2usize => Some(Field::new("descender", self.descender())),
240 3usize => Some(Field::new("line_gap", self.line_gap())),
241 4usize => Some(Field::new("advance_width_max", self.advance_width_max())),
242 5usize => Some(Field::new(
243 "min_left_side_bearing",
244 self.min_left_side_bearing(),
245 )),
246 6usize => Some(Field::new(
247 "min_right_side_bearing",
248 self.min_right_side_bearing(),
249 )),
250 7usize => Some(Field::new("x_max_extent", self.x_max_extent())),
251 8usize => Some(Field::new("caret_slope_rise", self.caret_slope_rise())),
252 9usize => Some(Field::new("caret_slope_run", self.caret_slope_run())),
253 10usize => Some(Field::new("caret_offset", self.caret_offset())),
254 11usize => Some(Field::new("metric_data_format", self.metric_data_format())),
255 12usize => Some(Field::new(
256 "number_of_h_metrics",
257 self.number_of_h_metrics(),
258 )),
259 _ => None,
260 }
261 }
262}
263
264#[cfg(feature = "experimental_traverse")]
265#[allow(clippy::needless_lifetimes)]
266impl<'a> std::fmt::Debug for Hhea<'a> {
267 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
268 (self as &dyn SomeTable<'a>).fmt(f)
269 }
270}