read_fonts/generated/
generated_avar.rs1#[allow(unused_imports)]
6use crate::codegen_prelude::*;
7
8#[derive(Debug, Clone, Copy)]
10#[doc(hidden)]
11pub struct AvarMarker {
12 axis_segment_maps_byte_len: usize,
13 axis_index_map_offset_byte_start: Option<usize>,
14 var_store_offset_byte_start: Option<usize>,
15}
16
17impl AvarMarker {
18 pub fn version_byte_range(&self) -> Range<usize> {
19 let start = 0;
20 start..start + MajorMinor::RAW_BYTE_LEN
21 }
22
23 pub fn _reserved_byte_range(&self) -> Range<usize> {
24 let start = self.version_byte_range().end;
25 start..start + u16::RAW_BYTE_LEN
26 }
27
28 pub fn axis_count_byte_range(&self) -> Range<usize> {
29 let start = self._reserved_byte_range().end;
30 start..start + u16::RAW_BYTE_LEN
31 }
32
33 pub fn axis_segment_maps_byte_range(&self) -> Range<usize> {
34 let start = self.axis_count_byte_range().end;
35 start..start + self.axis_segment_maps_byte_len
36 }
37
38 pub fn axis_index_map_offset_byte_range(&self) -> Option<Range<usize>> {
39 let start = self.axis_index_map_offset_byte_start?;
40 Some(start..start + Offset32::RAW_BYTE_LEN)
41 }
42
43 pub fn var_store_offset_byte_range(&self) -> Option<Range<usize>> {
44 let start = self.var_store_offset_byte_start?;
45 Some(start..start + Offset32::RAW_BYTE_LEN)
46 }
47}
48
49impl MinByteRange for AvarMarker {
50 fn min_byte_range(&self) -> Range<usize> {
51 0..self.axis_segment_maps_byte_range().end
52 }
53}
54
55impl TopLevelTable for Avar<'_> {
56 const TAG: Tag = Tag::new(b"avar");
58}
59
60impl<'a> FontRead<'a> for Avar<'a> {
61 fn read(data: FontData<'a>) -> Result<Self, ReadError> {
62 let mut cursor = data.cursor();
63 let version: MajorMinor = cursor.read()?;
64 cursor.advance::<u16>();
65 let axis_count: u16 = cursor.read()?;
66 let axis_segment_maps_byte_len = {
67 let data = cursor.remaining().ok_or(ReadError::OutOfBounds)?;
68 <SegmentMaps as VarSize>::total_len_for_count(data, axis_count as usize)?
69 };
70 cursor.advance_by(axis_segment_maps_byte_len);
71 let axis_index_map_offset_byte_start = version
72 .compatible((2u16, 0u16))
73 .then(|| cursor.position())
74 .transpose()?;
75 version
76 .compatible((2u16, 0u16))
77 .then(|| cursor.advance::<Offset32>());
78 let var_store_offset_byte_start = version
79 .compatible((2u16, 0u16))
80 .then(|| cursor.position())
81 .transpose()?;
82 version
83 .compatible((2u16, 0u16))
84 .then(|| cursor.advance::<Offset32>());
85 cursor.finish(AvarMarker {
86 axis_segment_maps_byte_len,
87 axis_index_map_offset_byte_start,
88 var_store_offset_byte_start,
89 })
90 }
91}
92
93pub type Avar<'a> = TableRef<'a, AvarMarker>;
95
96#[allow(clippy::needless_lifetimes)]
97impl<'a> Avar<'a> {
98 pub fn version(&self) -> MajorMinor {
101 let range = self.shape.version_byte_range();
102 self.data.read_at(range.start).unwrap()
103 }
104
105 pub fn axis_count(&self) -> u16 {
107 let range = self.shape.axis_count_byte_range();
108 self.data.read_at(range.start).unwrap()
109 }
110
111 pub fn axis_segment_maps(&self) -> VarLenArray<'a, SegmentMaps<'a>> {
113 let range = self.shape.axis_segment_maps_byte_range();
114 VarLenArray::read(self.data.split_off(range.start).unwrap()).unwrap()
115 }
116
117 pub fn axis_index_map_offset(&self) -> Option<Nullable<Offset32>> {
119 let range = self.shape.axis_index_map_offset_byte_range()?;
120 Some(self.data.read_at(range.start).unwrap())
121 }
122
123 pub fn axis_index_map(&self) -> Option<Result<DeltaSetIndexMap<'a>, ReadError>> {
125 let data = self.data;
126 self.axis_index_map_offset().map(|x| x.resolve(data))?
127 }
128
129 pub fn var_store_offset(&self) -> Option<Nullable<Offset32>> {
131 let range = self.shape.var_store_offset_byte_range()?;
132 Some(self.data.read_at(range.start).unwrap())
133 }
134
135 pub fn var_store(&self) -> Option<Result<ItemVariationStore<'a>, ReadError>> {
137 let data = self.data;
138 self.var_store_offset().map(|x| x.resolve(data))?
139 }
140}
141
142#[cfg(feature = "experimental_traverse")]
143impl<'a> SomeTable<'a> for Avar<'a> {
144 fn type_name(&self) -> &str {
145 "Avar"
146 }
147 fn get_field(&self, idx: usize) -> Option<Field<'a>> {
148 let version = self.version();
149 match idx {
150 0usize => Some(Field::new("version", self.version())),
151 1usize => Some(Field::new("axis_count", self.axis_count())),
152 2usize => Some(Field::new(
153 "axis_segment_maps",
154 traversal::FieldType::var_array(
155 "SegmentMaps",
156 self.axis_segment_maps(),
157 self.offset_data(),
158 ),
159 )),
160 3usize if version.compatible((2u16, 0u16)) => Some(Field::new(
161 "axis_index_map_offset",
162 FieldType::offset(self.axis_index_map_offset().unwrap(), self.axis_index_map()),
163 )),
164 4usize if version.compatible((2u16, 0u16)) => Some(Field::new(
165 "var_store_offset",
166 FieldType::offset(self.var_store_offset().unwrap(), self.var_store()),
167 )),
168 _ => None,
169 }
170 }
171}
172
173#[cfg(feature = "experimental_traverse")]
174#[allow(clippy::needless_lifetimes)]
175impl<'a> std::fmt::Debug for Avar<'a> {
176 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
177 (self as &dyn SomeTable<'a>).fmt(f)
178 }
179}
180
181#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
183pub struct SegmentMaps<'a> {
184 pub position_map_count: BigEndian<u16>,
186 pub axis_value_maps: &'a [AxisValueMap],
188}
189
190impl<'a> SegmentMaps<'a> {
191 pub fn position_map_count(&self) -> u16 {
193 self.position_map_count.get()
194 }
195
196 pub fn axis_value_maps(&self) -> &'a [AxisValueMap] {
198 self.axis_value_maps
199 }
200}
201
202#[cfg(feature = "experimental_traverse")]
203impl<'a> SomeRecord<'a> for SegmentMaps<'a> {
204 fn traverse(self, data: FontData<'a>) -> RecordResolver<'a> {
205 RecordResolver {
206 name: "SegmentMaps",
207 get_field: Box::new(move |idx, _data| match idx {
208 0usize => Some(Field::new("position_map_count", self.position_map_count())),
209 1usize => Some(Field::new(
210 "axis_value_maps",
211 traversal::FieldType::array_of_records(
212 stringify!(AxisValueMap),
213 self.axis_value_maps(),
214 _data,
215 ),
216 )),
217 _ => None,
218 }),
219 data,
220 }
221 }
222}
223
224#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, bytemuck :: AnyBitPattern)]
226#[repr(C)]
227#[repr(packed)]
228pub struct AxisValueMap {
229 pub from_coordinate: BigEndian<F2Dot14>,
231 pub to_coordinate: BigEndian<F2Dot14>,
233}
234
235impl AxisValueMap {
236 pub fn from_coordinate(&self) -> F2Dot14 {
238 self.from_coordinate.get()
239 }
240
241 pub fn to_coordinate(&self) -> F2Dot14 {
243 self.to_coordinate.get()
244 }
245}
246
247impl FixedSize for AxisValueMap {
248 const RAW_BYTE_LEN: usize = F2Dot14::RAW_BYTE_LEN + F2Dot14::RAW_BYTE_LEN;
249}
250
251#[cfg(feature = "experimental_traverse")]
252impl<'a> SomeRecord<'a> for AxisValueMap {
253 fn traverse(self, data: FontData<'a>) -> RecordResolver<'a> {
254 RecordResolver {
255 name: "AxisValueMap",
256 get_field: Box::new(move |idx, _data| match idx {
257 0usize => Some(Field::new("from_coordinate", self.from_coordinate())),
258 1usize => Some(Field::new("to_coordinate", self.to_coordinate())),
259 _ => None,
260 }),
261 data,
262 }
263 }
264}