1#[cfg(not(feature = "std"))]
2use alloc::string::String;
3#[cfg(not(feature = "std"))]
4use alloc::vec::Vec;
5
6/// Logic for variable fonts.
7///
8/// Requires feature `variable-fonts` (enabled by default).
9pub trait VariableFont {
10 /// Sets a variation axis coordinate value by it's tag.
11 ///
12 /// Returns false if there is no such axis tag.
13 ///
14 /// # Example
15 /// ```
16 /// use ab_glyph::{FontRef, VariableFont};
17 ///
18 /// # fn main() -> Result<(), ab_glyph::InvalidFont> {
19 /// let mut font = FontRef::try_from_slice(include_bytes!("../../dev/fonts/Cantarell-VF.otf"))?;
20 ///
21 /// // set weight to 600
22 /// assert!(font.set_variation(b"wght", 600.0));
23 ///
24 /// // no such variation tag "foob" so return false
25 /// assert!(!font.set_variation(b"foob", 200.0));
26 /// # Ok(()) }
27 /// ```
28 fn set_variation(&mut self, tag: &[u8; 4], value: f32) -> bool;
29
30 /// Returns variation axes.
31 ///
32 /// # Example
33 /// ```
34 /// use ab_glyph::{FontRef, VariableFont};
35 ///
36 /// # fn main() -> Result<(), ab_glyph::InvalidFont> {
37 /// let font = FontRef::try_from_slice(include_bytes!("../../dev/fonts/Cantarell-VF.otf"))?;
38 /// let var = &font.variations()[0];
39 /// # eprintln!("{var:#?}");
40 ///
41 /// assert_eq!(var.tag, *b"wght");
42 /// assert_eq!(var.name.as_deref(), Some("Weight"));
43 /// assert!((var.min_value - 100.0).abs() < f32::EPSILON);
44 /// assert!((var.default_value - 400.0).abs() < f32::EPSILON);
45 /// assert!((var.max_value - 800.0).abs() < f32::EPSILON);
46 /// assert!(!var.hidden);
47 /// # Ok(()) }
48 /// ```
49 fn variations(&self) -> Vec<VariationAxis>;
50}
51
52#[non_exhaustive]
53#[derive(Debug, Clone)]
54pub struct VariationAxis {
55 /// Tag identifying the design variation for the axis.
56 pub tag: [u8; 4],
57 /// Unicode name.
58 pub name: Option<String>,
59 /// The minimum coordinate value for the axis.
60 pub min_value: f32,
61 /// The default coordinate value for the axis.
62 pub default_value: f32,
63 /// The maximum coordinate value for the axis.
64 pub max_value: f32,
65 /// Whether the axis should be exposed directly in user interfaces.
66 pub hidden: bool,
67}
68