mirror of
https://github.com/servo/servo.git
synced 2025-08-07 22:45:34 +01:00
style: CSS support for the font-palette property
This is just the CSS parsing, not yet connected to the rendering back-end. Differential Revision: https://phabricator.services.mozilla.com/D157957
This commit is contained in:
parent
38caec4f89
commit
6a98b777e0
6 changed files with 83 additions and 10 deletions
|
@ -206,6 +206,18 @@ ${helpers.single_keyword_system(
|
||||||
spec="https://www.w3.org/TR/css-fonts-4/#font-optical-sizing-def",
|
spec="https://www.w3.org/TR/css-fonts-4/#font-optical-sizing-def",
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
${helpers.predefined_type(
|
||||||
|
"font-palette",
|
||||||
|
"FontPalette",
|
||||||
|
engines="gecko",
|
||||||
|
initial_value="computed::FontPalette::normal()",
|
||||||
|
initial_specified_value="specified::FontPalette::normal()",
|
||||||
|
animation_value_type="discrete",
|
||||||
|
gecko_pref="layout.css.font-palette.enabled",
|
||||||
|
has_effect_on_gecko_scrollbars=False,
|
||||||
|
spec="https://drafts.csswg.org/css-fonts/#font-palette-prop",
|
||||||
|
)}
|
||||||
|
|
||||||
${helpers.predefined_type(
|
${helpers.predefined_type(
|
||||||
"-x-lang",
|
"-x-lang",
|
||||||
"XLang",
|
"XLang",
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
${'font-language-override' if engine == 'gecko' else ''}
|
${'font-language-override' if engine == 'gecko' else ''}
|
||||||
${'font-feature-settings' if engine == 'gecko' else ''}
|
${'font-feature-settings' if engine == 'gecko' else ''}
|
||||||
${'font-variation-settings' if engine == 'gecko' else ''}
|
${'font-variation-settings' if engine == 'gecko' else ''}
|
||||||
|
${'font-palette' if engine == 'gecko' else ''}
|
||||||
"
|
"
|
||||||
derive_value_info="False"
|
derive_value_info="False"
|
||||||
spec="https://drafts.csswg.org/css-fonts-3/#propdef-font"
|
spec="https://drafts.csswg.org/css-fonts-3/#propdef-font"
|
||||||
|
@ -37,7 +38,7 @@
|
||||||
use crate::properties::longhands::font_variant_caps;
|
use crate::properties::longhands::font_variant_caps;
|
||||||
use crate::values::specified::text::LineHeight;
|
use crate::values::specified::text::LineHeight;
|
||||||
use crate::values::specified::FontSize;
|
use crate::values::specified::FontSize;
|
||||||
use crate::values::specified::font::{FontStretch, FontStretchKeyword};
|
use crate::values::specified::font::{FontPalette, FontStretch, FontStretchKeyword};
|
||||||
#[cfg(feature = "gecko")]
|
#[cfg(feature = "gecko")]
|
||||||
use crate::values::specified::font::SystemFont;
|
use crate::values::specified::font::SystemFont;
|
||||||
|
|
||||||
|
@ -46,7 +47,8 @@
|
||||||
variant_alternates variant_east_asian \
|
variant_alternates variant_east_asian \
|
||||||
variant_ligatures variant_numeric \
|
variant_ligatures variant_numeric \
|
||||||
variant_position feature_settings \
|
variant_position feature_settings \
|
||||||
variation_settings optical_sizing".split()
|
variation_settings optical_sizing \
|
||||||
|
palette".split()
|
||||||
%>
|
%>
|
||||||
% if engine == "gecko":
|
% if engine == "gecko":
|
||||||
% for prop in gecko_sub_properties:
|
% for prop in gecko_sub_properties:
|
||||||
|
@ -75,8 +77,9 @@
|
||||||
${name}: ${name}::SpecifiedValue::system_font(sys),
|
${name}: ${name}::SpecifiedValue::system_font(sys),
|
||||||
% endif
|
% endif
|
||||||
% endfor
|
% endfor
|
||||||
// line-height is just reset to initial
|
// line-height and palette are just reset to initial
|
||||||
line_height: LineHeight::normal(),
|
line_height: LineHeight::normal(),
|
||||||
|
font_palette: FontPalette::normal(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
% endif
|
% endif
|
||||||
|
@ -186,9 +189,14 @@
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if let Some(v) = self.font_palette {
|
||||||
|
if v != &font_palette::get_initial_specified_value() {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
% for name in gecko_sub_properties:
|
% for name in gecko_sub_properties:
|
||||||
% if name != "optical_sizing" and name != "variation_settings":
|
% if name != "optical_sizing" and name != "variation_settings" and name != "palette":
|
||||||
if self.font_${name} != &font_${name}::get_initial_specified_value() {
|
if self.font_${name} != &font_${name}::get_initial_specified_value() {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
@ -251,7 +259,7 @@
|
||||||
let mut all = true;
|
let mut all = true;
|
||||||
|
|
||||||
% for prop in SYSTEM_FONT_LONGHANDS:
|
% for prop in SYSTEM_FONT_LONGHANDS:
|
||||||
% if prop == "font_optical_sizing" or prop == "font_variation_settings":
|
% if prop == "font_optical_sizing" or prop == "font_variation_settings" or prop == "font_palette":
|
||||||
if let Some(value) = self.${prop} {
|
if let Some(value) = self.${prop} {
|
||||||
% else:
|
% else:
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,6 +24,7 @@ use std::fmt::{self, Write};
|
||||||
use style_traits::{CssWriter, ParseError, ToCss};
|
use style_traits::{CssWriter, ParseError, ToCss};
|
||||||
|
|
||||||
pub use crate::values::computed::Length as MozScriptMinSize;
|
pub use crate::values::computed::Length as MozScriptMinSize;
|
||||||
|
pub use crate::values::specified::font::FontPalette;
|
||||||
pub use crate::values::specified::font::{FontSynthesis, MozScriptSizeMultiplier};
|
pub use crate::values::specified::font::{FontSynthesis, MozScriptSizeMultiplier};
|
||||||
pub use crate::values::specified::font::{XLang, XTextZoom};
|
pub use crate::values::specified::font::{XLang, XTextZoom};
|
||||||
pub use crate::values::specified::Integer as SpecifiedInteger;
|
pub use crate::values::specified::Integer as SpecifiedInteger;
|
||||||
|
|
|
@ -63,7 +63,7 @@ pub use self::counters::{Content, ContentItem, CounterIncrement, CounterReset, C
|
||||||
pub use self::easing::TimingFunction;
|
pub use self::easing::TimingFunction;
|
||||||
pub use self::effects::{BoxShadow, Filter, SimpleShadow};
|
pub use self::effects::{BoxShadow, Filter, SimpleShadow};
|
||||||
pub use self::flex::FlexBasis;
|
pub use self::flex::FlexBasis;
|
||||||
pub use self::font::{FontFamily, FontLanguageOverride, FontStyle};
|
pub use self::font::{FontFamily, FontLanguageOverride, FontStyle, FontPalette};
|
||||||
pub use self::font::{FontFeatureSettings, FontVariantLigatures, FontVariantNumeric};
|
pub use self::font::{FontFeatureSettings, FontVariantLigatures, FontVariantNumeric};
|
||||||
pub use self::font::{FontSize, FontSizeAdjust, FontStretch, FontSynthesis};
|
pub use self::font::{FontSize, FontSizeAdjust, FontStretch, FontSynthesis};
|
||||||
pub use self::font::{FontVariantAlternates, FontWeight};
|
pub use self::font::{FontVariantAlternates, FontWeight};
|
||||||
|
|
|
@ -20,7 +20,7 @@ use crate::values::generics::NonNegative;
|
||||||
use crate::values::specified::length::{FontBaseSize, PX_PER_PT};
|
use crate::values::specified::length::{FontBaseSize, PX_PER_PT};
|
||||||
use crate::values::specified::{AllowQuirks, Angle, Integer, LengthPercentage};
|
use crate::values::specified::{AllowQuirks, Angle, Integer, LengthPercentage};
|
||||||
use crate::values::specified::{NoCalcLength, NonNegativeNumber, NonNegativePercentage, Number};
|
use crate::values::specified::{NoCalcLength, NonNegativeNumber, NonNegativePercentage, Number};
|
||||||
use crate::values::CustomIdent;
|
use crate::values::{CustomIdent, SelectorParseErrorKind, serialize_atom_identifier};
|
||||||
use crate::Atom;
|
use crate::Atom;
|
||||||
use cssparser::{Parser, Token};
|
use cssparser::{Parser, Token};
|
||||||
#[cfg(feature = "gecko")]
|
#[cfg(feature = "gecko")]
|
||||||
|
@ -743,7 +743,7 @@ impl Parse for FontSizeAdjust {
|
||||||
"ic-height" if basis_enabled => GenericFontSizeAdjust::IcHeight,
|
"ic-height" if basis_enabled => GenericFontSizeAdjust::IcHeight,
|
||||||
// Unknown (or disabled) keyword.
|
// Unknown (or disabled) keyword.
|
||||||
_ => return Err(location.new_custom_error(
|
_ => return Err(location.new_custom_error(
|
||||||
::selectors::parser::SelectorParseErrorKind::UnexpectedIdent(ident)
|
SelectorParseErrorKind::UnexpectedIdent(ident)
|
||||||
)),
|
)),
|
||||||
};
|
};
|
||||||
let value = NonNegativeNumber::parse(context, input)?;
|
let value = NonNegativeNumber::parse(context, input)?;
|
||||||
|
@ -1991,7 +1991,6 @@ impl Parse for FontSynthesis {
|
||||||
_: &ParserContext,
|
_: &ParserContext,
|
||||||
input: &mut Parser<'i, 't>,
|
input: &mut Parser<'i, 't>,
|
||||||
) -> Result<FontSynthesis, ParseError<'i>> {
|
) -> Result<FontSynthesis, ParseError<'i>> {
|
||||||
use crate::values::SelectorParseErrorKind;
|
|
||||||
let mut result = Self::none();
|
let mut result = Self::none();
|
||||||
while let Ok(ident) = input.try_parse(|i| i.expect_ident_cloned()) {
|
while let Ok(ident) = input.try_parse(|i| i.expect_ident_cloned()) {
|
||||||
match_ignore_ascii_case! { &ident,
|
match_ignore_ascii_case! { &ident,
|
||||||
|
@ -2162,6 +2161,59 @@ impl Parse for FontLanguageOverride {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(
|
||||||
|
Clone,
|
||||||
|
Debug,
|
||||||
|
Eq,
|
||||||
|
MallocSizeOf,
|
||||||
|
PartialEq,
|
||||||
|
SpecifiedValueInfo,
|
||||||
|
ToComputedValue,
|
||||||
|
ToResolvedValue,
|
||||||
|
ToShmem,
|
||||||
|
)]
|
||||||
|
#[repr(C)]
|
||||||
|
/// Allows authors to choose a palette from those supported by a color font
|
||||||
|
/// (and potentially @font-palette-values overrides).
|
||||||
|
pub struct FontPalette(Atom);
|
||||||
|
|
||||||
|
#[allow(missing_docs)]
|
||||||
|
impl FontPalette {
|
||||||
|
pub fn normal() -> Self { Self(atom!("normal")) }
|
||||||
|
pub fn light() -> Self { Self(atom!("light")) }
|
||||||
|
pub fn dark() -> Self { Self(atom!("dark")) }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Parse for FontPalette {
|
||||||
|
/// normal | light | dark | dashed-ident
|
||||||
|
fn parse<'i, 't>(
|
||||||
|
_context: &ParserContext,
|
||||||
|
input: &mut Parser<'i, 't>,
|
||||||
|
) -> Result<FontPalette, ParseError<'i>> {
|
||||||
|
let location = input.current_source_location();
|
||||||
|
let ident = input.expect_ident()?;
|
||||||
|
match_ignore_ascii_case! { &ident,
|
||||||
|
"normal" => Ok(Self::normal()),
|
||||||
|
"light" => Ok(Self::light()),
|
||||||
|
"dark" => Ok(Self::dark()),
|
||||||
|
_ => if ident.starts_with("--") {
|
||||||
|
Ok(Self(Atom::from(ident.as_ref())))
|
||||||
|
} else {
|
||||||
|
Err(location.new_custom_error(SelectorParseErrorKind::UnexpectedIdent(ident.clone())))
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ToCss for FontPalette {
|
||||||
|
fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
|
||||||
|
where
|
||||||
|
W: Write,
|
||||||
|
{
|
||||||
|
serialize_atom_identifier(&self.0, dest)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// This property provides low-level control over OpenType or TrueType font
|
/// This property provides low-level control over OpenType or TrueType font
|
||||||
/// variations.
|
/// variations.
|
||||||
pub type SpecifiedFontVariationSettings = FontSettings<VariationValue<Number>>;
|
pub type SpecifiedFontVariationSettings = FontSettings<VariationValue<Number>>;
|
||||||
|
|
|
@ -51,7 +51,7 @@ pub use self::counters::{Content, ContentItem, CounterIncrement, CounterReset, C
|
||||||
pub use self::easing::TimingFunction;
|
pub use self::easing::TimingFunction;
|
||||||
pub use self::effects::{BoxShadow, Filter, SimpleShadow};
|
pub use self::effects::{BoxShadow, Filter, SimpleShadow};
|
||||||
pub use self::flex::FlexBasis;
|
pub use self::flex::FlexBasis;
|
||||||
pub use self::font::{FontFamily, FontLanguageOverride, FontStyle};
|
pub use self::font::{FontFamily, FontLanguageOverride, FontStyle, FontPalette};
|
||||||
pub use self::font::{FontFeatureSettings, FontVariantLigatures, FontVariantNumeric};
|
pub use self::font::{FontFeatureSettings, FontVariantLigatures, FontVariantNumeric};
|
||||||
pub use self::font::{FontSize, FontSizeAdjust, FontSizeKeyword, FontStretch, FontSynthesis};
|
pub use self::font::{FontSize, FontSizeAdjust, FontSizeKeyword, FontStretch, FontSynthesis};
|
||||||
pub use self::font::{FontVariantAlternates, FontWeight};
|
pub use self::font::{FontVariantAlternates, FontWeight};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue