1 // THIS FILE IS AUTOGENERATED.
2 // Any changes to this file will be overwritten.
3 // For more information about how codegen works, see font-codegen/README.md
4 
5 #[allow(unused_imports)]
6 use crate::codegen_prelude::*;
7 
8 /// The [MVAR (Metrics Variations)](https://docs.microsoft.com/en-us/typography/opentype/spec/mvar) table
9 #[derive(Debug, Clone, Copy)]
10 #[doc(hidden)]
11 pub struct MvarMarker {
12     value_records_byte_len: usize,
13 }
14 
15 impl MvarMarker {
version_byte_range(&self) -> Range<usize>16     fn version_byte_range(&self) -> Range<usize> {
17         let start = 0;
18         start..start + MajorMinor::RAW_BYTE_LEN
19     }
_reserved_byte_range(&self) -> Range<usize>20     fn _reserved_byte_range(&self) -> Range<usize> {
21         let start = self.version_byte_range().end;
22         start..start + u16::RAW_BYTE_LEN
23     }
value_record_size_byte_range(&self) -> Range<usize>24     fn value_record_size_byte_range(&self) -> Range<usize> {
25         let start = self._reserved_byte_range().end;
26         start..start + u16::RAW_BYTE_LEN
27     }
value_record_count_byte_range(&self) -> Range<usize>28     fn value_record_count_byte_range(&self) -> Range<usize> {
29         let start = self.value_record_size_byte_range().end;
30         start..start + u16::RAW_BYTE_LEN
31     }
item_variation_store_offset_byte_range(&self) -> Range<usize>32     fn item_variation_store_offset_byte_range(&self) -> Range<usize> {
33         let start = self.value_record_count_byte_range().end;
34         start..start + Offset16::RAW_BYTE_LEN
35     }
value_records_byte_range(&self) -> Range<usize>36     fn value_records_byte_range(&self) -> Range<usize> {
37         let start = self.item_variation_store_offset_byte_range().end;
38         start..start + self.value_records_byte_len
39     }
40 }
41 
42 impl TopLevelTable for Mvar<'_> {
43     /// `MVAR`
44     const TAG: Tag = Tag::new(b"MVAR");
45 }
46 
47 impl<'a> FontRead<'a> for Mvar<'a> {
read(data: FontData<'a>) -> Result<Self, ReadError>48     fn read(data: FontData<'a>) -> Result<Self, ReadError> {
49         let mut cursor = data.cursor();
50         cursor.advance::<MajorMinor>();
51         cursor.advance::<u16>();
52         cursor.advance::<u16>();
53         let value_record_count: u16 = cursor.read()?;
54         cursor.advance::<Offset16>();
55         let value_records_byte_len = value_record_count as usize * ValueRecord::RAW_BYTE_LEN;
56         cursor.advance_by(value_records_byte_len);
57         cursor.finish(MvarMarker {
58             value_records_byte_len,
59         })
60     }
61 }
62 
63 /// The [MVAR (Metrics Variations)](https://docs.microsoft.com/en-us/typography/opentype/spec/mvar) table
64 pub type Mvar<'a> = TableRef<'a, MvarMarker>;
65 
66 impl<'a> Mvar<'a> {
67     /// Major version number of the horizontal metrics variations table — set to 1.
68     /// Minor version number of the horizontal metrics variations table — set to 0.
version(&self) -> MajorMinor69     pub fn version(&self) -> MajorMinor {
70         let range = self.shape.version_byte_range();
71         self.data.read_at(range.start).unwrap()
72     }
73 
74     /// The size in bytes of each value record — must be greater than zero.
value_record_size(&self) -> u1675     pub fn value_record_size(&self) -> u16 {
76         let range = self.shape.value_record_size_byte_range();
77         self.data.read_at(range.start).unwrap()
78     }
79 
80     /// The number of value records — may be zero.
value_record_count(&self) -> u1681     pub fn value_record_count(&self) -> u16 {
82         let range = self.shape.value_record_count_byte_range();
83         self.data.read_at(range.start).unwrap()
84     }
85 
86     /// Offset in bytes from the start of this table to the item variation store table. If valueRecordCount is zero, set to zero; if valueRecordCount is greater than zero, must be greater than zero.
item_variation_store_offset(&self) -> Nullable<Offset16>87     pub fn item_variation_store_offset(&self) -> Nullable<Offset16> {
88         let range = self.shape.item_variation_store_offset_byte_range();
89         self.data.read_at(range.start).unwrap()
90     }
91 
92     /// Attempt to resolve [`item_variation_store_offset`][Self::item_variation_store_offset].
item_variation_store(&self) -> Option<Result<ItemVariationStore<'a>, ReadError>>93     pub fn item_variation_store(&self) -> Option<Result<ItemVariationStore<'a>, ReadError>> {
94         let data = self.data;
95         self.item_variation_store_offset().resolve(data)
96     }
97 
98     /// Array of value records that identify target items and the associated delta-set index for each. The valueTag records must be in binary order of their valueTag field.
value_records(&self) -> &'a [ValueRecord]99     pub fn value_records(&self) -> &'a [ValueRecord] {
100         let range = self.shape.value_records_byte_range();
101         self.data.read_array(range).unwrap()
102     }
103 }
104 
105 #[cfg(feature = "traversal")]
106 impl<'a> SomeTable<'a> for Mvar<'a> {
type_name(&self) -> &str107     fn type_name(&self) -> &str {
108         "Mvar"
109     }
get_field(&self, idx: usize) -> Option<Field<'a>>110     fn get_field(&self, idx: usize) -> Option<Field<'a>> {
111         match idx {
112             0usize => Some(Field::new("version", self.version())),
113             1usize => Some(Field::new("value_record_size", self.value_record_size())),
114             2usize => Some(Field::new("value_record_count", self.value_record_count())),
115             3usize => Some(Field::new(
116                 "item_variation_store_offset",
117                 FieldType::offset(
118                     self.item_variation_store_offset(),
119                     self.item_variation_store(),
120                 ),
121             )),
122             4usize => Some(Field::new(
123                 "value_records",
124                 traversal::FieldType::array_of_records(
125                     stringify!(ValueRecord),
126                     self.value_records(),
127                     self.offset_data(),
128                 ),
129             )),
130             _ => None,
131         }
132     }
133 }
134 
135 #[cfg(feature = "traversal")]
136 impl<'a> std::fmt::Debug for Mvar<'a> {
fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result137     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
138         (self as &dyn SomeTable<'a>).fmt(f)
139     }
140 }
141 
142 /// [ValueRecord](https://learn.microsoft.com/en-us/typography/opentype/spec/mvar#table-formats) metrics variation record
143 #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
144 #[repr(C)]
145 #[repr(packed)]
146 pub struct ValueRecord {
147     /// Four-byte tag identifying a font-wide measure.
148     pub value_tag: BigEndian<Tag>,
149     /// A delta-set outer index — used to select an item variation data subtable within the item variation store.
150     pub delta_set_outer_index: BigEndian<u16>,
151     /// A delta-set inner index — used to select a delta-set row within an item variation data subtable.
152     pub delta_set_inner_index: BigEndian<u16>,
153 }
154 
155 impl ValueRecord {
156     /// Four-byte tag identifying a font-wide measure.
value_tag(&self) -> Tag157     pub fn value_tag(&self) -> Tag {
158         self.value_tag.get()
159     }
160 
161     /// A delta-set outer index — used to select an item variation data subtable within the item variation store.
delta_set_outer_index(&self) -> u16162     pub fn delta_set_outer_index(&self) -> u16 {
163         self.delta_set_outer_index.get()
164     }
165 
166     /// A delta-set inner index — used to select a delta-set row within an item variation data subtable.
delta_set_inner_index(&self) -> u16167     pub fn delta_set_inner_index(&self) -> u16 {
168         self.delta_set_inner_index.get()
169     }
170 }
171 
172 impl FixedSize for ValueRecord {
173     const RAW_BYTE_LEN: usize = Tag::RAW_BYTE_LEN + u16::RAW_BYTE_LEN + u16::RAW_BYTE_LEN;
174 }
175 
176 impl sealed::Sealed for ValueRecord {}
177 
178 /// SAFETY: see the [`FromBytes`] trait documentation.
179 unsafe impl FromBytes for ValueRecord {
this_trait_should_only_be_implemented_in_generated_code()180     fn this_trait_should_only_be_implemented_in_generated_code() {}
181 }
182 
183 #[cfg(feature = "traversal")]
184 impl<'a> SomeRecord<'a> for ValueRecord {
traverse(self, data: FontData<'a>) -> RecordResolver<'a>185     fn traverse(self, data: FontData<'a>) -> RecordResolver<'a> {
186         RecordResolver {
187             name: "ValueRecord",
188             get_field: Box::new(move |idx, _data| match idx {
189                 0usize => Some(Field::new("value_tag", self.value_tag())),
190                 1usize => Some(Field::new(
191                     "delta_set_outer_index",
192                     self.delta_set_outer_index(),
193                 )),
194                 2usize => Some(Field::new(
195                     "delta_set_inner_index",
196                     self.delta_set_inner_index(),
197                 )),
198                 _ => None,
199             }),
200             data,
201         }
202     }
203 }
204