1 | use crate::{Expression, Value};
|
2 |
|
3 | macro_rules! define_property {
|
4 | (
|
5 | $(
|
6 | $(#[$attr:meta])*
|
7 | $variant:ident($value_ty:ident, $name:expr),
|
8 | )+
|
9 | ) => {
|
10 | #[derive(Clone, Debug, PartialEq)]
|
11 | #[cfg_attr(feature = "serde" , derive(serde::Serialize, serde::Deserialize))]
|
12 | pub enum Property {
|
13 | $(
|
14 | $(#[$attr])*
|
15 | $variant(Expression),
|
16 | )+
|
17 | Dynamic(String, Expression),
|
18 | }
|
19 |
|
20 | impl Property {
|
21 | pub fn kind(&self) -> PropertyKind {
|
22 | match self {
|
23 | $(
|
24 | Property::$variant(_) => PropertyKind::$variant,
|
25 | )+
|
26 | Property::Dynamic(s, _) => PropertyKind::Dynamic(s.clone()),
|
27 | }
|
28 | }
|
29 | }
|
30 |
|
31 | #[derive(Clone, Debug, PartialEq, Eq)]
|
32 | #[cfg_attr(feature = "serde" , derive(serde::Serialize, serde::Deserialize))]
|
33 | pub enum PropertyKind {
|
34 | $(
|
35 | $(#[$attr])*
|
36 | $variant,
|
37 | )+
|
38 | Dynamic(String),
|
39 | }
|
40 |
|
41 | parse_enum! {
|
42 | PropertyKind,
|
43 | $(
|
44 | ($variant, $name),
|
45 | )+
|
46 | |s| Ok(PropertyKind::Dynamic(s.into())),
|
47 | }
|
48 |
|
49 | impl PropertyKind {
|
50 | pub fn make_property(self, expr: Expression) -> Property {
|
51 | match self {
|
52 | $(
|
53 | PropertyKind::$variant => Property::$variant(expr),
|
54 | )+
|
55 | PropertyKind::Dynamic(name) => Property::Dynamic(name.clone(), expr),
|
56 | }
|
57 | }
|
58 | }
|
59 | };
|
60 | }
|
61 |
|
62 | define_property! {
|
63 | /// Font family names
|
64 | Family(String, "family" ),
|
65 | /// Languages corresponding to each family
|
66 | FamilyLang(String, "familylang" ),
|
67 | /// Font style. Overrides weight and slant
|
68 | Style(String, "style" ),
|
69 | /// Languages corresponding to each style
|
70 | StyleLang(String, "stylelang" ),
|
71 | /// Font full names (often includes style)
|
72 | FullName(String, "fullname" ),
|
73 | /// Languages corresponding to each fullname
|
74 | FullNameLang(String, "fullnamelang" ),
|
75 |
|
76 | /// Italic, oblique or roman
|
77 | Slant(Int, "slant" ),
|
78 | /// Light, medium, demibold, bold or black
|
79 | Weight(Int, "weight" ),
|
80 | /// Point size
|
81 | Size(Double, "size" ),
|
82 | /// Condensed, normal or expanded
|
83 | Width(Int, "width" ),
|
84 | /// Stretches glyphs horizontally before hinting
|
85 | Aspect(Double, "aspect" ),
|
86 | /// Pixel size
|
87 | PixelSize(Double, "pixelsize" ),
|
88 | /// Proportional, dual-width, monospace or charcell
|
89 | Spacing(Int, "spacing" ),
|
90 | /// Font foundry name
|
91 | Foundry(String, "foundry" ),
|
92 | /// Whether glyphs can be antialiased
|
93 | Antialias(Bool, "antialias" ),
|
94 | /// Whether the rasterizer should use hinting
|
95 | Hinting(Bool, "hinting" ),
|
96 | /// Automatic hinting style
|
97 | HintStyle(Int, "hintstyle" ),
|
98 | /// Automatic hinting style
|
99 | VerticalLayout(Bool, "verticallayout" ),
|
100 | /// Use autohinter instead of normal hinter
|
101 | AutoHint(Bool, "autohint" ),
|
102 | /// Use font global advance data (deprecated)
|
103 | GlobalAdvance(Bool, "globaladvance" ),
|
104 |
|
105 | /// The filename holding the font
|
106 | File(String, "file" ),
|
107 | /// The index of the font within the file
|
108 | Index(Int, "index" ),
|
109 | // TODO:
|
110 | // /// Use the specified FreeType face object
|
111 | // Ftface(FT_Face),
|
112 | /// Which rasterizer is in use (deprecated)
|
113 | Rasterizer(String, "rasterizer" ),
|
114 | /// Whether the glyphs are outlines
|
115 | Outline(Bool, "outline" ),
|
116 | /// Whether glyphs can be scaled
|
117 | Scalable(Bool, "scalable" ),
|
118 | /// Whether any glyphs have color
|
119 | Color(Bool, "color" ),
|
120 | /// Scale factor for point->pixel conversions (deprecated)
|
121 | Scale(Double, "scale" ),
|
122 | /// Target dots per inch
|
123 | Dpi(Double, "dpi" ),
|
124 | /// unknown, rgb, bgr, vrgb, vbgr, none - subpixel geometry
|
125 | Rgba(Int, "rgba" ),
|
126 | /// Type of LCD filter
|
127 | Lcdfilter(Int, "lcdfilter" ),
|
128 | /// Eliminate leading from line spacing
|
129 | Minspace(Bool, "minspace" ),
|
130 | /// Unicode chars encoded by the font
|
131 | Charset(CharSet, "charset" ),
|
132 | /// List of RFC-3066-style languages this font supports
|
133 | Lang(String, "lang" ),
|
134 | /// Version number of the font
|
135 | Fontversion(Int, "fontversion" ),
|
136 | /// List of layout capabilities in the font
|
137 | Capability(String, "capability" ),
|
138 | /// String name of the font format
|
139 | Fontformat(String, "fontformat" ),
|
140 | /// Rasterizer should synthetically embolden the font
|
141 | Embolden(Bool, "embolden" ),
|
142 | /// Use the embedded bitmap instead of the outline
|
143 | Embeddedbitmap(Bool, "embeddedbitmap" ),
|
144 | /// Whether the style is a decorative variant
|
145 | Decorative(Bool, "decorative" ),
|
146 | /// List of the feature tags in OpenType to be enabled
|
147 | Fontfeatures(String, "fontfeatures" ),
|
148 | /// Language name to be used for the default value of familylang, stylelang, and fullnamelang
|
149 | Namelang(String, "namelang" ),
|
150 | /// String Name of the running program
|
151 | Prgname(String, "prgname" ),
|
152 | /// Font family name in PostScript
|
153 | Postscriptname(String, "postscriptname" ),
|
154 | /// Whether the font has hinting
|
155 | Fonthashint(Bool, "fonthashint" ),
|
156 | /// Order number of the font
|
157 | Order(Int, "order" ),
|
158 |
|
159 | // custom
|
160 |
|
161 | Matrix(Matrix, "matrix" ),
|
162 | PixelSizeFixupFactor(Double, "pixelsizefixupfactor" ),
|
163 | ScalingNotNeeded(Bool, "scalingnotneeded" ),
|
164 | }
|
165 |
|
166 | impl Default for Property {
|
167 | fn default() -> Self {
|
168 | Property::Family(Expression::Simple(Value::String(String::default())))
|
169 | }
|
170 | }
|
171 |
|
172 | impl Default for PropertyKind {
|
173 | fn default() -> Self {
|
174 | PropertyKind::Family
|
175 | }
|
176 | }
|
177 | |