From adfe8a9dcbb638f883863180a6d8dff20a331826 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Fri, 14 Mar 2025 11:32:05 +0000 Subject: [PATCH] LibWeb/CSS: Add functions that report font format/technology support Both `@supports` and `@font-face` need this. There may be some automatic way of querying whether our renderer supports these, but I couldn't figure it out, so here's a basic hard-coded list. I think the font-tech list has false negatives, as I don't know enough about fonts to determine what we support accurately. --- Libraries/LibWeb/CSS/FontFace.cpp | 53 +++++++++++++++++++++++++++++++ Libraries/LibWeb/CSS/FontFace.h | 3 ++ 2 files changed, 56 insertions(+) diff --git a/Libraries/LibWeb/CSS/FontFace.cpp b/Libraries/LibWeb/CSS/FontFace.cpp index a4f1836ce32..bc3bcf74a15 100644 --- a/Libraries/LibWeb/CSS/FontFace.cpp +++ b/Libraries/LibWeb/CSS/FontFace.cpp @@ -398,4 +398,57 @@ GC::Ref FontFace::load() return font_face.loaded(); } +bool font_format_is_supported(FlyString const& name) +{ + // https://drafts.csswg.org/css-fonts-4/#font-format-definitions + // FIXME: Determine this automatically somehow? + if (name.equals_ignoring_ascii_case("collection"sv)) + return false; + if (name.equals_ignoring_ascii_case("embedded-opentype"sv)) + return false; + if (name.equals_ignoring_ascii_case("opentype"sv)) + return true; + if (name.equals_ignoring_ascii_case("svg"sv)) + return false; + if (name.equals_ignoring_ascii_case("truetype"sv)) + return true; + if (name.equals_ignoring_ascii_case("woff"sv)) + return true; + if (name.equals_ignoring_ascii_case("woff2"sv)) + return true; + return false; +} + +bool font_tech_is_supported(FlyString const& name) +{ + // https://drafts.csswg.org/css-fonts-4/#font-tech-definitions + // FIXME: Determine this automatically somehow? + if (name.equals_ignoring_ascii_case("features-opentype"sv)) + return true; + if (name.equals_ignoring_ascii_case("features-aat"sv)) + return false; + if (name.equals_ignoring_ascii_case("features-graphite"sv)) + return false; + if (name.equals_ignoring_ascii_case("variations"sv)) + return true; + if (name.equals_ignoring_ascii_case("color-colrv0"sv)) + return true; + if (name.equals_ignoring_ascii_case("color-colrv1"sv)) + return true; + if (name.equals_ignoring_ascii_case("color-svg"sv)) + return false; + if (name.equals_ignoring_ascii_case("color-sbix"sv)) + return false; + if (name.equals_ignoring_ascii_case("color-cbdt"sv)) + return false; + if (name.equals_ignoring_ascii_case("palettes"sv)) + return false; + if (name.equals_ignoring_ascii_case("incremental"sv)) + return false; + // https://drafts.csswg.org/css-fonts-5/#font-tech-definitions + if (name.equals_ignoring_ascii_case("avar2"sv)) + return false; + return false; +} + } diff --git a/Libraries/LibWeb/CSS/FontFace.h b/Libraries/LibWeb/CSS/FontFace.h index c54a0a986c9..3f8da2edf9d 100644 --- a/Libraries/LibWeb/CSS/FontFace.h +++ b/Libraries/LibWeb/CSS/FontFace.h @@ -113,4 +113,7 @@ private: bool m_is_css_connected { false }; }; +bool font_format_is_supported(FlyString const& name); +bool font_tech_is_supported(FlyString const& name); + }