//! Definitions for specifying variations and typographic features. use super::Tag; use core::str::FromStr; /// Setting defined by a selector tag and an associated value. /// /// This type is a generic container for properties that can be activated /// or defined by a `(Tag, T)` pair where the tag selects the target /// setting and the generic value of type `T` specifies the value for that /// setting. /// /// ## Usage /// Current usage is for specifying variation axis settings (similar to the /// CSS property [font-variation-settings](https://developer.mozilla.org/en-US/docs/Web/CSS/font-variation-settings)). /// See [`VariationSetting`]. /// /// In the future, this will likely also be used for specifying feature settings /// (analogous to the CSS property [font-feature-settings](https://developer.mozilla.org/en-US/docs/Web/CSS/font-feature-settings)) /// for selecting OpenType [features](https://learn.microsoft.com/en-us/typography/opentype/spec/featuretags). #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)] pub struct Setting { /// Tag that specifies the target setting. pub selector: Tag, /// The desired value for the setting. pub value: T, } impl Setting { /// Creates a new setting from the given selector tag and its associated /// value. pub fn new(selector: Tag, value: T) -> Self { Self { selector, value } } } // This is provided so that &[VariationSetting] can be passed to the // variation_settings() method of ScalerBuilder. impl From<&'_ Setting> for Setting { fn from(value: &'_ Setting) -> Self { *value } } impl From<(Tag, T)> for Setting { fn from(s: (Tag, T)) -> Self { Self { selector: s.0, value: s.1, } } } impl From<&(Tag, T)> for Setting { fn from(s: &(Tag, T)) -> Self { Self { selector: s.0, value: s.1, } } } impl From<(&str, T)> for Setting { fn from(s: (&str, T)) -> Self { Self { selector: Tag::from_str(s.0).unwrap_or_default(), value: s.1, } } } impl From<&(&str, T)> for Setting { fn from(s: &(&str, T)) -> Self { Self { selector: Tag::from_str(s.0).unwrap_or_default(), value: s.1, } } } /// Type for specifying a variation axis setting in user coordinates. /// /// The `selector` field should contain a tag that corresponds to a /// variation axis while the `value` field specifies the desired position /// on the axis in user coordinates (i.e. within the range defined by /// the minimum and maximum values of the axis). /// /// # Example /// ``` /// use skrifa::{Tag, setting::VariationSetting}; /// /// // For convenience, a conversion from (&str, f32) is provided. /// let slightly_bolder: VariationSetting = ("wght", 720.0).into(); /// /// assert_eq!(slightly_bolder, VariationSetting::new(Tag::new(b"wght"), 720.0)); /// ``` pub type VariationSetting = Setting;