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_vmtx.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 Vmtx<'a> {
9
0
    fn min_byte_range(&self) -> Range<usize> {
10
0
        0..self.top_side_bearings_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 Vmtx<'_> {
19
    /// `vmtx`
20
    const TAG: Tag = Tag::new(b"vmtx");
21
}
22
23
impl ReadArgs for Vmtx<'_> {
24
    type Args = u16;
25
}
26
27
impl<'a> FontRead<'a> for Vmtx<'a> {
28
25
    fn read_with_args(data: FontData<'a>, args: u16) -> Result<Self, ReadError> {
29
25
        let number_of_long_ver_metrics = args;
30
31
        #[allow(clippy::absurd_extreme_comparisons)]
32
25
        if data.len() < Self::MIN_SIZE {
33
0
            return Err(ReadError::OutOfBounds);
34
25
        }
35
25
        let Some(data) = TableDataRef::new(data.as_bytes()) else {
36
0
            return Err(ReadError::OutOfBounds);
37
        };
38
25
        Ok(Self {
39
25
            data,
40
25
            number_of_long_ver_metrics,
41
25
        })
42
25
    }
43
}
44
45
impl<'a> Vmtx<'a> {
46
    /// A constructor that requires additional arguments.
47
    ///
48
    /// This type requires some external state in order to be
49
    /// parsed.
50
0
    pub fn read(data: FontData<'a>, number_of_long_ver_metrics: u16) -> Result<Self, ReadError> {
51
0
        let args = number_of_long_ver_metrics;
52
0
        Self::read_with_args(data, args)
53
0
    }
54
}
55
56
/// The fields at the start of the table, which are read directly.
57
#[derive(Clone, Copy, bytemuck :: AnyBitPattern)]
58
#[repr(C, packed)]
59
#[doc(hidden)]
60
pub struct VmtxFixedHeader {}
61
62
#[allow(clippy::absurd_extreme_comparisons)]
63
const _: () = assert!(std::mem::size_of::<VmtxFixedHeader>() <= Vmtx::MIN_SIZE);
64
65
/// The [vmtx (Vertical Metrics)](https://docs.microsoft.com/en-us/typography/opentype/spec/vmtx) table
66
#[derive(Clone)]
67
pub struct Vmtx<'a> {
68
    data: TableDataRef<'a, VmtxFixedHeader>,
69
    number_of_long_ver_metrics: u16,
70
}
71
72
#[allow(clippy::needless_lifetimes)]
73
impl<'a> Vmtx<'a> {
74
    pub const MIN_SIZE: usize = 0;
75
    basic_table_impls!(impl_the_methods);
76
77
    /// Paired advance height and top side bearing values for each
78
    /// glyph. Records are indexed by glyph ID.
79
25
    pub fn v_metrics(&self) -> &'a [LongMetric] {
80
25
        let range = self.v_metrics_byte_range();
81
25
        self.offset_data()
82
25
            .read_array(range)
83
25
            .ok()
84
25
            .unwrap_or_default()
85
25
    }
86
87
    /// Top side bearings for glyph IDs greater than or equal to numberOfLongMetrics.
88
25
    pub fn top_side_bearings(&self) -> &'a [BigEndian<i16>] {
89
25
        let range = self.top_side_bearings_byte_range();
90
25
        self.offset_data()
91
25
            .read_array(range)
92
25
            .ok()
93
25
            .unwrap_or_default()
94
25
    }
95
96
50
    pub(crate) fn number_of_long_ver_metrics(&self) -> u16 {
97
50
        self.number_of_long_ver_metrics
98
50
    }
99
100
50
    pub fn v_metrics_byte_range(&self) -> Range<usize> {
101
50
        let number_of_long_ver_metrics = self.number_of_long_ver_metrics();
102
50
        let start = 0;
103
50
        let end = start
104
50
            + (transforms::to_usize(number_of_long_ver_metrics))
105
50
                .saturating_mul(LongMetric::RAW_BYTE_LEN);
106
50
        start..end
107
50
    }
108
109
25
    pub fn top_side_bearings_byte_range(&self) -> Range<usize> {
110
25
        let start = self.v_metrics_byte_range().end;
111
25
        let end = start
112
25
            + self.offset_data().len().saturating_sub(start) / i16::RAW_BYTE_LEN
113
25
                * i16::RAW_BYTE_LEN;
114
25
        start..end
115
25
    }
116
}
117
118
#[allow(clippy::absurd_extreme_comparisons)]
119
const _: () = assert!(FontData::default_data_long_enough(Vmtx::MIN_SIZE));
120
121
impl Default for Vmtx<'_> {
122
0
    fn default() -> Self {
123
        Self {
124
0
            data: TableDataRef::new(FontData::default_table_data().as_bytes())
125
0
                .unwrap_or_else(|| unreachable!("the default data covers MIN_SIZE")),
126
0
            number_of_long_ver_metrics: Default::default(),
127
        }
128
0
    }
129
}
130
131
impl<'a> MinByteRange<'a> for VmtxExtended<'a> {
132
0
    fn min_byte_range(&self) -> Range<usize> {
133
0
        0..self.top_side_bearings_byte_range().end
134
0
    }
135
0
    fn min_table_bytes(&self) -> &'a [u8] {
136
0
        let range = self.min_byte_range();
137
0
        self.offset_data().as_bytes().get(range).unwrap_or_default()
138
0
    }
139
}
140
141
impl TopLevelTable for VmtxExtended<'_> {
142
    /// `VMTX`
143
    const TAG: Tag = Tag::new(b"VMTX");
144
}
145
146
impl ReadArgs for VmtxExtended<'_> {
147
    type Args = u32;
148
}
149
150
impl<'a> FontRead<'a> for VmtxExtended<'a> {
151
0
    fn read_with_args(data: FontData<'a>, args: u32) -> Result<Self, ReadError> {
152
0
        let number_of_long_ver_metrics = args;
153
154
        #[allow(clippy::absurd_extreme_comparisons)]
155
0
        if data.len() < Self::MIN_SIZE {
156
0
            return Err(ReadError::OutOfBounds);
157
0
        }
158
0
        let Some(data) = TableDataRef::new(data.as_bytes()) else {
159
0
            return Err(ReadError::OutOfBounds);
160
        };
161
0
        Ok(Self {
162
0
            data,
163
0
            number_of_long_ver_metrics,
164
0
        })
165
0
    }
166
}
167
168
impl<'a> VmtxExtended<'a> {
169
    /// A constructor that requires additional arguments.
170
    ///
171
    /// This type requires some external state in order to be
172
    /// parsed.
173
0
    pub fn read(data: FontData<'a>, number_of_long_ver_metrics: u32) -> Result<Self, ReadError> {
174
0
        let args = number_of_long_ver_metrics;
175
0
        Self::read_with_args(data, args)
176
0
    }
177
}
178
179
/// The fields at the start of the table, which are read directly.
180
#[derive(Clone, Copy, bytemuck :: AnyBitPattern)]
181
#[repr(C, packed)]
182
#[doc(hidden)]
183
pub struct VmtxExtendedFixedHeader {}
184
185
#[allow(clippy::absurd_extreme_comparisons)]
186
const _: () = assert!(std::mem::size_of::<VmtxExtendedFixedHeader>() <= VmtxExtended::MIN_SIZE);
187
188
/// VMTX vertical metrics (ISO/IEC 14496-22:2026, 5.6.14).
189
#[derive(Clone)]
190
pub struct VmtxExtended<'a> {
191
    data: TableDataRef<'a, VmtxExtendedFixedHeader>,
192
    number_of_long_ver_metrics: u32,
193
}
194
195
#[allow(clippy::needless_lifetimes)]
196
impl<'a> VmtxExtended<'a> {
197
    pub const MIN_SIZE: usize = 0;
198
    basic_table_impls!(impl_the_methods);
199
200
0
    pub fn v_metrics(&self) -> &'a [LongMetric] {
201
0
        let range = self.v_metrics_byte_range();
202
0
        self.offset_data()
203
0
            .read_array(range)
204
0
            .ok()
205
0
            .unwrap_or_default()
206
0
    }
207
208
0
    pub fn top_side_bearings(&self) -> &'a [BigEndian<i16>] {
209
0
        let range = self.top_side_bearings_byte_range();
210
0
        self.offset_data()
211
0
            .read_array(range)
212
0
            .ok()
213
0
            .unwrap_or_default()
214
0
    }
215
216
0
    pub(crate) fn number_of_long_ver_metrics(&self) -> u32 {
217
0
        self.number_of_long_ver_metrics
218
0
    }
219
220
0
    pub fn v_metrics_byte_range(&self) -> Range<usize> {
221
0
        let number_of_long_ver_metrics = self.number_of_long_ver_metrics();
222
0
        let start = 0;
223
0
        let end = start
224
0
            + (transforms::to_usize(number_of_long_ver_metrics))
225
0
                .saturating_mul(LongMetric::RAW_BYTE_LEN);
226
0
        start..end
227
0
    }
228
229
0
    pub fn top_side_bearings_byte_range(&self) -> Range<usize> {
230
0
        let start = self.v_metrics_byte_range().end;
231
0
        let end = start
232
0
            + self.offset_data().len().saturating_sub(start) / i16::RAW_BYTE_LEN
233
0
                * i16::RAW_BYTE_LEN;
234
0
        start..end
235
0
    }
236
}
237
238
#[allow(clippy::absurd_extreme_comparisons)]
239
const _: () = assert!(FontData::default_data_long_enough(VmtxExtended::MIN_SIZE));
240
241
impl Default for VmtxExtended<'_> {
242
0
    fn default() -> Self {
243
        Self {
244
0
            data: TableDataRef::new(FontData::default_table_data().as_bytes())
245
0
                .unwrap_or_else(|| unreachable!("the default data covers MIN_SIZE")),
246
0
            number_of_long_ver_metrics: Default::default(),
247
        }
248
0
    }
249
}