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 [HVAR (Horizontal Metrics Variations)](https://docs.microsoft.com/en-us/typography/opentype/spec/hvar) table
9 #[derive(Debug, Clone, Copy)]
10 #[doc(hidden)]
11 pub struct HvarMarker {}
12 
13 impl HvarMarker {
version_byte_range(&self) -> Range<usize>14     fn version_byte_range(&self) -> Range<usize> {
15         let start = 0;
16         start..start + MajorMinor::RAW_BYTE_LEN
17     }
item_variation_store_offset_byte_range(&self) -> Range<usize>18     fn item_variation_store_offset_byte_range(&self) -> Range<usize> {
19         let start = self.version_byte_range().end;
20         start..start + Offset32::RAW_BYTE_LEN
21     }
advance_width_mapping_offset_byte_range(&self) -> Range<usize>22     fn advance_width_mapping_offset_byte_range(&self) -> Range<usize> {
23         let start = self.item_variation_store_offset_byte_range().end;
24         start..start + Offset32::RAW_BYTE_LEN
25     }
lsb_mapping_offset_byte_range(&self) -> Range<usize>26     fn lsb_mapping_offset_byte_range(&self) -> Range<usize> {
27         let start = self.advance_width_mapping_offset_byte_range().end;
28         start..start + Offset32::RAW_BYTE_LEN
29     }
rsb_mapping_offset_byte_range(&self) -> Range<usize>30     fn rsb_mapping_offset_byte_range(&self) -> Range<usize> {
31         let start = self.lsb_mapping_offset_byte_range().end;
32         start..start + Offset32::RAW_BYTE_LEN
33     }
34 }
35 
36 impl TopLevelTable for Hvar<'_> {
37     /// `HVAR`
38     const TAG: Tag = Tag::new(b"HVAR");
39 }
40 
41 impl<'a> FontRead<'a> for Hvar<'a> {
read(data: FontData<'a>) -> Result<Self, ReadError>42     fn read(data: FontData<'a>) -> Result<Self, ReadError> {
43         let mut cursor = data.cursor();
44         cursor.advance::<MajorMinor>();
45         cursor.advance::<Offset32>();
46         cursor.advance::<Offset32>();
47         cursor.advance::<Offset32>();
48         cursor.advance::<Offset32>();
49         cursor.finish(HvarMarker {})
50     }
51 }
52 
53 /// The [HVAR (Horizontal Metrics Variations)](https://docs.microsoft.com/en-us/typography/opentype/spec/hvar) table
54 pub type Hvar<'a> = TableRef<'a, HvarMarker>;
55 
56 impl<'a> Hvar<'a> {
57     /// Major version number of the horizontal metrics variations table — set to 1.
58     /// Minor version number of the horizontal metrics variations table — set to 0.
version(&self) -> MajorMinor59     pub fn version(&self) -> MajorMinor {
60         let range = self.shape.version_byte_range();
61         self.data.read_at(range.start).unwrap()
62     }
63 
64     /// Offset in bytes from the start of this table to the item variation store table.
item_variation_store_offset(&self) -> Offset3265     pub fn item_variation_store_offset(&self) -> Offset32 {
66         let range = self.shape.item_variation_store_offset_byte_range();
67         self.data.read_at(range.start).unwrap()
68     }
69 
70     /// Attempt to resolve [`item_variation_store_offset`][Self::item_variation_store_offset].
item_variation_store(&self) -> Result<ItemVariationStore<'a>, ReadError>71     pub fn item_variation_store(&self) -> Result<ItemVariationStore<'a>, ReadError> {
72         let data = self.data;
73         self.item_variation_store_offset().resolve(data)
74     }
75 
76     /// Offset in bytes from the start of this table to the delta-set index mapping for advance widths (may be NULL).
advance_width_mapping_offset(&self) -> Nullable<Offset32>77     pub fn advance_width_mapping_offset(&self) -> Nullable<Offset32> {
78         let range = self.shape.advance_width_mapping_offset_byte_range();
79         self.data.read_at(range.start).unwrap()
80     }
81 
82     /// Attempt to resolve [`advance_width_mapping_offset`][Self::advance_width_mapping_offset].
advance_width_mapping(&self) -> Option<Result<DeltaSetIndexMap<'a>, ReadError>>83     pub fn advance_width_mapping(&self) -> Option<Result<DeltaSetIndexMap<'a>, ReadError>> {
84         let data = self.data;
85         self.advance_width_mapping_offset().resolve(data)
86     }
87 
88     /// Offset in bytes from the start of this table to the delta-set index mapping for left side bearings (may be NULL).
lsb_mapping_offset(&self) -> Nullable<Offset32>89     pub fn lsb_mapping_offset(&self) -> Nullable<Offset32> {
90         let range = self.shape.lsb_mapping_offset_byte_range();
91         self.data.read_at(range.start).unwrap()
92     }
93 
94     /// Attempt to resolve [`lsb_mapping_offset`][Self::lsb_mapping_offset].
lsb_mapping(&self) -> Option<Result<DeltaSetIndexMap<'a>, ReadError>>95     pub fn lsb_mapping(&self) -> Option<Result<DeltaSetIndexMap<'a>, ReadError>> {
96         let data = self.data;
97         self.lsb_mapping_offset().resolve(data)
98     }
99 
100     /// Offset in bytes from the start of this table to the delta-set index mapping for right side bearings (may be NULL).
rsb_mapping_offset(&self) -> Nullable<Offset32>101     pub fn rsb_mapping_offset(&self) -> Nullable<Offset32> {
102         let range = self.shape.rsb_mapping_offset_byte_range();
103         self.data.read_at(range.start).unwrap()
104     }
105 
106     /// Attempt to resolve [`rsb_mapping_offset`][Self::rsb_mapping_offset].
rsb_mapping(&self) -> Option<Result<DeltaSetIndexMap<'a>, ReadError>>107     pub fn rsb_mapping(&self) -> Option<Result<DeltaSetIndexMap<'a>, ReadError>> {
108         let data = self.data;
109         self.rsb_mapping_offset().resolve(data)
110     }
111 }
112 
113 #[cfg(feature = "traversal")]
114 impl<'a> SomeTable<'a> for Hvar<'a> {
type_name(&self) -> &str115     fn type_name(&self) -> &str {
116         "Hvar"
117     }
get_field(&self, idx: usize) -> Option<Field<'a>>118     fn get_field(&self, idx: usize) -> Option<Field<'a>> {
119         match idx {
120             0usize => Some(Field::new("version", self.version())),
121             1usize => Some(Field::new(
122                 "item_variation_store_offset",
123                 FieldType::offset(
124                     self.item_variation_store_offset(),
125                     self.item_variation_store(),
126                 ),
127             )),
128             2usize => Some(Field::new(
129                 "advance_width_mapping_offset",
130                 FieldType::offset(
131                     self.advance_width_mapping_offset(),
132                     self.advance_width_mapping(),
133                 ),
134             )),
135             3usize => Some(Field::new(
136                 "lsb_mapping_offset",
137                 FieldType::offset(self.lsb_mapping_offset(), self.lsb_mapping()),
138             )),
139             4usize => Some(Field::new(
140                 "rsb_mapping_offset",
141                 FieldType::offset(self.rsb_mapping_offset(), self.rsb_mapping()),
142             )),
143             _ => None,
144         }
145     }
146 }
147 
148 #[cfg(feature = "traversal")]
149 impl<'a> std::fmt::Debug for Hvar<'a> {
fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result150     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
151         (self as &dyn SomeTable<'a>).fmt(f)
152     }
153 }
154