mirror of
https://github.com/servo/servo.git
synced 2025-09-29 16:19:14 +01:00
fonts: Implement CSS font-variation-settings
property for FreeType platforms (#38642)
This change adds support for variable fonts via the [`font-variation-settings`](https://developer.mozilla.org/en-US/docs/Web/CSS/font-variation-settings) property. There are three areas where we need to set the variation values: * Webrender (`compositor.rs`), for drawing the glyphs * Harfbuzz (`shaper.rs`), for most shaping tasks * PlatformFont (`fonts/platform/`), for horizontal advances and kerning For now, freetype is the only platform shaper that supports variable fonts. I can't easily test the fonts with non-freetype shapers. Thats why variable fonts are behind the `layout_variable_fonts_enabled` pref, which is disabled by default. <img width="1250" height="710" alt="image" src="https://github.com/user-attachments/assets/1aee1407-f3a2-42f6-a106-af0443fcd588" /> <details><summary>HTML test file</summary> ```html <style> @font-face { font-family: "Amstelvar VF"; src: url("https://mdn.github.io/shared-assets/fonts/variable-fonts/AmstelvarAlpha-VF.woff2") format("woff2-variations"); font-weight: 300 900; font-stretch: 35% 100%; font-style: normal; font-display: swap; } p { font: 1.2em "Amstelvar VF", Georgia, serif; font-size: 4rem; margin: 1rem; display: inline-block; } .p1 { font-variation-settings: "wght" 300; } .p2 { font-variation-settings: "wght" 625; } .p3 { font-variation-settings: "wght" 900; } </style> <div> <p class="p1">Weight</p> <span>(font-variation-settings: "wght" 300)</span> </div> <div> <p class="p2">Weight</p> <span>(font-variation-settings: "wght" 625)</span> </div> <div> <p class="p3">Weight</p> <span>(font-variation-settings: "wght" 900)</span> </div> </div> ``` </details> https://github.com/user-attachments/assets/9e21101a-796a-49fe-b82c-8999d8fa9ee1 Testing: Needs decision on whether we want to enable the pref in CI Works towards https://github.com/servo/servo/issues/37236 Depends on https://github.com/servo/stylo/pull/230 --------- Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
This commit is contained in:
parent
ce16fbce75
commit
7471ad7730
19 changed files with 274 additions and 79 deletions
|
@ -27,7 +27,7 @@ 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, &[]).unwrap();
|
||||
|
||||
let template = FontTemplate {
|
||||
identifier,
|
||||
|
@ -40,6 +40,7 @@ fn make_font(path: PathBuf) -> Font {
|
|||
style: FontStyle::normal(),
|
||||
variant: FontVariantCaps::Normal,
|
||||
pt_size: Au::from_px(24),
|
||||
variation_settings: vec![],
|
||||
};
|
||||
Font::new(FontTemplateRef::new(template), descriptor, Some(data), None).unwrap()
|
||||
}
|
||||
|
|
|
@ -133,7 +133,7 @@ mod font_context {
|
|||
);
|
||||
},
|
||||
SystemFontServiceMessage::GetFontInstanceKey(result_sender) |
|
||||
SystemFontServiceMessage::GetFontInstance(_, _, _, result_sender) => {
|
||||
SystemFontServiceMessage::GetFontInstance(_, _, _, _, result_sender) => {
|
||||
let _ = result_sender.send(FontInstanceKey(IdNamespace(0), 0));
|
||||
},
|
||||
SystemFontServiceMessage::GetFontKey(result_sender) => {
|
||||
|
@ -187,9 +187,12 @@ mod font_context {
|
|||
path: path.to_str().expect("Could not load test font").into(),
|
||||
variation_index: 0,
|
||||
};
|
||||
let handle =
|
||||
PlatformFont::new_from_local_font_identifier(local_font_identifier.clone(), None)
|
||||
.expect("Could not load test font");
|
||||
let handle = PlatformFont::new_from_local_font_identifier(
|
||||
local_font_identifier.clone(),
|
||||
None,
|
||||
&[],
|
||||
)
|
||||
.expect("Could not load test font");
|
||||
|
||||
family.add_template(FontTemplate::new(
|
||||
FontIdentifier::Local(local_font_identifier),
|
||||
|
@ -352,6 +355,7 @@ mod font_context {
|
|||
style: FontStyle::normal(),
|
||||
variant: FontVariantCaps::Normal,
|
||||
pt_size: Au(10),
|
||||
variation_settings: vec![],
|
||||
};
|
||||
|
||||
let family = SingleFontFamily::FamilyName(FamilyName {
|
||||
|
|
|
@ -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, &[]).unwrap();
|
||||
handle.descriptor()
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue