From 46d57b00b58afefa8ed93e74655e43268571dcce Mon Sep 17 00:00:00 2001 From: cAttte <26514199+cAttte@users.noreply.github.com> Date: Wed, 11 Jun 2025 11:42:57 -0300 Subject: [PATCH] Warn when using variable fonts (#6425) --- crates/typst-library/src/text/font/book.rs | 3 +++ crates/typst-library/src/text/mod.rs | 18 +++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/crates/typst-library/src/text/font/book.rs b/crates/typst-library/src/text/font/book.rs index cd90a08fe..d0c821b39 100644 --- a/crates/typst-library/src/text/font/book.rs +++ b/crates/typst-library/src/text/font/book.rs @@ -196,6 +196,8 @@ bitflags::bitflags! { const SERIF = 1 << 1; /// Font face has a MATH table const MATH = 1 << 2; + /// Font face has an fvar table + const VARIABLE = 1 << 3; } } @@ -275,6 +277,7 @@ impl FontInfo { let mut flags = FontFlags::empty(); flags.set(FontFlags::MONOSPACE, ttf.is_monospaced()); flags.set(FontFlags::MATH, ttf.tables().math.is_some()); + flags.set(FontFlags::VARIABLE, ttf.is_variable()); // Determine whether this is a serif or sans-serif font. if let Some(panose) = ttf diff --git a/crates/typst-library/src/text/mod.rs b/crates/typst-library/src/text/mod.rs index 1c0696d1a..563adbbd4 100644 --- a/crates/typst-library/src/text/mod.rs +++ b/crates/typst-library/src/text/mod.rs @@ -1412,12 +1412,24 @@ pub fn is_default_ignorable(c: char) -> bool { fn check_font_list(engine: &mut Engine, list: &Spanned) { let book = engine.world.book(); for family in &list.v { - if !book.contains_family(family.as_str()) { - engine.sink.warn(warning!( + match book.select_family(family.as_str()).next() { + Some(index) => { + if book + .info(index) + .is_some_and(|x| x.flags.contains(FontFlags::VARIABLE)) + { + engine.sink.warn(warning!( + list.span, + "variable fonts are not currently supported and may render incorrectly"; + hint: "try installing a static version of \"{}\" instead", family.as_str() + )) + } + } + None => engine.sink.warn(warning!( list.span, "unknown font family: {}", family.as_str(), - )); + )), } } }