Replace ab_glyph with Skrifa + vello_cpu; enable font hinting#7694
Replace ab_glyph with Skrifa + vello_cpu; enable font hinting#7694emilk merged 16 commits intoemilk:mainfrom
Conversation
|
Preview available at https://egui-pr-preview.github.io/pr/7694-skrifa View snapshot changes at kitdiff |
|
I'm very excited for this! The readability improvements of the font hinting is pretty big imho. Also: colored emojis unlocked??? Before we merge I want to make sure we measure what impact this has on the .wasm blob size ( |
|
Regarding the quality of the rendering, I have found that adding "font embolden" (aka stem darkening) to the skrifa-based renderers is (subjectively) a big additional improvement, at least on macOS (by tweaking the embolden parameter I can make the rendering very close if not identical to Skia/Chrome). There's no implementation for |
|
Hey I just wanted to throw a vote behind this. Is there something blocking we at @tritium-legal can help with? Hinting on normal DPI platforms just makes a massive difference. |
|
wasm size on so +600kB. I think that's well acceptable. |
| checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" | ||
| dependencies = [ | ||
| "kurbo", | ||
| "kurbo 0.11.1", |
There was a problem hiding this comment.
It's a shame we get a duplicate kurbo because of resvg, and resvg hasn't had a crate release in over 8 months :/
There was a problem hiding this comment.
We can fix that. I am working on a round of releases this month.
|
All snapshots look good |
|
I encourage everyone to follow this link to experience the improvements: https://rerun-io.github.io/kitdiff/?url=https://github.com/emilk/egui/pull/7694 |
- Followup to #7694 - Disables the `traversal` feature of `skrifa` which is not needed except internally by the fontations project - Should save a little compile time, and possibly some binary size. Signed-off-by: Nico Burns <[email protected]>
This adds support for rendering color emoji in egui via a new opt-in `egui_noto_emoji` crate that bundles Noto Color Emoji sprites. Key features: - New `GlyphColoring` enum to distinguish color vs monochrome glyphs - Color glyphs bypass text tinting and render with original colors - Minimal API: `Context::register_color_glyph[_arc]` methods - Atlas persistence: color glyphs survive font atlas rebuilds - Deferred registration: glyphs registered before fonts init are queued The implementation addresses feedback from PR emilk#7333 and emilk#7707: - Fixes tinting problem (color glyphs not affected by text color) - Handles atlas repopulation when fonts are recreated - Aligns with skrifa+vello_cpu font backend (PR emilk#7694) - Minimal API surface as suggested by @lucasmerlin Co-Authored-By: Claude Opus 4.5 <[email protected]>
…7694) <!-- Please read the "Making a PR" section of [`CONTRIBUTING.md`](https://github.com/emilk/egui/blob/main/CONTRIBUTING.md) before opening a Pull Request! * Keep your PR:s small and focused. * The PR title is what ends up in the changelog, so make it descriptive! * If applicable, add a screenshot or gif. * If it is a non-trivial addition, consider adding a demo for it to `egui_demo_lib`, or a new example. * Do NOT open PR:s from your `master` branch, as that makes it hard for maintainers to test and add commits to your PR. * Remember to run `cargo fmt` and `cargo clippy`. * Open the PR as a draft until you have self-reviewed it and run `./scripts/check.sh`. * When you have addressed a PR comment, mark it as resolved. Please be patient! I will review your PR, but my time is limited! --> * Closes N/A * [x] I have followed the instructions in the PR template I'll probably come back to this and clean it up a bit. This PR reimplements ab_glyph's functionality on top of Skrifa, a somewhat lower-level font API that's being used in Chrome now. Skrifa doesn't perform rasterization itself, so I'm using [vello_cpu](https://github.com/linebender/vello) from the Linebender project for rasterization. It's still in its early days, but I believe it's already quite fast. It also supports color and gradient fills, so color emoji support will be easier. Skrifa also supports font hinting, which should make text look a bit nicer / less blurry. Here's the current ab_glyph rendering: <img width="1592" height="1068" alt="image" src="https://github.com/user-attachments/assets/2385b66e-23f8-4c6e-b8c2-ea90e0eea4e4" /> Here's Skrifa *without* hinting--it looks almost identical, but there are some subpixel differences, probably due to rasterizer behavior: <img width="1592" height="1068" alt="image" src="https://github.com/user-attachments/assets/a815f3e9-65ac-4940-bc00-571177bef53d" /> Here's Skrifa *with* hinting: <img width="1592" height="1068" alt="image" src="https://github.com/user-attachments/assets/d6cc0669-3537-4377-bba9-ed5ef09664db" /> Hinting does make the horizontal strokes look a bit bolder, which makes me wonder once again about increasing the font weight from "light" to "regular". --------- Co-authored-by: Emil Ernerfeldt <[email protected]>
- Followup to emilk#7694 - Disables the `traversal` feature of `skrifa` which is not needed except internally by the fontations project - Should save a little compile time, and possibly some binary size. Signed-off-by: Nico Burns <[email protected]>
I'll probably come back to this and clean it up a bit. This PR reimplements ab_glyph's functionality on top of Skrifa, a somewhat lower-level font API that's being used in Chrome now.
Skrifa doesn't perform rasterization itself, so I'm using vello_cpu from the Linebender project for rasterization. It's still in its early days, but I believe it's already quite fast. It also supports color and gradient fills, so color emoji support will be easier.
Skrifa also supports font hinting, which should make text look a bit nicer / less blurry.
Here's the current ab_glyph rendering:
Here's Skrifa without hinting--it looks almost identical, but there are some subpixel differences, probably due to rasterizer behavior:
Here's Skrifa with hinting:
Hinting does make the horizontal strokes look a bit bolder, which makes me wonder once again about increasing the font weight from "light" to "regular".