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 /// [hhea](https://docs.microsoft.com/en-us/typography/opentype/spec/hhea) Horizontal Header Table 9 #[derive(Debug, Clone, Copy)] 10 #[doc(hidden)] 11 pub struct HheaMarker {} 12 13 impl HheaMarker { 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 } ascender_byte_range(&self) -> Range<usize>18 fn ascender_byte_range(&self) -> Range<usize> { 19 let start = self.version_byte_range().end; 20 start..start + FWord::RAW_BYTE_LEN 21 } descender_byte_range(&self) -> Range<usize>22 fn descender_byte_range(&self) -> Range<usize> { 23 let start = self.ascender_byte_range().end; 24 start..start + FWord::RAW_BYTE_LEN 25 } line_gap_byte_range(&self) -> Range<usize>26 fn line_gap_byte_range(&self) -> Range<usize> { 27 let start = self.descender_byte_range().end; 28 start..start + FWord::RAW_BYTE_LEN 29 } advance_width_max_byte_range(&self) -> Range<usize>30 fn advance_width_max_byte_range(&self) -> Range<usize> { 31 let start = self.line_gap_byte_range().end; 32 start..start + UfWord::RAW_BYTE_LEN 33 } min_left_side_bearing_byte_range(&self) -> Range<usize>34 fn min_left_side_bearing_byte_range(&self) -> Range<usize> { 35 let start = self.advance_width_max_byte_range().end; 36 start..start + FWord::RAW_BYTE_LEN 37 } min_right_side_bearing_byte_range(&self) -> Range<usize>38 fn min_right_side_bearing_byte_range(&self) -> Range<usize> { 39 let start = self.min_left_side_bearing_byte_range().end; 40 start..start + FWord::RAW_BYTE_LEN 41 } x_max_extent_byte_range(&self) -> Range<usize>42 fn x_max_extent_byte_range(&self) -> Range<usize> { 43 let start = self.min_right_side_bearing_byte_range().end; 44 start..start + FWord::RAW_BYTE_LEN 45 } caret_slope_rise_byte_range(&self) -> Range<usize>46 fn caret_slope_rise_byte_range(&self) -> Range<usize> { 47 let start = self.x_max_extent_byte_range().end; 48 start..start + i16::RAW_BYTE_LEN 49 } caret_slope_run_byte_range(&self) -> Range<usize>50 fn caret_slope_run_byte_range(&self) -> Range<usize> { 51 let start = self.caret_slope_rise_byte_range().end; 52 start..start + i16::RAW_BYTE_LEN 53 } caret_offset_byte_range(&self) -> Range<usize>54 fn caret_offset_byte_range(&self) -> Range<usize> { 55 let start = self.caret_slope_run_byte_range().end; 56 start..start + i16::RAW_BYTE_LEN 57 } reserved1_byte_range(&self) -> Range<usize>58 fn reserved1_byte_range(&self) -> Range<usize> { 59 let start = self.caret_offset_byte_range().end; 60 start..start + i16::RAW_BYTE_LEN 61 } reserved2_byte_range(&self) -> Range<usize>62 fn reserved2_byte_range(&self) -> Range<usize> { 63 let start = self.reserved1_byte_range().end; 64 start..start + i16::RAW_BYTE_LEN 65 } reserved3_byte_range(&self) -> Range<usize>66 fn reserved3_byte_range(&self) -> Range<usize> { 67 let start = self.reserved2_byte_range().end; 68 start..start + i16::RAW_BYTE_LEN 69 } reserved4_byte_range(&self) -> Range<usize>70 fn reserved4_byte_range(&self) -> Range<usize> { 71 let start = self.reserved3_byte_range().end; 72 start..start + i16::RAW_BYTE_LEN 73 } metric_data_format_byte_range(&self) -> Range<usize>74 fn metric_data_format_byte_range(&self) -> Range<usize> { 75 let start = self.reserved4_byte_range().end; 76 start..start + i16::RAW_BYTE_LEN 77 } number_of_long_metrics_byte_range(&self) -> Range<usize>78 fn number_of_long_metrics_byte_range(&self) -> Range<usize> { 79 let start = self.metric_data_format_byte_range().end; 80 start..start + u16::RAW_BYTE_LEN 81 } 82 } 83 84 impl TopLevelTable for Hhea<'_> { 85 /// `hhea` 86 const TAG: Tag = Tag::new(b"hhea"); 87 } 88 89 impl<'a> FontRead<'a> for Hhea<'a> { read(data: FontData<'a>) -> Result<Self, ReadError>90 fn read(data: FontData<'a>) -> Result<Self, ReadError> { 91 let mut cursor = data.cursor(); 92 cursor.advance::<MajorMinor>(); 93 cursor.advance::<FWord>(); 94 cursor.advance::<FWord>(); 95 cursor.advance::<FWord>(); 96 cursor.advance::<UfWord>(); 97 cursor.advance::<FWord>(); 98 cursor.advance::<FWord>(); 99 cursor.advance::<FWord>(); 100 cursor.advance::<i16>(); 101 cursor.advance::<i16>(); 102 cursor.advance::<i16>(); 103 cursor.advance::<i16>(); 104 cursor.advance::<i16>(); 105 cursor.advance::<i16>(); 106 cursor.advance::<i16>(); 107 cursor.advance::<i16>(); 108 cursor.advance::<u16>(); 109 cursor.finish(HheaMarker {}) 110 } 111 } 112 113 /// [hhea](https://docs.microsoft.com/en-us/typography/opentype/spec/hhea) Horizontal Header Table 114 pub type Hhea<'a> = TableRef<'a, HheaMarker>; 115 116 impl<'a> Hhea<'a> { 117 /// The major/minor version (1, 0) version(&self) -> MajorMinor118 pub fn version(&self) -> MajorMinor { 119 let range = self.shape.version_byte_range(); 120 self.data.read_at(range.start).unwrap() 121 } 122 123 /// Typographic ascent. ascender(&self) -> FWord124 pub fn ascender(&self) -> FWord { 125 let range = self.shape.ascender_byte_range(); 126 self.data.read_at(range.start).unwrap() 127 } 128 129 /// Typographic descent. descender(&self) -> FWord130 pub fn descender(&self) -> FWord { 131 let range = self.shape.descender_byte_range(); 132 self.data.read_at(range.start).unwrap() 133 } 134 135 /// Typographic line gap. Negative LineGap values are treated as 136 /// zero in some legacy platform implementations. line_gap(&self) -> FWord137 pub fn line_gap(&self) -> FWord { 138 let range = self.shape.line_gap_byte_range(); 139 self.data.read_at(range.start).unwrap() 140 } 141 142 /// Maximum advance width value in 'hmtx' table. advance_width_max(&self) -> UfWord143 pub fn advance_width_max(&self) -> UfWord { 144 let range = self.shape.advance_width_max_byte_range(); 145 self.data.read_at(range.start).unwrap() 146 } 147 148 /// Minimum left sidebearing value in 'hmtx' table for glyphs with 149 /// contours (empty glyphs should be ignored). min_left_side_bearing(&self) -> FWord150 pub fn min_left_side_bearing(&self) -> FWord { 151 let range = self.shape.min_left_side_bearing_byte_range(); 152 self.data.read_at(range.start).unwrap() 153 } 154 155 /// Minimum right sidebearing value; calculated as min(aw - (lsb + 156 /// xMax - xMin)) for glyphs with contours (empty glyphs should be ignored). min_right_side_bearing(&self) -> FWord157 pub fn min_right_side_bearing(&self) -> FWord { 158 let range = self.shape.min_right_side_bearing_byte_range(); 159 self.data.read_at(range.start).unwrap() 160 } 161 162 /// Max(lsb + (xMax-xMin)) x_max_extent(&self) -> FWord163 pub fn x_max_extent(&self) -> FWord { 164 let range = self.shape.x_max_extent_byte_range(); 165 self.data.read_at(range.start).unwrap() 166 } 167 168 /// Used to calculate the slope of the cursor (rise/run); 1 for 169 /// vertical caret, 0 for horizontal. caret_slope_rise(&self) -> i16170 pub fn caret_slope_rise(&self) -> i16 { 171 let range = self.shape.caret_slope_rise_byte_range(); 172 self.data.read_at(range.start).unwrap() 173 } 174 175 /// 0 for vertical caret, 1 for horizontal. caret_slope_run(&self) -> i16176 pub fn caret_slope_run(&self) -> i16 { 177 let range = self.shape.caret_slope_run_byte_range(); 178 self.data.read_at(range.start).unwrap() 179 } 180 181 /// The amount by which a slanted highlight on a glyph needs to be 182 /// shifted to produce the best appearance. Set to 0 for 183 /// non-slanted fonts caret_offset(&self) -> i16184 pub fn caret_offset(&self) -> i16 { 185 let range = self.shape.caret_offset_byte_range(); 186 self.data.read_at(range.start).unwrap() 187 } 188 189 /// 0 for current format. metric_data_format(&self) -> i16190 pub fn metric_data_format(&self) -> i16 { 191 let range = self.shape.metric_data_format_byte_range(); 192 self.data.read_at(range.start).unwrap() 193 } 194 195 /// Number of LongMetric entries in 'hmtx'/'vmtx' table number_of_long_metrics(&self) -> u16196 pub fn number_of_long_metrics(&self) -> u16 { 197 let range = self.shape.number_of_long_metrics_byte_range(); 198 self.data.read_at(range.start).unwrap() 199 } 200 } 201 202 #[cfg(feature = "traversal")] 203 impl<'a> SomeTable<'a> for Hhea<'a> { type_name(&self) -> &str204 fn type_name(&self) -> &str { 205 "Hhea" 206 } get_field(&self, idx: usize) -> Option<Field<'a>>207 fn get_field(&self, idx: usize) -> Option<Field<'a>> { 208 match idx { 209 0usize => Some(Field::new("version", self.version())), 210 1usize => Some(Field::new("ascender", self.ascender())), 211 2usize => Some(Field::new("descender", self.descender())), 212 3usize => Some(Field::new("line_gap", self.line_gap())), 213 4usize => Some(Field::new("advance_width_max", self.advance_width_max())), 214 5usize => Some(Field::new( 215 "min_left_side_bearing", 216 self.min_left_side_bearing(), 217 )), 218 6usize => Some(Field::new( 219 "min_right_side_bearing", 220 self.min_right_side_bearing(), 221 )), 222 7usize => Some(Field::new("x_max_extent", self.x_max_extent())), 223 8usize => Some(Field::new("caret_slope_rise", self.caret_slope_rise())), 224 9usize => Some(Field::new("caret_slope_run", self.caret_slope_run())), 225 10usize => Some(Field::new("caret_offset", self.caret_offset())), 226 11usize => Some(Field::new("metric_data_format", self.metric_data_format())), 227 12usize => Some(Field::new( 228 "number_of_long_metrics", 229 self.number_of_long_metrics(), 230 )), 231 _ => None, 232 } 233 } 234 } 235 236 #[cfg(feature = "traversal")] 237 impl<'a> std::fmt::Debug for Hhea<'a> { fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result238 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 239 (self as &dyn SomeTable<'a>).fmt(f) 240 } 241 } 242