mirror of
https://github.com/servo/servo.git
synced 2025-09-29 16:19:14 +01:00
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>
74 lines
2.2 KiB
Rust
74 lines
2.2 KiB
Rust
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
|
|
// Test doesn't yet run on Mac, see https://github.com/servo/servo/pull/19928 for explanation.
|
|
#[cfg(not(target_os = "macos"))]
|
|
#[test]
|
|
fn test_font_template_descriptor() {
|
|
use std::fs::File;
|
|
use std::io::prelude::*;
|
|
use std::path::PathBuf;
|
|
|
|
use fonts::platform::font::PlatformFont;
|
|
use fonts::{FontData, FontIdentifier, FontTemplateDescriptor, PlatformFontMethods};
|
|
use servo_url::ServoUrl;
|
|
use style::values::computed::font::{FontStretch, FontStyle, FontWeight};
|
|
|
|
fn descriptor(filename: &str) -> FontTemplateDescriptor {
|
|
let mut path: PathBuf = [
|
|
env!("CARGO_MANIFEST_DIR"),
|
|
"tests",
|
|
"support",
|
|
"dejavu-fonts-ttf-2.37",
|
|
"ttf",
|
|
]
|
|
.iter()
|
|
.collect();
|
|
path.push(format!("{}.ttf", filename));
|
|
|
|
let identifier = FontIdentifier::Web(ServoUrl::from_file_path(path.clone()).unwrap());
|
|
|
|
let mut bytes = Vec::new();
|
|
File::open(path.clone())
|
|
.expect("Couldn't open font file!")
|
|
.read_to_end(&mut bytes)
|
|
.unwrap();
|
|
let data = FontData::from_bytes(&bytes);
|
|
|
|
let handle = PlatformFont::new_from_data(identifier, &data, None, &[]).unwrap();
|
|
handle.descriptor()
|
|
}
|
|
|
|
assert_eq!(
|
|
descriptor("DejaVuSans"),
|
|
FontTemplateDescriptor::new(
|
|
FontWeight::NORMAL,
|
|
FontStretch::hundred(),
|
|
FontStyle::NORMAL,
|
|
)
|
|
);
|
|
|
|
assert_eq!(
|
|
descriptor("DejaVuSans-Bold"),
|
|
FontTemplateDescriptor::new(FontWeight::BOLD, FontStretch::hundred(), FontStyle::NORMAL,)
|
|
);
|
|
|
|
assert_eq!(
|
|
descriptor("DejaVuSans-Oblique"),
|
|
FontTemplateDescriptor::new(
|
|
FontWeight::NORMAL,
|
|
FontStretch::hundred(),
|
|
FontStyle::ITALIC,
|
|
)
|
|
);
|
|
|
|
assert_eq!(
|
|
descriptor("DejaVuSansCondensed-BoldOblique"),
|
|
FontTemplateDescriptor::new(
|
|
FontWeight::BOLD,
|
|
FontStretch::from_percentage(0.875),
|
|
FontStyle::ITALIC,
|
|
)
|
|
);
|
|
}
|