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