Coverage Report

Created: 2026-10-24 07:19

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/read-fonts-0.46.0/generated/generated_vhea.rs
Line
Count
Source
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
impl<'a> MinByteRange<'a> for Vhea<'a> {
9
0
    fn min_byte_range(&self) -> Range<usize> {
10
0
        0..self.number_of_long_ver_metrics_byte_range().end
11
0
    }
12
0
    fn min_table_bytes(&self) -> &'a [u8] {
13
0
        let range = self.min_byte_range();
14
0
        self.offset_data().as_bytes().get(range).unwrap_or_default()
15
0
    }
16
}
17
18
impl TopLevelTable for Vhea<'_> {
19
    /// `vhea`
20
    const TAG: Tag = Tag::new(b"vhea");
21
}
22
23
impl ReadArgs for Vhea<'_> {
24
    type Args = ();
25
}
26
27
impl<'a> FontRead<'a> for Vhea<'a> {
28
186
    fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
29
        #[allow(clippy::absurd_extreme_comparisons)]
30
186
        if data.len() < Self::MIN_SIZE {
31
6
            return Err(ReadError::OutOfBounds);
32
180
        }
33
180
        let Some(data) = TableDataRef::new(data.as_bytes()) else {
34
0
            return Err(ReadError::OutOfBounds);
35
        };
36
180
        Ok(Self { data })
37
186
    }
38
}
39
40
/// The fields at the start of the table, which are read directly.
41
#[derive(Clone, Copy, bytemuck :: AnyBitPattern)]
42
#[repr(C, packed)]
43
#[doc(hidden)]
44
pub struct VheaFixedHeader {
45
    pub version: BigEndian<Version16Dot16>,
46
    pub ascender: BigEndian<FWord>,
47
    pub descender: BigEndian<FWord>,
48
    pub line_gap: BigEndian<FWord>,
49
    pub advance_height_max: BigEndian<UfWord>,
50
    pub min_top_side_bearing: BigEndian<FWord>,
51
    pub min_bottom_side_bearing: BigEndian<FWord>,
52
    pub y_max_extent: BigEndian<FWord>,
53
    pub caret_slope_rise: BigEndian<i16>,
54
    pub caret_slope_run: BigEndian<i16>,
55
    pub caret_offset: BigEndian<i16>,
56
    pub reserved1: BigEndian<i16>,
57
    pub reserved2: BigEndian<i16>,
58
    pub reserved3: BigEndian<i16>,
59
    pub reserved4: BigEndian<i16>,
60
    pub metric_data_format: BigEndian<i16>,
61
    pub number_of_long_ver_metrics: BigEndian<u16>,
62
}
63
64
#[allow(clippy::absurd_extreme_comparisons)]
65
const _: () = assert!(std::mem::size_of::<VheaFixedHeader>() <= Vhea::MIN_SIZE);
66
67
/// The [vhea](https://docs.microsoft.com/en-us/typography/opentype/spec/vhea) Vertical Header Table
68
#[derive(Clone)]
69
pub struct Vhea<'a> {
70
    data: TableDataRef<'a, VheaFixedHeader>,
