1 | use crate::{FontRef, FontVec, VariableFont, VariationAxis}; |
2 | #[cfg (not(feature = "std" ))] |
3 | use alloc::vec::Vec; |
4 | use owned_ttf_parser::{self as ttfp, AsFaceRef, FaceMut}; |
5 | |
6 | impl VariableFont for FontRef<'_> { |
7 | fn set_variation(&mut self, axis: &[u8; 4], value: f32) -> bool { |
8 | let tag: Tag = ttfp::Tag::from_bytes(axis); |
9 | // TODO remove existence check in next breaking version |
10 | let exists: bool = self |
11 | .0 |
12 | .as_face_ref() |
13 | .variation_axes() |
14 | .into_iter() |
15 | .any(|axis: VariationAxis| axis.tag == tag); |
16 | if exists { |
17 | self.0.set_variation(axis:tag, value); |
18 | } |
19 | exists |
20 | } |
21 | |
22 | fn variations(&self) -> Vec<VariationAxis> { |
23 | variations(self.0.as_face_ref()) |
24 | } |
25 | } |
26 | |
27 | impl VariableFont for FontVec { |
28 | fn set_variation(&mut self, axis: &[u8; 4], value: f32) -> bool { |
29 | self.0 |
30 | .set_variation(axis:ttfp::Tag::from_bytes(axis), value) |
31 | .is_some() |
32 | } |
33 | |
34 | fn variations(&self) -> Vec<VariationAxis> { |
35 | variations(self.0.as_face_ref()) |
36 | } |
37 | } |
38 | |
39 | fn variations(face: &ttfp::Face<'_>) -> Vec<VariationAxis> { |
40 | face.variation_axes() |
41 | .into_iter() |
42 | .map(|axis| { |
43 | #[cfg (feature = "std" )] |
44 | let name = face.names().into_iter().find_map(|n| { |
45 | if n.name_id == axis.name_id { |
46 | n.to_string() |
47 | } else { |
48 | None |
49 | } |
50 | }); |
51 | #[cfg (not(feature = "std" ))] |
52 | let name = None; |
53 | VariationAxis { |
54 | tag: axis.tag.to_bytes(), |
55 | name, |
56 | min_value: axis.min_value, |
57 | default_value: axis.def_value, |
58 | max_value: axis.max_value, |
59 | hidden: axis.hidden, |
60 | } |
61 | }) |
62 | .collect() |
63 | } |
64 | |