From bcd8bbb1425eaf1bd8884a69355545d0978e8f06 Mon Sep 17 00:00:00 2001 From: minghuaw Date: Thu, 2 Oct 2025 05:54:12 +0800 Subject: [PATCH] fonts: Initial draft of synthetic bold face for FreeType (#39519) This is an initial attempt at implementing synthetic bold face for font families that lack actual bold faces. The overall approach borrowed implementations from Chromium and FireFox. WPT expectations will be updated after https://github.com/servo/stylo/pull/244 lands Testing: There are existing WPT testcases for font synthesis (`wpt/css/css-fonts/font-synthesis-*`) Depends on: https://github.com/servo/stylo/pull/244 --------- Signed-off-by: Minghua Wu Signed-off-by: minghuaw --- Cargo.lock | 24 ++-- components/fonts/font.rs | 24 +++- components/fonts/font_context.rs | 3 +- components/fonts/platform/freetype/font.rs | 85 +++++++++++++- components/fonts/platform/macos/font.rs | 2 + components/fonts/platform/windows/font.rs | 2 + components/fonts/tests/font.rs | 6 +- components/fonts/tests/font_context.rs | 4 +- components/fonts/tests/font_template.rs | 2 +- components/malloc_size_of/lib.rs | 1 + components/shared/fonts/font_descriptor.rs | 5 +- .../discrete-no-interpolation.html.ini | 105 ------------------ .../font-face-local-not-family.html.ini | 3 + .../css/css-fonts/font-synthesis-08.html.ini | 3 + .../font-synthesis-weight-binary.html.ini | 2 - ...ont-synthesis-weight-first-letter.html.ini | 2 - .../font-synthesis-weight-first-line.html.ini | 2 - .../css-fonts/font-synthesis-weight.html.ini | 2 - .../font-synthesis-weight-valid.html.ini | 6 - ...supported-properties-in-animation.html.ini | 3 - .../marker-supported-properties.html.ini | 3 - .../mozilla/meta/css/table_padding_a.html.ini | 3 + 22 files changed, 141 insertions(+), 151 deletions(-) create mode 100644 tests/wpt/meta/css/css-fonts/font-face-local-not-family.html.ini create mode 100644 tests/wpt/meta/css/css-fonts/font-synthesis-08.html.ini delete mode 100644 tests/wpt/meta/css/css-fonts/font-synthesis-weight-binary.html.ini delete mode 100644 tests/wpt/meta/css/css-fonts/font-synthesis-weight-first-letter.html.ini delete mode 100644 tests/wpt/meta/css/css-fonts/font-synthesis-weight-first-line.html.ini delete mode 100644 tests/wpt/meta/css/css-fonts/font-synthesis-weight.html.ini delete mode 100644 tests/wpt/meta/css/css-fonts/parsing/font-synthesis-weight-valid.html.ini create mode 100644 tests/wpt/mozilla/meta/css/table_padding_a.html.ini diff --git a/Cargo.lock b/Cargo.lock index 2cf1308c582..472cedb693f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7528,7 +7528,7 @@ dependencies = [ [[package]] name = "selectors" version = "0.31.0" -source = "git+https://github.com/servo/stylo?branch=2025-09-02#bb62b4e71c44fbb00f4657a1431282193e34d306" +source = "git+https://github.com/servo/stylo?branch=2025-09-02#d10ddece8ffe2310e09bf20062fc9c6b223d4fd8" dependencies = [ "bitflags 2.9.4", "cssparser", @@ -7861,7 +7861,7 @@ dependencies = [ [[package]] name = "servo_arc" version = "0.4.1" -source = "git+https://github.com/servo/stylo?branch=2025-09-02#bb62b4e71c44fbb00f4657a1431282193e34d306" +source = "git+https://github.com/servo/stylo?branch=2025-09-02#d10ddece8ffe2310e09bf20062fc9c6b223d4fd8" dependencies = [ "serde", "stable_deref_trait", @@ -8374,7 +8374,7 @@ dependencies = [ [[package]] name = "stylo" version = "0.7.0" -source = "git+https://github.com/servo/stylo?branch=2025-09-02#bb62b4e71c44fbb00f4657a1431282193e34d306" +source = "git+https://github.com/servo/stylo?branch=2025-09-02#d10ddece8ffe2310e09bf20062fc9c6b223d4fd8" dependencies = [ "app_units", "arrayvec", @@ -8431,7 +8431,7 @@ dependencies = [ [[package]] name = "stylo_atoms" version = "0.7.0" -source = "git+https://github.com/servo/stylo?branch=2025-09-02#bb62b4e71c44fbb00f4657a1431282193e34d306" +source = "git+https://github.com/servo/stylo?branch=2025-09-02#d10ddece8ffe2310e09bf20062fc9c6b223d4fd8" dependencies = [ "string_cache", "string_cache_codegen", @@ -8440,12 +8440,12 @@ dependencies = [ [[package]] name = "stylo_config" version = "0.7.0" -source = "git+https://github.com/servo/stylo?branch=2025-09-02#bb62b4e71c44fbb00f4657a1431282193e34d306" +source = "git+https://github.com/servo/stylo?branch=2025-09-02#d10ddece8ffe2310e09bf20062fc9c6b223d4fd8" [[package]] name = "stylo_derive" version = "0.7.0" -source = "git+https://github.com/servo/stylo?branch=2025-09-02#bb62b4e71c44fbb00f4657a1431282193e34d306" +source = "git+https://github.com/servo/stylo?branch=2025-09-02#d10ddece8ffe2310e09bf20062fc9c6b223d4fd8" dependencies = [ "darling", "proc-macro2", @@ -8457,7 +8457,7 @@ dependencies = [ [[package]] name = "stylo_dom" version = "0.7.0" -source = "git+https://github.com/servo/stylo?branch=2025-09-02#bb62b4e71c44fbb00f4657a1431282193e34d306" +source = "git+https://github.com/servo/stylo?branch=2025-09-02#d10ddece8ffe2310e09bf20062fc9c6b223d4fd8" dependencies = [ "bitflags 2.9.4", "stylo_malloc_size_of", @@ -8466,7 +8466,7 @@ dependencies = [ [[package]] name = "stylo_malloc_size_of" version = "0.7.0" -source = "git+https://github.com/servo/stylo?branch=2025-09-02#bb62b4e71c44fbb00f4657a1431282193e34d306" +source = "git+https://github.com/servo/stylo?branch=2025-09-02#d10ddece8ffe2310e09bf20062fc9c6b223d4fd8" dependencies = [ "app_units", "cssparser", @@ -8483,12 +8483,12 @@ dependencies = [ [[package]] name = "stylo_static_prefs" version = "0.7.0" -source = "git+https://github.com/servo/stylo?branch=2025-09-02#bb62b4e71c44fbb00f4657a1431282193e34d306" +source = "git+https://github.com/servo/stylo?branch=2025-09-02#d10ddece8ffe2310e09bf20062fc9c6b223d4fd8" [[package]] name = "stylo_traits" version = "0.7.0" -source = "git+https://github.com/servo/stylo?branch=2025-09-02#bb62b4e71c44fbb00f4657a1431282193e34d306" +source = "git+https://github.com/servo/stylo?branch=2025-09-02#d10ddece8ffe2310e09bf20062fc9c6b223d4fd8" dependencies = [ "app_units", "bitflags 2.9.4", @@ -8903,7 +8903,7 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "to_shmem" version = "0.2.0" -source = "git+https://github.com/servo/stylo?branch=2025-09-02#bb62b4e71c44fbb00f4657a1431282193e34d306" +source = "git+https://github.com/servo/stylo?branch=2025-09-02#d10ddece8ffe2310e09bf20062fc9c6b223d4fd8" dependencies = [ "cssparser", "servo_arc", @@ -8916,7 +8916,7 @@ dependencies = [ [[package]] name = "to_shmem_derive" version = "0.1.0" -source = "git+https://github.com/servo/stylo?branch=2025-09-02#bb62b4e71c44fbb00f4657a1431282193e34d306" +source = "git+https://github.com/servo/stylo?branch=2025-09-02#d10ddece8ffe2310e09bf20062fc9c6b223d4fd8" dependencies = [ "darling", "proc-macro2", diff --git a/components/fonts/font.rs b/components/fonts/font.rs index 543936db63b..c5b78737dfa 100644 --- a/components/fonts/font.rs +++ b/components/fonts/font.rs @@ -30,7 +30,7 @@ use style::properties::style_structs::Font as FontStyleStruct; use style::values::computed::font::{ FamilyName, FontFamilyNameSyntax, GenericFontFamily, SingleFontFamily, }; -use style::values::computed::{FontStretch, FontStyle, FontWeight}; +use style::values::computed::{FontStretch, FontStyle, FontSynthesis, FontWeight}; use unicode_script::Script; use webrender_api::{FontInstanceFlags, FontInstanceKey, FontVariation}; @@ -68,20 +68,25 @@ pub trait PlatformFontMethods: Sized { pt_size: Option, variations: &[FontVariation], data: &Option, + synthetic_bold: bool, ) -> Result { let template = template.borrow(); let font_identifier = template.identifier.clone(); match font_identifier { - FontIdentifier::Local(font_identifier) => { - Self::new_from_local_font_identifier(font_identifier, pt_size, variations) - }, + FontIdentifier::Local(font_identifier) => Self::new_from_local_font_identifier( + font_identifier, + pt_size, + variations, + synthetic_bold, + ), FontIdentifier::Web(_) => Self::new_from_data( font_identifier, data.as_ref() .expect("Should never create a web font without data."), pt_size, variations, + synthetic_bold, ), } } @@ -90,6 +95,7 @@ pub trait PlatformFontMethods: Sized { font_identifier: LocalFontIdentifier, pt_size: Option, variations: &[FontVariation], + synthetic_bold: bool, ) -> Result; fn new_from_data( @@ -97,6 +103,7 @@ pub trait PlatformFontMethods: Sized { data: &FontData, pt_size: Option, variations: &[FontVariation], + synthetic_bold: bool, ) -> Result; /// Get a [`FontTemplateDescriptor`] from a [`PlatformFont`]. This is used to get @@ -269,11 +276,20 @@ impl Font { data: Option, synthesized_small_caps: Option, ) -> Result { + let synthetic_bold = { + let is_bold = descriptor.weight >= FontWeight::BOLD_THRESHOLD; + let template_is_bold = template.descriptor().weight.0 >= FontWeight::BOLD_THRESHOLD; + let allows_synthetic_bold = matches!(descriptor.synthesis_weight, FontSynthesis::Auto); + + is_bold && !template_is_bold && allows_synthetic_bold + }; + let handle = PlatformFont::new_from_template( template.clone(), Some(descriptor.pt_size), &descriptor.variation_settings, &data, + synthetic_bold, )?; let metrics = handle.metrics(); diff --git a/components/fonts/font_context.rs b/components/fonts/font_context.rs index 345d045b61e..bf63c63ea4d 100644 --- a/components/fonts/font_context.rs +++ b/components/fonts/font_context.rs @@ -878,7 +878,8 @@ impl RemoteWebFontDownloader { let url: ServoUrl = self.url.clone().into(); let identifier = FontIdentifier::Web(url.clone()); - let Ok(handle) = PlatformFont::new_from_data(identifier, &font_data, None, &[]) else { + let Ok(handle) = PlatformFont::new_from_data(identifier, &font_data, None, &[], false) + else { return false; }; let state = self.take_state(); diff --git a/components/fonts/platform/freetype/font.rs b/components/fonts/platform/freetype/font.rs index 4dfca9cf7c3..67937e76621 100644 --- a/components/fonts/platform/freetype/font.rs +++ b/components/fonts/platform/freetype/font.rs @@ -9,9 +9,9 @@ use app_units::Au; use euclid::default::{Point2D, Rect, Size2D}; use fonts_traits::{FontIdentifier, FontTemplateDescriptor, LocalFontIdentifier}; use freetype_sys::{ - FT_F26Dot6, FT_Get_Char_Index, FT_Get_Kerning, FT_GlyphSlot, FT_KERNING_DEFAULT, - FT_LOAD_DEFAULT, FT_LOAD_NO_HINTING, FT_Load_Glyph, FT_Size_Metrics, FT_SizeRec, FT_UInt, - FT_ULong, FT_Vector, + FT_F26Dot6, FT_Get_Char_Index, FT_Get_Kerning, FT_GlyphSlot, FT_HAS_MULTIPLE_MASTERS, + FT_KERNING_DEFAULT, FT_LOAD_DEFAULT, FT_LOAD_NO_HINTING, FT_Load_Glyph, FT_Size_Metrics, + FT_SizeRec, FT_UInt, FT_ULong, FT_Vector, }; use log::debug; use memmap2::Mmap; @@ -56,6 +56,7 @@ pub struct PlatformFont { requested_face_size: Au, actual_face_size: Au, variations: Vec, + synthetic_bold: bool, /// A member that allows using `skrifa` to read values from this font. table_provider_data: FreeTypeFaceTableProviderData, @@ -67,6 +68,7 @@ impl PlatformFontMethods for PlatformFont { font_data: &FontData, requested_size: Option, variations: &[FontVariation], + mut synthetic_bold: bool, ) -> Result { let library = FreeTypeLibraryHandle::get().lock(); let data: &[u8] = font_data.as_ref(); @@ -79,12 +81,22 @@ impl PlatformFontMethods for PlatformFont { None => (Au::zero(), Au::zero()), }; + // Variable fonts, where the font designer has provided one or more axes of + // variation do not count as font synthesis and their use is not affected by + // the font-synthesis property. + // + // + if FT_HAS_MULTIPLE_MASTERS(face.as_ptr()) { + synthetic_bold = false; + } + Ok(PlatformFont { face: ReentrantMutex::new(face), requested_face_size, actual_face_size, table_provider_data: FreeTypeFaceTableProviderData::Web(font_data.clone()), variations: normalized_variations, + synthetic_bold, }) } @@ -92,6 +104,7 @@ impl PlatformFontMethods for PlatformFont { font_identifier: LocalFontIdentifier, requested_size: Option, variations: &[FontVariation], + mut synthetic_bold: bool, ) -> Result { let library = FreeTypeLibraryHandle::get().lock(); let filename = CString::new(&*font_identifier.path).expect("filename contains NUL byte!"); @@ -115,6 +128,15 @@ impl PlatformFontMethods for PlatformFont { return Err("Could not memory map"); }; + // Variable fonts, where the font designer has provided one or more axes of + // variation do not count as font synthesis and their use is not affected by + // the font-synthesis property. + // + // + if FT_HAS_MULTIPLE_MASTERS(face.as_ptr()) { + synthetic_bold = false; + } + Ok(PlatformFont { face: ReentrantMutex::new(face), requested_face_size, @@ -124,6 +146,7 @@ impl PlatformFontMethods for PlatformFont { font_identifier.index(), ), variations: normalized_variations, + synthetic_bold, }) } @@ -184,6 +207,10 @@ impl PlatformFontMethods for PlatformFont { let slot: FT_GlyphSlot = void_glyph; assert!(!slot.is_null()); + if self.synthetic_bold { + mozilla_glyphslot_embolden_less(slot); + } + let advance = unsafe { (*slot).metrics.horiAdvance }; Some(fixed_26_dot_6_to_float(advance) * self.unscalable_font_metrics_scale()) } @@ -358,7 +385,13 @@ impl PlatformFontMethods for PlatformFont { // On other platforms, we only pass this when we know that we are loading a font with // color characters, but not passing this flag simply *prevents* WebRender from // loading bitmaps. There's no harm to always passing it. - FontInstanceFlags::EMBEDDED_BITMAPS + let mut flags = FontInstanceFlags::EMBEDDED_BITMAPS; + + if self.synthetic_bold { + flags |= FontInstanceFlags::SYNTHETIC_BOLD; + } + + flags } fn variations(&self) -> &[FontVariation] { @@ -395,3 +428,47 @@ impl std::fmt::Debug for FreeTypeFaceTableProviderData { Ok(()) } } + +// This is copied from the webrender glyph rasterizer +// https://github.com/servo/webrender/blob/c4bd5b47d8f5cd684334b445e67a1f945d106848/wr_glyph_rasterizer/src/platform/unix/font.rs#L115 +// +// Custom version of FT_GlyphSlot_Embolden to be less aggressive with outline +// fonts than the default implementation in FreeType. +fn mozilla_glyphslot_embolden_less(slot: FT_GlyphSlot) { + use freetype_sys::{ + FT_GLYPH_FORMAT_OUTLINE, FT_GlyphSlot_Embolden, FT_Long, FT_MulFix, FT_Outline_Embolden, + }; + + if slot.is_null() { + return; + } + + let slot_ = unsafe { &mut *slot }; + let format = slot_.format; + if format != FT_GLYPH_FORMAT_OUTLINE { + // For non-outline glyphs, just fall back to FreeType's function. + unsafe { FT_GlyphSlot_Embolden(slot) }; + return; + } + + let face_ = unsafe { &*slot_.face }; + + // FT_GlyphSlot_Embolden uses a divisor of 24 here; we'll be only half as + // bold. + let size_ = unsafe { &*face_.size }; + let strength = unsafe { FT_MulFix(face_.units_per_EM as FT_Long, size_.metrics.y_scale) / 48 }; + unsafe { FT_Outline_Embolden(&raw mut slot_.outline, strength) }; + + // Adjust metrics to suit the fattened glyph. + if slot_.advance.x != 0 { + slot_.advance.x += strength; + } + if slot_.advance.y != 0 { + slot_.advance.y += strength; + } + slot_.metrics.width += strength; + slot_.metrics.height += strength; + slot_.metrics.horiAdvance += strength; + slot_.metrics.vertAdvance += strength; + slot_.metrics.horiBearingY += strength; +} diff --git a/components/fonts/platform/macos/font.rs b/components/fonts/platform/macos/font.rs index 206e3c9b15e..3d64b2d8d6e 100644 --- a/components/fonts/platform/macos/font.rs +++ b/components/fonts/platform/macos/font.rs @@ -214,6 +214,7 @@ impl PlatformFontMethods for PlatformFont { data: &FontData, requested_size: Option, variations: &[FontVariation], + _synthetic_bold: bool, ) -> Result { Self::new(font_identifier, Some(data), requested_size, variations) } @@ -222,6 +223,7 @@ impl PlatformFontMethods for PlatformFont { font_identifier: LocalFontIdentifier, requested_size: Option, variations: &[FontVariation], + _synthetic_bold: bool, ) -> Result { Self::new( FontIdentifier::Local(font_identifier), diff --git a/components/fonts/platform/windows/font.rs b/components/fonts/platform/windows/font.rs index 09183b6700e..32147927ebe 100644 --- a/components/fonts/platform/windows/font.rs +++ b/components/fonts/platform/windows/font.rs @@ -158,6 +158,7 @@ impl PlatformFontMethods for PlatformFont { data: &FontData, pt_size: Option, variations: &[FontVariation], + _synthetic_bold: bool, ) -> Result { let font_face = FontFile::new_from_buffer(Arc::new(data.clone())) .ok_or("Could not create FontFile")? @@ -170,6 +171,7 @@ impl PlatformFontMethods for PlatformFont { font_identifier: LocalFontIdentifier, pt_size: Option, variations: &[FontVariation], + _synthetic_bold: bool, ) -> Result { let font_face = FontCollection::system() .font_from_descriptor(&font_identifier.font_descriptor) diff --git a/components/fonts/tests/font.rs b/components/fonts/tests/font.rs index 6b102b79981..2b25ae92b30 100644 --- a/components/fonts/tests/font.rs +++ b/components/fonts/tests/font.rs @@ -15,7 +15,7 @@ use fonts::{ }; use servo_url::ServoUrl; use style::properties::longhands::font_variant_caps::computed_value::T as FontVariantCaps; -use style::values::computed::{FontStretch, FontStyle, FontWeight}; +use style::values::computed::{FontStretch, FontStyle, FontSynthesis, FontWeight}; use unicode_script::Script; fn make_font(path: PathBuf) -> Font { @@ -27,7 +27,8 @@ fn make_font(path: PathBuf) -> Font { let data = FontData::from_bytes(&bytes); let identifier = FontIdentifier::Web(ServoUrl::from_file_path(path).unwrap()); - let platform_font = PlatformFont::new_from_data(identifier.clone(), &data, None, &[]).unwrap(); + let platform_font = + PlatformFont::new_from_data(identifier.clone(), &data, None, &[], false).unwrap(); let template = FontTemplate { identifier, @@ -41,6 +42,7 @@ fn make_font(path: PathBuf) -> Font { variant: FontVariantCaps::Normal, pt_size: Au::from_px(24), variation_settings: vec![], + synthesis_weight: FontSynthesis::Auto, }; Font::new(FontTemplateRef::new(template), descriptor, Some(data), None).unwrap() } diff --git a/components/fonts/tests/font_context.rs b/components/fonts/tests/font_context.rs index d91f09d83c3..d3475855708 100644 --- a/components/fonts/tests/font_context.rs +++ b/components/fonts/tests/font_context.rs @@ -32,7 +32,7 @@ mod font_context { use style::properties::style_structs::Font as FontStyleStruct; use style::values::computed::font::{ FamilyName, FontFamily, FontFamilyList, FontFamilyNameSyntax, FontStretch, FontStyle, - FontWeight, SingleFontFamily, + FontSynthesis, FontWeight, SingleFontFamily, }; use stylo_atoms::Atom; use webrender_api::{FontInstanceKey, FontKey, IdNamespace}; @@ -190,6 +190,7 @@ mod font_context { local_font_identifier.clone(), None, &[], + false, ) .expect("Could not load test font"); @@ -355,6 +356,7 @@ mod font_context { variant: FontVariantCaps::Normal, pt_size: Au(10), variation_settings: vec![], + synthesis_weight: FontSynthesis::Auto, }; let family = SingleFontFamily::FamilyName(FamilyName { diff --git a/components/fonts/tests/font_template.rs b/components/fonts/tests/font_template.rs index 3fa32222931..375172f3aaa 100644 --- a/components/fonts/tests/font_template.rs +++ b/components/fonts/tests/font_template.rs @@ -36,7 +36,7 @@ fn test_font_template_descriptor() { .unwrap(); let data = FontData::from_bytes(&bytes); - let handle = PlatformFont::new_from_data(identifier, &data, None, &[]).unwrap(); + let handle = PlatformFont::new_from_data(identifier, &data, None, &[], false).unwrap(); handle.descriptor() } diff --git a/components/malloc_size_of/lib.rs b/components/malloc_size_of/lib.rs index a4024505432..2770f501b82 100644 --- a/components/malloc_size_of/lib.rs +++ b/components/malloc_size_of/lib.rs @@ -934,6 +934,7 @@ malloc_size_of_is_stylo_malloc_size_of!(style::values::computed::font::SingleFon malloc_size_of_is_stylo_malloc_size_of!(style::values::computed::JustifyContent); malloc_size_of_is_stylo_malloc_size_of!(style::values::specified::align::AlignFlags); malloc_size_of_is_stylo_malloc_size_of!(style::values::specified::box_::Overflow); +malloc_size_of_is_stylo_malloc_size_of!(style::values::specified::font::FontSynthesis); malloc_size_of_is_stylo_malloc_size_of!(style::values::specified::TextDecorationLine); malloc_size_of_is_stylo_malloc_size_of!(stylo_dom::ElementState); diff --git a/components/shared/fonts/font_descriptor.rs b/components/shared/fonts/font_descriptor.rs index d5d3b05ceb3..2ce665c4e05 100644 --- a/components/shared/fonts/font_descriptor.rs +++ b/components/shared/fonts/font_descriptor.rs @@ -10,7 +10,7 @@ use style::computed_values::font_variant_caps; use style::font_face::{FontFaceRuleData, FontStyle as FontFaceStyle}; use style::properties::style_structs::Font as FontStyleStruct; use style::values::computed::font::{FixedPoint, FontStyleFixedPoint}; -use style::values::computed::{Au, FontStretch, FontStyle, FontWeight}; +use style::values::computed::{Au, FontStretch, FontStyle, FontSynthesis, FontWeight}; use style::values::specified::FontStretch as SpecifiedFontStretch; use webrender_api::FontVariation; @@ -26,6 +26,7 @@ pub struct FontDescriptor { pub variant: font_variant_caps::T, pub pt_size: Au, pub variation_settings: Vec, + pub synthesis_weight: FontSynthesis, } impl Eq for FontDescriptor {} @@ -41,6 +42,7 @@ impl<'a> From<&'a FontStyleStruct> for FontDescriptor { value: setting.value, }) .collect(); + let synthesis_weight = style.clone_font_synthesis_weight(); FontDescriptor { weight: style.font_weight, stretch: style.font_stretch, @@ -48,6 +50,7 @@ impl<'a> From<&'a FontStyleStruct> for FontDescriptor { variant: style.font_variant_caps, pt_size: Au::from_f32_px(style.font_size.computed_size().px()), variation_settings, + synthesis_weight, } } } diff --git a/tests/wpt/meta/css/css-fonts/discrete-no-interpolation.html.ini b/tests/wpt/meta/css/css-fonts/discrete-no-interpolation.html.ini index dacca19140b..f4e6aa15f1f 100644 --- a/tests/wpt/meta/css/css-fonts/discrete-no-interpolation.html.ini +++ b/tests/wpt/meta/css/css-fonts/discrete-no-interpolation.html.ini @@ -542,60 +542,6 @@ [CSS Transitions: property from [initial\] to [none\] at (0.3) should be [initial\]] expected: FAIL - [CSS Transitions: property from [initial\] to [none\] at (0.5) should be [none\]] - expected: FAIL - - [CSS Transitions: property from [initial\] to [none\] at (0.6) should be [none\]] - expected: FAIL - - [CSS Transitions: property from [initial\] to [none\] at (1) should be [none\]] - expected: FAIL - - [CSS Transitions: property from [initial\] to [none\] at (1.5) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property from [initial\] to [none\] at (-0.3) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property from [initial\] to [none\] at (0) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property from [initial\] to [none\] at (0.3) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property from [initial\] to [none\] at (0.5) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property from [initial\] to [none\] at (0.6) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property from [initial\] to [none\] at (1) should be [none\]] - expected: FAIL - - [CSS Transitions with transition: all: property from [initial\] to [none\] at (1.5) should be [none\]] - expected: FAIL - - [CSS Animations: property from [initial\] to [none\] at (-0.3) should be [initial\]] - expected: FAIL - - [CSS Animations: property from [initial\] to [none\] at (0) should be [initial\]] - expected: FAIL - - [CSS Animations: property from [initial\] to [none\] at (0.3) should be [initial\]] - expected: FAIL - - [CSS Animations: property from [initial\] to [none\] at (0.5) should be [none\]] - expected: FAIL - - [CSS Animations: property from [initial\] to [none\] at (0.6) should be [none\]] - expected: FAIL - - [CSS Animations: property from [initial\] to [none\] at (1) should be [none\]] - expected: FAIL - - [CSS Animations: property from [initial\] to [none\] at (1.5) should be [none\]] - expected: FAIL - [Web Animations: property from [initial\] to [none\] at (-0.3) should be [initial\]] expected: FAIL @@ -1133,15 +1079,6 @@ [CSS Transitions: property from [initial\] to [none\] at (0.3) should be [none\]] expected: FAIL - [CSS Transitions: property from [initial\] to [none\] at (-0.3) should be [none\]] - expected: FAIL - - [CSS Transitions: property from [initial\] to [none\] at (0) should be [none\]] - expected: FAIL - - [CSS Transitions: property from [initial\] to [none\] at (0.3) should be [none\]] - expected: FAIL - [CSS Transitions: property from [initial\] to [historical-forms\] at (-0.3) should be [historical-forms\]] expected: FAIL @@ -1397,48 +1334,6 @@ [CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial\] to [none\] at (1.5) should be [none\]] expected: FAIL - [CSS Transitions with transition-behavior:allow-discrete: property from [initial\] to [none\] at (-0.3) should be [initial\]] - expected: FAIL - - [CSS Transitions with transition-behavior:allow-discrete: property from [initial\] to [none\] at (0) should be [initial\]] - expected: FAIL - - [CSS Transitions with transition-behavior:allow-discrete: property from [initial\] to [none\] at (0.3) should be [initial\]] - expected: FAIL - - [CSS Transitions with transition-behavior:allow-discrete: property from [initial\] to [none\] at (0.5) should be [none\]] - expected: FAIL - - [CSS Transitions with transition-behavior:allow-discrete: property from [initial\] to [none\] at (0.6) should be [none\]] - expected: FAIL - - [CSS Transitions with transition-behavior:allow-discrete: property from [initial\] to [none\] at (1) should be [none\]] - expected: FAIL - - [CSS Transitions with transition-behavior:allow-discrete: property from [initial\] to [none\] at (1.5) should be [none\]] - expected: FAIL - - [CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial\] to [none\] at (-0.3) should be [initial\]] - expected: FAIL - - [CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial\] to [none\] at (0) should be [initial\]] - expected: FAIL - - [CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial\] to [none\] at (0.3) should be [initial\]] - expected: FAIL - - [CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial\] to [none\] at (0.5) should be [none\]] - expected: FAIL - - [CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial\] to [none\] at (0.6) should be [none\]] - expected: FAIL - - [CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial\] to [none\] at (1) should be [none\]] - expected: FAIL - - [CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property from [initial\] to [none\] at (1.5) should be [none\]] - expected: FAIL - [CSS Transitions with transition-behavior:allow-discrete: property from [initial\] to [historical-forms\] at (-0.3) should be [initial\]] expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/font-face-local-not-family.html.ini b/tests/wpt/meta/css/css-fonts/font-face-local-not-family.html.ini new file mode 100644 index 00000000000..c04b3323c50 --- /dev/null +++ b/tests/wpt/meta/css/css-fonts/font-face-local-not-family.html.ini @@ -0,0 +1,3 @@ +[font-face-local-not-family.html] + expected: + if os == "linux": FAIL diff --git a/tests/wpt/meta/css/css-fonts/font-synthesis-08.html.ini b/tests/wpt/meta/css/css-fonts/font-synthesis-08.html.ini new file mode 100644 index 00000000000..c86f3eff080 --- /dev/null +++ b/tests/wpt/meta/css/css-fonts/font-synthesis-08.html.ini @@ -0,0 +1,3 @@ +[font-synthesis-08.html] + expected: + if os == "linux": FAIL diff --git a/tests/wpt/meta/css/css-fonts/font-synthesis-weight-binary.html.ini b/tests/wpt/meta/css/css-fonts/font-synthesis-weight-binary.html.ini deleted file mode 100644 index 77beaa29a31..00000000000 --- a/tests/wpt/meta/css/css-fonts/font-synthesis-weight-binary.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[font-synthesis-weight-binary.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/font-synthesis-weight-first-letter.html.ini b/tests/wpt/meta/css/css-fonts/font-synthesis-weight-first-letter.html.ini deleted file mode 100644 index 72b475bb5f6..00000000000 --- a/tests/wpt/meta/css/css-fonts/font-synthesis-weight-first-letter.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[font-synthesis-weight-first-letter.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/font-synthesis-weight-first-line.html.ini b/tests/wpt/meta/css/css-fonts/font-synthesis-weight-first-line.html.ini deleted file mode 100644 index 30c2eb45546..00000000000 --- a/tests/wpt/meta/css/css-fonts/font-synthesis-weight-first-line.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[font-synthesis-weight-first-line.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/font-synthesis-weight.html.ini b/tests/wpt/meta/css/css-fonts/font-synthesis-weight.html.ini deleted file mode 100644 index fde76f46330..00000000000 --- a/tests/wpt/meta/css/css-fonts/font-synthesis-weight.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[font-synthesis-weight.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-fonts/parsing/font-synthesis-weight-valid.html.ini b/tests/wpt/meta/css/css-fonts/parsing/font-synthesis-weight-valid.html.ini deleted file mode 100644 index e904a1a8f54..00000000000 --- a/tests/wpt/meta/css/css-fonts/parsing/font-synthesis-weight-valid.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[font-synthesis-weight-valid.html] - [e.style['font-synthesis-weight'\] = "auto" should set the property value] - expected: FAIL - - [e.style['font-synthesis-weight'\] = "none" should set the property value] - expected: FAIL diff --git a/tests/wpt/meta/css/css-pseudo/parsing/marker-supported-properties-in-animation.html.ini b/tests/wpt/meta/css/css-pseudo/parsing/marker-supported-properties-in-animation.html.ini index 7fa1ec08034..51d4af2e4b1 100644 --- a/tests/wpt/meta/css/css-pseudo/parsing/marker-supported-properties-in-animation.html.ini +++ b/tests/wpt/meta/css/css-pseudo/parsing/marker-supported-properties-in-animation.html.ini @@ -146,9 +146,6 @@ [Transition of font-synthesis-style in ::marker] expected: FAIL - [Transition of font-synthesis-weight in ::marker] - expected: FAIL - [Transition of font-variant in ::marker] expected: FAIL diff --git a/tests/wpt/meta/css/css-pseudo/parsing/marker-supported-properties.html.ini b/tests/wpt/meta/css/css-pseudo/parsing/marker-supported-properties.html.ini index 04bf02b0126..0a385efea80 100644 --- a/tests/wpt/meta/css/css-pseudo/parsing/marker-supported-properties.html.ini +++ b/tests/wpt/meta/css/css-pseudo/parsing/marker-supported-properties.html.ini @@ -17,9 +17,6 @@ [Property font-synthesis-style value 'none' in ::marker] expected: FAIL - [Property font-synthesis-weight value 'none' in ::marker] - expected: FAIL - [Property font-variant-east-asian value 'full-width' in ::marker] expected: FAIL diff --git a/tests/wpt/mozilla/meta/css/table_padding_a.html.ini b/tests/wpt/mozilla/meta/css/table_padding_a.html.ini new file mode 100644 index 00000000000..53de21b879e --- /dev/null +++ b/tests/wpt/mozilla/meta/css/table_padding_a.html.ini @@ -0,0 +1,3 @@ +[table_padding_a.html] + expected: + if os == "linux": FAIL