read_fonts/tables/
mvar.rs1use super::variations::{DeltaSetIndex, ItemVariationStore};
4
5pub mod tags {
7 use font_types::Tag;
8
9 pub const HASC: Tag = Tag::new(b"hasc");
11 pub const HDSC: Tag = Tag::new(b"hdsc");
13 pub const HLGP: Tag = Tag::new(b"hlgp");
15
16 pub const HCLA: Tag = Tag::new(b"hcla");
18 pub const HCLD: Tag = Tag::new(b"hcld");
20
21 pub const VASC: Tag = Tag::new(b"vasc");
23 pub const VDSC: Tag = Tag::new(b"vdsc");
25 pub const VLGP: Tag = Tag::new(b"vlgp");
27
28 pub const HCRS: Tag = Tag::new(b"hcrs");
30 pub const HCRN: Tag = Tag::new(b"hcrn");
32 pub const HCOF: Tag = Tag::new(b"hcof");
34
35 pub const VCRS: Tag = Tag::new(b"vcrs");
37 pub const VCRN: Tag = Tag::new(b"vcrn");
39 pub const VCOF: Tag = Tag::new(b"vcof");
41
42 pub const XHGT: Tag = Tag::new(b"xhgt");
44 pub const CPHT: Tag = Tag::new(b"cpht");
46
47 pub const SBXO: Tag = Tag::new(b"sbxo");
49 pub const SBYO: Tag = Tag::new(b"sbyo");
51 pub const SBXS: Tag = Tag::new(b"sbxs");
53 pub const SBYS: Tag = Tag::new(b"sbys");
55
56 pub const SPXO: Tag = Tag::new(b"spxo");
58 pub const SPYO: Tag = Tag::new(b"spyo");
60 pub const SPXS: Tag = Tag::new(b"spxs");
62 pub const SPYS: Tag = Tag::new(b"spys");
64
65 pub const STRS: Tag = Tag::new(b"strs");
67 pub const STRO: Tag = Tag::new(b"stro");
69
70 pub const UNDS: Tag = Tag::new(b"unds");
72 pub const UNDO: Tag = Tag::new(b"undo");
74
75 pub const GSP0: Tag = Tag::new(b"gsp0");
77 pub const GSP1: Tag = Tag::new(b"gsp1");
79 pub const GSP2: Tag = Tag::new(b"gsp2");
81 pub const GSP3: Tag = Tag::new(b"gsp3");
83 pub const GSP4: Tag = Tag::new(b"gsp4");
85 pub const GSP5: Tag = Tag::new(b"gsp5");
87 pub const GSP6: Tag = Tag::new(b"gsp6");
89 pub const GSP7: Tag = Tag::new(b"gsp7");
91 pub const GSP8: Tag = Tag::new(b"gsp8");
93 pub const GSP9: Tag = Tag::new(b"gsp9");
95}
96
97include!("../../generated/generated_mvar.rs");
98
99impl Mvar<'_> {
100 pub fn metric_delta(&self, tag: Tag, coords: &[F2Dot14]) -> Result<Fixed, ReadError> {
104 use std::cmp::Ordering;
105 let records = self.value_records();
106 let mut lo = 0;
107 let mut hi = records.len();
108 while lo < hi {
109 let i = (lo + hi) / 2;
110 let record = &records[i];
111 match tag.cmp(&record.value_tag()) {
112 Ordering::Less => {
113 hi = i;
114 }
115 Ordering::Greater => {
116 lo = i + 1;
117 }
118 Ordering::Equal => {
119 let ivs = self.item_variation_store().ok_or(ReadError::NullOffset)??;
120 return Ok(Fixed::from_i32(ivs.compute_delta(
121 DeltaSetIndex {
122 outer: record.delta_set_outer_index(),
123 inner: record.delta_set_inner_index(),
124 },
125 coords,
126 )?));
127 }
128 }
129 }
130 Err(ReadError::MetricIsMissing(tag))
131 }
132}