From 1cd257d54f6af7a744ac1207523361a41a9c864f Mon Sep 17 00:00:00 2001 From: Oriol Brufau Date: Tue, 16 May 2023 10:57:00 +0200 Subject: [PATCH] style: Add ascent-, descent- and line-gap-override descriptors to the style system Differential Revision: https://phabricator.services.mozilla.com/D109287 --- components/style/font_face.rs | 20 ++++++++++++++- components/style/values/specified/font.rs | 31 +++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/components/style/font_face.rs b/components/style/font_face.rs index b04701649e1..cb5a2c06e23 100644 --- a/components/style/font_face.rs +++ b/components/style/font_face.rs @@ -19,7 +19,7 @@ use crate::values::specified::font::SpecifiedFontFeatureSettings; use crate::values::specified::font::SpecifiedFontStyle; #[cfg(feature = "gecko")] use crate::values::specified::font::SpecifiedFontVariationSettings; -use crate::values::specified::font::{AbsoluteFontWeight, FontStretch}; +use crate::values::specified::font::{AbsoluteFontWeight, FontStretch, MetricsOverride}; use crate::values::specified::url::SpecifiedUrl; use crate::values::specified::Angle; #[cfg(feature = "gecko")] @@ -418,6 +418,15 @@ macro_rules! is_descriptor_enabled { ("font-variation-settings") => { static_prefs::pref!("layout.css.font-variations.enabled") }; + ("ascent-override") => { + static_prefs::pref!("layout.css.font-metrics-overrides.enabled") + }; + ("descent-override") => { + static_prefs::pref!("layout.css.font-metrics-overrides.enabled") + }; + ("line-gap-override") => { + static_prefs::pref!("layout.css.font-metrics-overrides.enabled") + }; ($name:tt) => { true }; @@ -576,6 +585,15 @@ font_face_descriptors! { /// The language override of this font face. "font-language-override" language_override / mFontLanguageOverride: font_language_override::SpecifiedValue, + + /// The ascent override for this font face. + "ascent-override" ascent_override / mAscentOverride: MetricsOverride, + + /// The descent override for this font face. + "descent-override" descent_override / mDescentOverride: MetricsOverride, + + /// The line-gap override for this font face. + "line-gap-override" line_gap_override / mLineGapOverride: MetricsOverride, ] } diff --git a/components/style/values/specified/font.rs b/components/style/values/specified/font.rs index f8556fe379e..6e43c34d53b 100644 --- a/components/style/values/specified/font.rs +++ b/components/style/values/specified/font.rs @@ -2205,6 +2205,37 @@ impl Parse for VariationValue { } } +/// A metrics override value for a @font-face descriptor +/// +/// https://drafts.csswg.org/css-fonts/#font-metrics-override-desc +#[derive(Clone, Copy, Debug, MallocSizeOf, Parse, PartialEq, SpecifiedValueInfo, ToCss, ToShmem)] +pub enum MetricsOverride { + /// A non-negative `` of the computed font size + Override(NonNegativePercentage), + /// Normal metrics from the font. + Normal, +} + +impl MetricsOverride { + #[inline] + /// Get default value with `normal` + pub fn normal() -> MetricsOverride { + MetricsOverride::Normal + } + + /// The ToComputedValue implementation, used for @font-face descriptors. + /// + /// Valid override percentages must be non-negative; we return -1.0 to indicate + /// the absence of an override (i.e. 'normal'). + #[inline] + pub fn compute(&self) -> ComputedPercentage { + match *self { + MetricsOverride::Normal => ComputedPercentage(-1.0), + MetricsOverride::Override(percent) => ComputedPercentage(percent.0.get()), + } + } +} + #[derive( Clone, Copy,