| 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 | |