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
//! 横に伸びる字形が、どこまで伸びられるかを見る
use suki::font;
fn main() {
let loaded = font::load(std::fs::read("font/latinmodern-math.otf").unwrap()).unwrap();
let units = font::units_per_em(&loaded);
for (name, character) in [
("\u{20d7} 右矢印の印", '\u{20d7}'),
("\u{23de} 上の波括弧", '\u{23de}'),
("\u{302} ハット", '\u{302}'),
("\u{303} チルダ", '\u{303}'),
("\u{27f6} 長い右矢印", '\u{27f6}'),
("\u{2192} 右矢印", '\u{2192}'),
] {
let Some(glyph) = font::glyph_of(&loaded, character) else {
println!("{name}: 持っていない");
continue;
};
print!("{name} 字形 {glyph} 送り {:.3}", font::advance(&loaded, glyph));
match font::horizontal_growth(&loaded, glyph) {
Some(growth) => {
println!(" 変種 {} 個 部品 {} 個", growth.variant.len(), growth.part.len());
for variant in &growth.variant {
println!(" 変種 {} 長さ {:.3}", variant.glyph, variant.measure);
}
for part in &growth.part {
println!(
" 部品 {} 全長 {:.3} 端 {:.3}/{:.3} 伸ばせる {}",
part.glyph, part.full_advance, part.start_connector,
part.end_connector, part.extender
);
}
}
None => println!(" 横に伸ばせない"),
}
}
for text in ["AB", "xyz", "abc"] {
let width: f64 = text
.chars()
.filter_map(suki::symbol::italic)
.filter_map(|c| font::glyph_of(&loaded, c))
.map(|g| font::advance(&loaded, g))
.sum();
println!("{text} の幅 {width:.3} (1em = {units})");
}
}