71
}
72
73
#[allow(clippy::needless_lifetimes)]
74
impl<'a> Vhea<'a> {
75
    pub const MIN_SIZE: usize = (Version16Dot16::RAW_BYTE_LEN
76
        + FWord::RAW_BYTE_LEN
77
        + FWord::RAW_BYTE_LEN
78
        + FWord::RAW_BYTE_LEN
79
        + UfWord::RAW_BYTE_LEN
80
        + FWord::RAW_BYTE_LEN
81
        + FWord::RAW_BYTE_LEN
82
        + FWord::RAW_BYTE_LEN
83
        + i16::RAW_BYTE_LEN
84
        + i16::RAW_BYTE_LEN
85
        + i16::RAW_BYTE_LEN
86
        + i16::RAW_BYTE_LEN
87
        + i16::RAW_BYTE_LEN
88
        + i16::RAW_BYTE_LEN
89
        + i16::RAW_BYTE_LEN
90
        + i16::RAW_BYTE_LEN
91
        + u16::RAW_BYTE_LEN);
92
    basic_table_impls!(impl_the_methods);
93
94
    /// The major/minor version (1, 0 or 1, 1)
95
0
    pub fn version(&self) -> Version16Dot16 {
96
0
        self.data.header().version.get()
97
0
    }
98
99
    /// Typographic ascent.
100
151
    pub fn ascender(&self) -> FWord {
101
151
        self.data.header().ascender.get()
102
151
    }
103
104
    /// Typographic descent.
105
151
    pub fn descender(&self) -> FWord {
106
151
        self.data.header().descender.get()
107
151
    }
108
109
    /// Typographic line gap. Negative LineGap values are treated as
110
    /// zero in some legacy platform implementations.
111
151
    pub fn line_gap(&self) -> FWord {
112
151
        self.data.header().line_gap.get()
113
151
    }
114
115
    /// Maximum advance height value in 'vmtx' table.
116
151
    pub fn advance_height_max(&self) -> UfWord {
117
151
        self.data.header().advance_height_max.get()
118
151
    }
119
120
    /// Minimum top sidebearing value in 'vmtx' table for glyphs with
121
    /// contours (empty glyphs should be ignored).
122
0
    pub fn min_top_side_bearing(&self) -> FWord {
123
0
        self.data.header().min_top_side_bearing.get()
124
0
    }
125
126
    /// Minimum bottom sidebearing value
127
0
    pub fn min_bottom_side_bearing(&self) -> FWord {
128
0
        self.data.header().min_bottom_side_bearing.get()
129
0
    }
130
131
    /// Defined as max( tsb + (yMax-yMin)).
132
0
    pub fn y_max_extent(&self) -> FWord {
133
0
        self.data.header().y_max_extent.get()
134
0
    }
135
136
    /// Used to calculate the slope of the cursor (rise/run); 1 for
137
    /// vertical caret, 0 for horizontal.
138
0
    pub fn caret_slope_rise(&self) -> i16 {
139
0
        self.data.header().caret_slope_rise.get()
140
0
    }
141
142
    /// 0 for vertical caret, 1 for horizontal.
143
0
    pub fn caret_slope_run(&self) -> i16 {
144
0
        self.data.header().caret_slope_run.get()
145
0
    }
146
147
    /// The amount by which a slanted highlight on a glyph needs to be
148
    /// shifted to produce the best appearance. Set to 0 for
149
    /// non-slanted fonts
150
0
    pub fn caret_offset(&self) -> i16 {
151
0
        self.data.header().caret_offset.get()
152
0
    }
153
154
    /// 0 for current format.
155
0
    pub fn metric_data_format(&self) -> i16 {
156
0
        self.data.header().metric_data_format.get()
157
0
    }
158
159
    /// Number of advance heights in the vertical metrics (`vmtx`) table.
160
29
    pub fn number_of_long_ver_metrics(&self) -> u16 {
161
29
        self.data.header().number_of_long_ver_metrics.get()
162
29
    }
163
164
0
    pub fn version_byte_range(&self) -> Range<usize> {
165
0
        let start = 0;
166
0
        let end = start + Version16Dot16::RAW_BYTE_LEN;
167
0
        start..end
168
0
    }
169
170
0
    pub fn ascender_byte_range(&self) -> Range<usize> {
171
0
        let start = self.version_byte_range().end;
172
0
        let end = start + FWord::RAW_BYTE_LEN;
173
0
        start..end
174
0
    }
175
176
0
    pub fn descender_byte_range(&self) -> Range<usize> {
177
0
        let start = self.ascender_byte_range().end;
178
0
        let end = start + FWord::RAW_BYTE_LEN;
179
0
        start..end
180
0
    }
181
182
0
    pub fn line_gap_byte_range(&self) -> Range<usize> {
183
0
        let start = self.descender_byte_range().end;
184
0
        let end = start + FWord::RAW_BYTE_LEN;
185
0
        start..end
186
0
    }
187
188
0
    pub fn advance_height_max_byte_range(&self) -> Range<usize> {
189
0
        let start = self.line_gap_byte_range().end;
190
0
        let end = start + UfWord::RAW_BYTE_LEN;
191
0
        start..end
192
0
    }
193
194
0
    pub fn min_top_side_bearing_byte_range(&self) -> Range<usize> {
195
0
        let start = self.advance_height_max_byte_range().end;
196
0
        let end = start + FWord::RAW_BYTE_LEN;
197
0
        start..end
198
0
    }
199
200
0
    pub fn min_bottom_side_bearing_byte_range(&self) -> Range<usize> {
201
0
        let start = self.min_top_side_bearing_byte_range().end;
202
0
        let end = start + FWord::RAW_BYTE_LEN;
203
0
        start..end
204
0
    }
205
206
0
    pub fn y_max_extent_byte_range(&self) -> Range<usize> {
207
0
        let start = self.min_bottom_side_bearing_byte_range().end;
208
0
        let end = start + FWord::RAW_BYTE_LEN;
209
0
        start..end
210
0
    }
211
212
0
    pub fn caret_slope_rise_byte_range(&self) -> Range<usize> {
213
0
        let start = self.y_max_extent_byte_range().end;
214
0
        let end = start + i16::RAW_BYTE_LEN;
215
0
        start..end
216
0
    }
217
218
0
    pub fn caret_slope_run_byte_range(&self) -> Range<usize> {
219
0
        let start = self.caret_slope_rise_byte_range().end;
220
0
        let end = start + i16::RAW_BYTE_LEN;
221
0
        start..end
222
0
    }
223
224
0
    pub fn caret_offset_byte_range(&self) -> Range<usize> {
225
0
        let start = self.caret_slope_run_byte_range().end;
226
0
        let end = start + i16::RAW_BYTE_LEN;
227
0
        start..end
228
0
    }
229
230
0
    pub fn reserved1_byte_range(&self) -> Range<usize> {
231
0
        let start = self.caret_offset_byte_range().end;
232
0
        let end = start + i16::RAW_BYTE_LEN;
233
0
        start..end
234
0
    }
235
236
0
    pub fn reserved2_byte_range(&self) -> Range<usize> {
237
0
        let start = self.reserved1_byte_range().end;
238
0
        let end = start + i16::RAW_BYTE_LEN;
239
0
        start..end
240
0
    }
241
242
0
    pub fn reserved3_byte_range(&self) -> Range<usize> {
243
0
        let start = self.reserved2_byte_range().end;
244
0
        let end = start + i16::RAW_BYTE_LEN;
245
0
        start..end
246
0
    }
247
248
0
    pub fn reserved4_byte_range(&self) -> Range<usize> {
249
0
        let start = self.reserved3_byte_range().end;
250
0
        let end = start + i16::RAW_BYTE_LEN;
251
0
        start..end
252
0
    }
253
254
0
    pub fn metric_data_format_byte_range(&self) -> Range<usize> {
255
0
        let start = self.reserved4_byte_range().end;
256
0
        let end = start + i16::RAW_BYTE_LEN;
257
0
        start..end
258
0
    }
259
260
0
    pub fn number_of_long_ver_metrics_byte_range(&self) -> Range<usize> {
261
0
        let start = self.metric_data_format_byte_range().end;
262
0
        let end = start + u16::RAW_BYTE_LEN;
263
0
        start..end
264
0
    }
265
}
266
267
const _: () = assert!(FontData::default_data_long_enough(Vhea::MIN_SIZE));
268
269
impl Default for Vhea<'_> {
270
0
    fn default() -> Self {
271
        Self {
272
0
            data: TableDataRef::new(FontData::default_table_data().as_bytes())
273
0
                .unwrap_or_else(|| unreachable!("the default data covers MIN_SIZE")),
274
        }
275
0
    }
