-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Apply preferred font weight when loading variable fonts #7790
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Previously, the `FontData::weight()` method stored the preferred weight but it was never applied to the actual font rendering. This change uses the weight value to configure skrifa's Location for the 'wght' axis, enabling proper variable font weight control in text rendering.
|
Preview available at https://egui-pr-preview.github.io/pr/7790-featurefont-weight-0333 View snapshot changes at kitdiff |
When loading variable fonts in egui, the first available weight was selected instead of the font’s default weight, making it impossible to control the rendered weight. This change applies the preferred weight (or the font’s default value) to the `wght` axis, ensuring variable fonts are rendered with the intended weight. Related PR: emilk/egui#7790
emilk
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice - thanks!
|
@emilk https://github.com/emilk/egui/pull/7790/files#diff-476cc9a474dfda61ceeb981bd3ea229a1ab4eb65330e74c0128ce257236938c9R177-R187 Ideally, it would be better to include a variable font directly in the source tree and add That said, adding variable fonts would significantly increase the source tree size, |
Previously, when loading a variable font (e.g. via `egui::FontData::from_static`), the font was rendered using the default (often the lightest) weight, ignoring any preferred weight configuration. This change applies the specified weight to skrifa's `Location` for the `wght` axis, ensuring that variable fonts are rendered with the intended font weight. ## Summary Fixes variable font weight not being applied during rendering. The `FontData::weight()` method now properly configures the font variation axis. ## Changes - Add `location: Location` field to `FontFace` to store variation coordinates - Pass `location` parameter through to glyph rendering functions - Apply weight to skrifa's `LocationRef` in `DrawSettings` and `HintingInstance` ## Weight Priority 1. `preferred_weight` from `FontData::weight()` 2. OS/2 table's `us_weight_class` 3. Variable font's fvar default value 4. `Location::default()` ## Related Issue - emilk#3218 : Not follow font id, but goal would be same ## Todo * [x] Apply preferred font weight when loading variable fonts * [ ] Add small size variable fonts for docs and egui (need discussion)
|
I'm a bit confused by this PR. When will a variable font's default weight be the "lightest" one? By definition, the default value for any axis should be mapped to 0.0 in variation space, which is what Skrifa uses if you don't specify any coordinates. This PR changes the font loading process to use the weight value from the OS/2 table if present, but falls back to the default Can you give examples of variable fonts that default to the lightest weight? Are they fixed if you use the weight from the OS/2 table, or do you still need to manually override the weight when loading them? |
After re-examining the OS/2 table, I confirmed that these fonts have That said, there are still cases where manually overriding the font weight is necessary. const FONT_NTSANS: BuiltInFonts = BuiltInFonts {
name: "Noto Sans",
data: include_bytes!("../../assets/fonts/NotoSansJP[wght].ttf"),
};
// Demonstrates how to replace all fonts.
pub(crate) fn replace_fonts(ctx: &egui::Context) {
let mut fonts = egui::FontDefinitions::default();
fonts.font_data.insert(
FONT_NTSANS.name.to_owned(),
std::sync::Arc::new(egui::FontData::from_static(FONT_NTSANS.data).weight(400)),
);
ctx.set_fonts(fonts);
} |
* Closes N/A * [x] I have followed the instructions in the PR template This appears to have snuck in as part of #7790, which claimed to only be a bugfix but introduced a new `font_weight` method. I believe there's no way to access the method from *public* code since it's only defined on `FontsImpl`, not the public-facing `FontsView`. It's also not used *privately* in epaint, meaning it's completely dead code. Even if we *do* want some sort of future API for getting a font's weight, it requires more consideration. For instance, this API will return the default weight for variable fonts, which is not documented anywhere and might not be what we want.

Previously, when loading a variable font (e.g. via
egui::FontData::from_static),the font was rendered using the default (often the lightest) weight,
ignoring any preferred weight configuration.
This change applies the specified weight to skrifa's
Locationfor thewghtaxis,ensuring that variable fonts are rendered with the intended font weight.
Summary
Fixes variable font weight not being applied during rendering. The
FontData::weight()method now properly configures the font variation axis.Changes
location: Locationfield toFontFaceto store variation coordinateslocationparameter through to glyph rendering functionsLocationRefinDrawSettingsandHintingInstanceWeight Priority
preferred_weightfromFontData::weight()us_weight_classLocation::default()Related Issue
Todo