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