276
}
277
278
impl<'a> MinByteRange<'a> for VheaExtended<'a> {
279
0
    fn min_byte_range(&self) -> Range<usize> {
280
0
        0..self.number_of_long_ver_metrics_byte_range().end
281
0
    }
282
0
    fn min_table_bytes(&self) -> &'a [u8] {
283
0
        let range = self.min_byte_range();
284
0
        self.offset_data().as_bytes().get(range).unwrap_or_default()
285
0
    }
286
}
287
288
impl TopLevelTable for VheaExtended<'_> {
289
    /// `VHEA`
290
    const TAG: Tag = Tag::new(b"VHEA");
291
}
292
293
impl ReadArgs for VheaExtended<'_> {
294
    type Args = ();
295
}
296
297
impl<'a> FontRead<'a> for VheaExtended<'a> {
298
7
    fn read_with_args(data: FontData<'a>, _: ()) -> Result<Self, ReadError> {
299
        #[allow(clippy::absurd_extreme_comparisons)]
300
7
        if data.len() < Self::MIN_SIZE {
301
2
            return Err(ReadError::OutOfBounds);
302
5
        }
303
5
        let Some(data) = TableDataRef::new(data.as_bytes()) else {
304
0
            return Err(ReadError::OutOfBounds);
305
        };
306
5
        Ok(Self { data })
307
7
    }
308
}
309
310
/// The fields at the start of the table, which are read directly.
311
#[derive(Clone, Copy, bytemuck :: AnyBitPattern)]
312
#[repr(C, packed)]
313
#[doc(hidden)]
314
pub struct VheaExtendedFixedHeader {
315
    pub version: BigEndian<Version16Dot16>,
316
    pub ascender: BigEndian<FWord>,
317
    pub descender: BigEndian<FWord>,
318
    pub line_gap: BigEndian<FWord>,
319
    pub advance_height_max: BigEndian<FWord>,
320
    pub min_top_side_bearing: BigEndian<FWord>,
321
    pub min_bottom_side_bearing: BigEndian<FWord>,
322
    pub y_max_extent: BigEndian<FWord>,
323
    pub caret_slope_rise: BigEndian<i16>,
324
    pub caret_slope_run: BigEndian<i16>,
325
    pub caret_offset: BigEndian<i16>,
326
    pub reserved1: BigEndian<i16>,
327
    pub reserved2: BigEndian<i16>,
328
    pub reserved3: BigEndian<i16>,
329
    pub reserved4: BigEndian<i16>,
330
    pub metric_data_format: BigEndian<i16>,
331
    pub number_of_long_ver_metrics: BigEndian<u32>,
332
}
333
334
#[allow(clippy::absurd_extreme_comparisons)]
335
const _: () = assert!(std::mem::size_of::<VheaExtendedFixedHeader>() <= VheaExtended::MIN_SIZE);
336
337
/// VHEA header table (ISO/IEC 14496-22:2026, 5.6.13).
338
#[derive(Clone)]
339
pub struct VheaExtended<'a> {
340
    data: TableDataRef<'a, VheaExtendedFixedHeader>,
341
}
342
343
#[allow(clippy::needless_lifetimes)]
344
impl<'a> VheaExtended<'a> {
345
    pub const MIN_SIZE: usize = (Version16Dot16::RAW_BYTE_LEN
346
        + FWord::RAW_BYTE_LEN
347
        + FWord::RAW_BYTE_LEN
348
        + FWord::RAW_BYTE_LEN
349
        + FWord::RAW_BYTE_LEN
350
        + FWord::RAW_BYTE_LEN
351
        + FWord::RAW_BYTE_LEN
352
        + FWord::RAW_BYTE_LEN
353
        + i16::RAW_BYTE_LEN
354
        + i16::RAW_BYTE_LEN
355
        + i16::RAW_BYTE_LEN
356
        + i16::RAW_BYTE_LEN
357
        + i16::RAW_BYTE_LEN
358
        + i16::RAW_BYTE_LEN
359
        + i16::RAW_BYTE_LEN
360
        + i16::RAW_BYTE_LEN
361
        + u32::RAW_BYTE_LEN);
362
    basic_table_impls!(impl_the_methods);
363
364
0
    pub fn version(&self) -> Version16Dot16 {
365
0
        self.data.header().version.get()
366
0
    }
367
368
5
    pub fn ascender(&self) -> FWord {
369
5
        self.data.header().ascender.get()
370
5
    }
371
372
5
    pub fn descender(&self) -> FWord {
373
5
        self.data.header().descender.get()
374
5
    }
375
376
5
    pub fn line_gap(&self) -> FWord {
377
5
        self.data.header().line_gap.get()
378
5
    }
379
380
5
    pub fn advance_height_max(&self) -> FWord {
381
5
        self.data.header().advance_height_max.get()
382
5
    }
383
384
0
    pub fn min_top_side_bearing(&self) -> FWord {
385
0
        self.data.header().min_top_side_bearing.get()
386
0
    }
387
388
0
    pub fn min_bottom_side_bearing(&self) -> FWord {
389
0
        self.data.header().min_bottom_side_bearing.get()
390
0
    }
391
392
0
    pub fn y_max_extent(&self) -> FWord {
393
0
        self.data.header().y_max_extent.get()
394
0
    }
395
396
0
    pub fn caret_slope_rise(&self) -> i16 {
397
0
        self.data.header().caret_slope_rise.get()
398
0
    }
399
400
0
    pub fn caret_slope_run(&self) -> i16 {
401
0
        self.data.header().caret_slope_run.get()
402
0
    }
403
404
0
    pub fn caret_offset(&self) -> i16 {
405
0
        self.data.header().caret_offset.get()
406
0
    }
407
408
0
    pub fn metric_data_format(&self) -> i16 {
409
0
        self.data.header().metric_data_format.get()
410
0
    }
411
412
    /// Number of long metric records in VMTX.
413
0
    pub fn number_of_long_ver_metrics(&self) -> u32 {
414
0
        self.data.header().number_of_long_ver_metrics.get()
415
0
    }
416
417
0
    pub fn version_byte_range(&self) -> Range<usize> {
418
0
        let start = 0;
419
0
        let end = start + Version16Dot16::RAW_BYTE_LEN;
420
0
        start..end
421
0
    }
422
423
0
    pub fn ascender_byte_range(&self) -> Range<usize> {
424
0
        let start = self.version_byte_range().end;
425
0
        let end = start + FWord::RAW_BYTE_LEN;
426
0
        start..end
427
0
    }
428
429
0
    pub fn descender_byte_range(&self) -> Range<usize> {
430
0
        let start = self.ascender_byte_range().end;
431
0
        let end = start + FWord::RAW_BYTE_LEN;
432
0
        start..end
433
0
    }
434
435
0
    pub fn line_gap_byte_range(&self) -> Range<usize> {
436
0
        let start = self.descender_byte_range().end;
437
0
        let end = start + FWord::RAW_BYTE_LEN;
438
0
        start..end
439
0
    }
440
441
0
    pub fn advance_height_max_byte_range(&self) -> Range<usize> {
442
0
        let start = self.line_gap_byte_range().end;
443
0
        let end = start + FWord::RAW_BYTE_LEN;
444
0
        start..end
445
0
    }
446
447
0
    pub fn min_top_side_bearing_byte_range(&self) -> Range<usize> {
448
0
        let start = self.advance_height_max_byte_range().end;
449
0
        let end = start + FWord::RAW_BYTE_LEN;
450
0
        start..end
451
0
    }
452
453
0
    pub fn min_bottom_side_bearing_byte_range(&self) -> Range<usize> {
454
0
        let start = self.min_top_side_bearing_byte_range().end;
455
0
        let end = start + FWord::RAW_BYTE_LEN;
456
0
        start..end
457
0
    }
458
459
0
    pub fn y_max_extent_byte_range(&self) -> Range<usize> {
460
0
        let start = self.min_bottom_side_bearing_byte_range().end;
461
0
        let end = start + FWord::RAW_BYTE_LEN;
462
0
        start..end
463
0
    }
464
465
0
    pub fn caret_slope_rise_byte_range(&self) -> Range<usize> {
466
0
        let start = self.y_max_extent_byte_range().end;
467
0
        let end = start + i16::RAW_BYTE_LEN;
468
0
        start..end
469
0
    }
470
471
0
    pub fn caret_slope_run_byte_range(&self) -> Range<usize> {
472
0
        let start = self.caret_slope_rise_byte_range().end;
473
0
        let end = start + i16::RAW_BYTE_LEN;
474
0
        start..end
475
0
    }
476
477
0
    pub fn caret_offset_byte_range(&self) -> Range<usize> {
478
0
        let start = self.caret_slope_run_byte_range().end;
479
0
        let end = start + i16::RAW_BYTE_LEN;
480
0
        start..end
481
0
    }
482
483
0
    pub fn reserved1_byte_range(&self) -> Range<usize> {
484
0
        let start = self.caret_offset_byte_range().end;
485
0
        let end = start + i16::RAW_BYTE_LEN;
486
0
        start..end
487
0
    }
488
489
0
    pub fn reserved2_byte_range(&self) -> Range<usize> {
490
0
        let start = self.reserved1_byte_range().end;
491
0
        let end = start + i16::RAW_BYTE_LEN;
492
0
        start..end
493
0
    }
494
495
0
    pub fn reserved3_byte_range(&self) -> Range<usize> {
496
0
        let start = self.reserved2_byte_range().end;
497
0
        let end = start + i16::RAW_BYTE_LEN;
498
0
        start..end
499
0
    }
500
501
0
    pub fn reserved4_byte_range(&self) -> Range<usize> {
502
0
        let start = self.reserved3_byte_range().end;
503
0
        let end = start + i16::RAW_BYTE_LEN;
504
0
        start..end
505
0
    }
506
507
0
    pub fn metric_data_format_byte_range(&self) -> Range<usize> {
508
0
        let start = self.reserved4_byte_range().end;
509
0
        let end = start + i16::RAW_BYTE_LEN;
510
0
        start..end
511
0
    }
512
513
0
    pub fn number_of_long_ver_metrics_byte_range(&self) -> Range<usize> {
514
0
        let start = self.metric_data_format_byte_range().end;
515
0
        let end = start + u32::RAW_BYTE_LEN;
516
0
        start..end
517
0
    }
518
}
519
520
const _: () = assert!(FontData::default_data_long_enough(VheaExtended::MIN_SIZE));
521
522
impl Default for VheaExtended<'_> {
523
0
    fn default() -> Self {
524
        Self {
525
0
            data: TableDataRef::new(FontData::default_table_data().as_bytes())
526
0
                .unwrap_or_else(|| unreachable!("the default data covers MIN_SIZE")),
527
        }
528
0
    }
529
}