read_fonts/generated/
generated_feat.rs1#[allow(unused_imports)]
6use crate::codegen_prelude::*;
7
8#[derive(Debug, Clone, Copy)]
10#[doc(hidden)]
11pub struct FeatMarker {
12 names_byte_len: usize,
13}
14
15impl FeatMarker {
16 pub fn version_byte_range(&self) -> Range<usize> {
17 let start = 0;
18 start..start + MajorMinor::RAW_BYTE_LEN
19 }
20
21 pub fn feature_name_count_byte_range(&self) -> Range<usize> {
22 let start = self.version_byte_range().end;
23 start..start + u16::RAW_BYTE_LEN
24 }
25
26 pub fn _reserved1_byte_range(&self) -> Range<usize> {
27 let start = self.feature_name_count_byte_range().end;
28 start..start + u16::RAW_BYTE_LEN
29 }
30
31 pub fn _reserved2_byte_range(&self) -> Range<usize> {
32 let start = self._reserved1_byte_range().end;
33 start..start + u32::RAW_BYTE_LEN
34 }
35
36 pub fn names_byte_range(&self) -> Range<usize> {
37 let start = self._reserved2_byte_range().end;
38 start..start + self.names_byte_len
39 }
40}
41
42impl MinByteRange for FeatMarker {
43 fn min_byte_range(&self) -> Range<usize> {
44 0..self.names_byte_range().end
45 }
46}
47
48impl TopLevelTable for Feat<'_> {
49 const TAG: Tag = Tag::new(b"feat");
51}
52
53impl<'a> FontRead<'a> for Feat<'a> {
54 fn read(data: FontData<'a>) -> Result<Self, ReadError> {
55 let mut cursor = data.cursor();
56 cursor.advance::<MajorMinor>();
57 let feature_name_count: u16 = cursor.read()?;
58 cursor.advance::<u16>();
59 cursor.advance::<u32>();
60 let names_byte_len = (feature_name_count as usize)
61 .checked_mul(FeatureName::RAW_BYTE_LEN)
62 .ok_or(ReadError::OutOfBounds)?;
63 cursor.advance_by(names_byte_len);
64 cursor.finish(FeatMarker { names_byte_len })
65 }
66}
67
68pub type Feat<'a> = TableRef<'a, FeatMarker>;
70
71#[allow(clippy::needless_lifetimes)]
72impl<'a> Feat<'a> {
73 pub fn version(&self) -> MajorMinor {
76 let range = self.shape.version_byte_range();
77 self.data.read_at(range.start).unwrap()
78 }
79
80 pub fn feature_name_count(&self) -> u16 {
82 let range = self.shape.feature_name_count_byte_range();
83 self.data.read_at(range.start).unwrap()
84 }
85
86 pub fn names(&self) -> &'a [FeatureName] {
88 let range = self.shape.names_byte_range();
89 self.data.read_array(range).unwrap()
90 }
91}
92
93#[cfg(feature = "experimental_traverse")]
94impl<'a> SomeTable<'a> for Feat<'a> {
95 fn type_name(&self) -> &str {
96 "Feat"
97 }
98 fn get_field(&self, idx: usize) -> Option<Field<'a>> {
99 match idx {
100 0usize => Some(Field::new("version", self.version())),
101 1usize => Some(Field::new("feature_name_count", self.feature_name_count())),
102 2usize => Some(Field::new(
103 "names",
104 traversal::FieldType::array_of_records(
105 stringify!(FeatureName),
106 self.names(),
107 self.offset_data(),
108 ),
109 )),
110 _ => None,
111 }
112 }
113}
114
115#[cfg(feature = "experimental_traverse")]
116#[allow(clippy::needless_lifetimes)]
117impl<'a> std::fmt::Debug for Feat<'a> {
118 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
119 (self as &dyn SomeTable<'a>).fmt(f)
120 }
121}
122
123#[derive(Clone, Debug, Copy, bytemuck :: AnyBitPattern)]
125#[repr(C)]
126#[repr(packed)]
127pub struct FeatureName {
128 pub feature: BigEndian<u16>,
130 pub n_settings: BigEndian<u16>,
132 pub setting_table_offset: BigEndian<Offset32>,
136 pub feature_flags: BigEndian<u16>,
138 pub name_index: BigEndian<NameId>,
140}
141
142impl FeatureName {
143 pub fn feature(&self) -> u16 {
145 self.feature.get()
146 }
147
148 pub fn n_settings(&self) -> u16 {
150 self.n_settings.get()
151 }
152
153 pub fn setting_table_offset(&self) -> Offset32 {
157 self.setting_table_offset.get()
158 }
159
160 pub fn setting_table<'a>(&self, data: FontData<'a>) -> Result<SettingNameArray<'a>, ReadError> {
167 let args = self.n_settings();
168 self.setting_table_offset().resolve_with_args(data, &args)
169 }
170
171 pub fn feature_flags(&self) -> u16 {
173 self.feature_flags.get()
174 }
175
176 pub fn name_index(&self) -> NameId {
178 self.name_index.get()
179 }
180}
181
182impl FixedSize for FeatureName {
183 const RAW_BYTE_LEN: usize = u16::RAW_BYTE_LEN
184 + u16::RAW_BYTE_LEN
185 + Offset32::RAW_BYTE_LEN
186 + u16::RAW_BYTE_LEN
187 + NameId::RAW_BYTE_LEN;
188}
189
190#[cfg(feature = "experimental_traverse")]
191impl<'a> SomeRecord<'a> for FeatureName {
192 fn traverse(self, data: FontData<'a>) -> RecordResolver<'a> {
193 RecordResolver {
194 name: "FeatureName",
195 get_field: Box::new(move |idx, _data| match idx {
196 0usize => Some(Field::new("feature", self.feature())),
197 1usize => Some(Field::new("n_settings", self.n_settings())),
198 2usize => Some(Field::new(
199 "setting_table_offset",
200 FieldType::offset(self.setting_table_offset(), self.setting_table(_data)),
201 )),
202 3usize => Some(Field::new("feature_flags", self.feature_flags())),
203 4usize => Some(Field::new("name_index", self.name_index())),
204 _ => None,
205 }),
206 data,
207 }
208 }
209}
210
211#[derive(Debug, Clone, Copy)]
212#[doc(hidden)]
213pub struct SettingNameArrayMarker {
214 settings_byte_len: usize,
215}
216
217impl SettingNameArrayMarker {
218 pub fn settings_byte_range(&self) -> Range<usize> {
219 let start = 0;
220 start..start + self.settings_byte_len
221 }
222}
223
224impl MinByteRange for SettingNameArrayMarker {
225 fn min_byte_range(&self) -> Range<usize> {
226 0..self.settings_byte_range().end
227 }
228}
229
230impl ReadArgs for SettingNameArray<'_> {
231 type Args = u16;
232}
233
234impl<'a> FontReadWithArgs<'a> for SettingNameArray<'a> {
235 fn read_with_args(data: FontData<'a>, args: &u16) -> Result<Self, ReadError> {
236 let n_settings = *args;
237 let mut cursor = data.cursor();
238 let settings_byte_len = (n_settings as usize)
239 .checked_mul(SettingName::RAW_BYTE_LEN)
240 .ok_or(ReadError::OutOfBounds)?;
241 cursor.advance_by(settings_byte_len);
242 cursor.finish(SettingNameArrayMarker { settings_byte_len })
243 }
244}
245
246impl<'a> SettingNameArray<'a> {
247 pub fn read(data: FontData<'a>, n_settings: u16) -> Result<Self, ReadError> {
252 let args = n_settings;
253 Self::read_with_args(data, &args)
254 }
255}
256
257pub type SettingNameArray<'a> = TableRef<'a, SettingNameArrayMarker>;
258
259#[allow(clippy::needless_lifetimes)]
260impl<'a> SettingNameArray<'a> {
261 pub fn settings(&self) -> &'a [SettingName] {
263 let range = self.shape.settings_byte_range();
264 self.data.read_array(range).unwrap()
265 }
266}
267
268#[cfg(feature = "experimental_traverse")]
269impl<'a> SomeTable<'a> for SettingNameArray<'a> {
270 fn type_name(&self) -> &str {
271 "SettingNameArray"
272 }
273 fn get_field(&self, idx: usize) -> Option<Field<'a>> {
274 match idx {
275 0usize => Some(Field::new(
276 "settings",
277 traversal::FieldType::array_of_records(
278 stringify!(SettingName),
279 self.settings(),
280 self.offset_data(),
281 ),
282 )),
283 _ => None,
284 }
285 }
286}
287
288#[cfg(feature = "experimental_traverse")]
289#[allow(clippy::needless_lifetimes)]
290impl<'a> std::fmt::Debug for SettingNameArray<'a> {
291 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
292 (self as &dyn SomeTable<'a>).fmt(f)
293 }
294}
295
296#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, bytemuck :: AnyBitPattern)]
298#[repr(C)]
299#[repr(packed)]
300pub struct SettingName {
301 pub setting: BigEndian<u16>,
303 pub name_index: BigEndian<NameId>,
305}
306
307impl SettingName {
308 pub fn setting(&self) -> u16 {
310 self.setting.get()
311 }
312
313 pub fn name_index(&self) -> NameId {
315 self.name_index.get()
316 }
317}
318
319impl FixedSize for SettingName {
320 const RAW_BYTE_LEN: usize = u16::RAW_BYTE_LEN + NameId::RAW_BYTE_LEN;
321}
322
323#[cfg(feature = "experimental_traverse")]
324impl<'a> SomeRecord<'a> for SettingName {
325 fn traverse(self, data: FontData<'a>) -> RecordResolver<'a> {
326 RecordResolver {
327 name: "SettingName",
328 get_field: Box::new(move |idx, _data| match idx {
329 0usize => Some(Field::new("setting", self.setting())),
330 1usize => Some(Field::new("name_index", self.name_index())),
331 _ => None,
332 }),
333 data,
334 }
335 }
336}