1use types::Fixed;
4
5pub const MAX_BLUE_VALUES: usize = 7;
8
9#[derive(Copy, Clone, PartialEq, Eq, Default, Debug)]
14pub struct Blues {
15 values: [(Fixed, Fixed); MAX_BLUE_VALUES],
16 len: u32,
17}
18
19impl Blues {
20 pub fn new(values: impl Iterator<Item = Fixed>) -> Self {
22 let mut blues = Self::default();
23 let mut stash = Fixed::ZERO;
24 for (i, value) in values.take(MAX_BLUE_VALUES * 2).enumerate() {
25 if (i & 1) == 0 {
26 stash = value;
27 } else {
28 blues.values[i / 2] = (stash, value);
29 blues.len += 1;
30 }
31 }
32 blues
33 }
34
35 pub fn values(&self) -> &[(Fixed, Fixed)] {
37 &self.values[..self.len as usize]
38 }
39}
40
41pub const MAX_STEM_SNAPS: usize = 12;
46
47#[derive(Copy, Clone, PartialEq, Eq, Default, Debug)]
51pub struct StemSnaps {
52 values: [Fixed; MAX_STEM_SNAPS],
53 len: u32,
54}
55
56impl StemSnaps {
57 pub fn new(values: impl Iterator<Item = Fixed>) -> Self {
59 let mut snaps = Self::default();
60 for (value, target_value) in values.take(MAX_STEM_SNAPS).zip(&mut snaps.values) {
61 *target_value = value;
62 snaps.len += 1;
63 }
64 snaps
65 }
66
67 pub fn values(&self) -> &[Fixed] {
69 &self.values[..self.len as usize]
70 }
71}
72
73#[derive(Clone, PartialEq, Eq, Debug)]
76pub struct HintingParams {
77 pub blues: Blues,
78 pub family_blues: Blues,
79 pub other_blues: Blues,
80 pub family_other_blues: Blues,
81 pub blue_scale: Fixed,
82 pub blue_shift: Fixed,
83 pub blue_fuzz: Fixed,
84 pub language_group: i32,
85}
86
87impl Default for HintingParams {
88 fn default() -> Self {
89 Self {
90 blues: Blues::default(),
91 other_blues: Blues::default(),
92 family_blues: Blues::default(),
93 family_other_blues: Blues::default(),
94 blue_scale: Fixed::from_f64(0.039625),
96 blue_shift: Fixed::from_i32(7),
97 blue_fuzz: Fixed::ONE,
98 language_group: 0,
99 }
100 }
101}