Skip to main content

write_fonts/generated/
generated_hmtx.rs

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)]
6use crate::codegen_prelude::*;
7
8/// The [hmtx (Horizontal Metrics)](https://docs.microsoft.com/en-us/typography/opentype/spec/hmtx) table
9#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub struct Hmtx {
12    /// Paired advance width/height and left/top side bearing values for each
13    /// glyph. Records are indexed by glyph ID.
14    pub h_metrics: Vec<LongMetric>,
15    /// Leading (left/top) side bearings for glyph IDs greater than or equal to
16    /// numberOfLongMetrics.
17    pub left_side_bearings: Vec<i16>,
18}
19
20impl Hmtx {
21    /// Construct a new `Hmtx`
22    pub fn new(h_metrics: Vec<LongMetric>, left_side_bearings: Vec<i16>) -> Self {
23        Self {
24            h_metrics,
25            left_side_bearings,
26        }
27    }
28}
29
30impl FontWrite for Hmtx {
31    fn write_into(&self, writer: &mut TableWriter) {
32        self.h_metrics.write_into(writer);
33        self.left_side_bearings.write_into(writer);
34    }
35    fn table_type(&self) -> TableType {
36        TableType::TopLevel(Hmtx::TAG)
37    }
38}
39
40impl Validate for Hmtx {
41    fn validate_impl(&self, ctx: &mut ValidationCtx) {
42        ctx.in_table("Hmtx", |ctx| {
43            ctx.in_field("h_metrics", |ctx| {
44                if self.h_metrics.len() > to_usize(u16::MAX) {
45                    ctx.report("array exceeds max length");
46                }
47                self.h_metrics.validate_impl(ctx);
48            });
49        })
50    }
51}
52
53impl TopLevelTable for Hmtx {
54    const TAG: Tag = Tag::new(b"hmtx");
55}
56
57impl<'a> FromObjRef<read_fonts::tables::hmtx::Hmtx<'a>> for Hmtx {
58    fn from_obj_ref(obj: &read_fonts::tables::hmtx::Hmtx<'a>, _: FontData) -> Self {
59        let offset_data = obj.offset_data();
60        Hmtx {
61            h_metrics: obj.h_metrics().to_owned_obj(offset_data),
62            left_side_bearings: obj.left_side_bearings().to_owned_obj(offset_data),
63        }
64    }
65}
66
67#[allow(clippy::needless_lifetimes)]
68impl<'a> FromTableRef<read_fonts::tables::hmtx::Hmtx<'a>> for Hmtx {}
69
70/// HMTX horizontal metrics (ISO/IEC 14496-22:2026, 5.1.11).
71#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
72#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
73pub struct HmtxExtended {
74    pub h_metrics: Vec<LongMetric>,
75    pub left_side_bearings: Vec<i16>,
76}
77
78impl HmtxExtended {
79    /// Construct a new `HmtxExtended`
80    pub fn new(h_metrics: Vec<LongMetric>, left_side_bearings: Vec<i16>) -> Self {
81        Self {
82            h_metrics,
83            left_side_bearings,
84        }
85    }
86}
87
88impl FontWrite for HmtxExtended {
89    fn write_into(&self, writer: &mut TableWriter) {
90        self.h_metrics.write_into(writer);
91        self.left_side_bearings.write_into(writer);
92    }
93    fn table_type(&self) -> TableType {
94        TableType::TopLevel(HmtxExtended::TAG)
95    }
96}
97
98impl Validate for HmtxExtended {
99    fn validate_impl(&self, ctx: &mut ValidationCtx) {
100        ctx.in_table("HmtxExtended", |ctx| {
101            ctx.in_field("h_metrics", |ctx| {
102                if self.h_metrics.len() > to_usize(u32::MAX) {
103                    ctx.report("array exceeds max length");
104                }
105                self.h_metrics.validate_impl(ctx);
106            });
107        })
108    }
109}
110
111impl TopLevelTable for HmtxExtended {
112    const TAG: Tag = Tag::new(b"HMTX");
113}
114
115impl<'a> FromObjRef<read_fonts::tables::hmtx::HmtxExtended<'a>> for HmtxExtended {
116    fn from_obj_ref(obj: &read_fonts::tables::hmtx::HmtxExtended<'a>, _: FontData) -> Self {
117        let offset_data = obj.offset_data();
118        HmtxExtended {
119            h_metrics: obj.h_metrics().to_owned_obj(offset_data),
120            left_side_bearings: obj.left_side_bearings().to_owned_obj(offset_data),
121        }
122    }
123}
124
125#[allow(clippy::needless_lifetimes)]
126impl<'a> FromTableRef<read_fonts::tables::hmtx::HmtxExtended<'a>> for HmtxExtended {}
127
128#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
129#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
130pub struct LongMetric {
131    /// Advance width/height, in font design units.
132    pub advance: u16,
133    /// Glyph leading (left/top) side bearing, in font design units.
134    pub side_bearing: i16,
135}
136
137impl LongMetric {
138    /// Construct a new `LongMetric`
139    pub fn new(advance: u16, side_bearing: i16) -> Self {
140        Self {
141            advance,
142            side_bearing,
143        }
144    }
145}
146
147impl FontWrite for LongMetric {
148    fn write_into(&self, writer: &mut TableWriter) {
149        self.advance.write_into(writer);
150        self.side_bearing.write_into(writer);
151    }
152    fn table_type(&self) -> TableType {
153        TableType::Named("LongMetric")
154    }
155}
156
157impl Validate for LongMetric {
158    fn validate_impl(&self, _ctx: &mut ValidationCtx) {}
159}
160
161impl FromObjRef<read_fonts::tables::hmtx::LongMetric> for LongMetric {
162    fn from_obj_ref(obj: &read_fonts::tables::hmtx::LongMetric, _: FontData) -> Self {
163        LongMetric {
164            advance: obj.advance(),
165            side_bearing: obj.side_bearing(),
166        }
167    }
168}