From 5c2e3d1637424eb91a3f5e738f553d4b4fb30d7d Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 8 Sep 2022 11:55:12 +0200 Subject: [PATCH] LibWeb+WebContent: Add abstraction layer for generic font families Instead of hard-coding the names of system fonts to use for the CSS generic fonts (like "sans-serif", "monospace", etc.) we now call out to a Platform::FontPlugin and ask for the generic names. --- Userland/Libraries/LibWeb/CMakeLists.txt | 1 + .../Libraries/LibWeb/CSS/StyleComputer.cpp | 26 ++++++++--- .../Libraries/LibWeb/Platform/FontPlugin.cpp | 27 ++++++++++++ .../Libraries/LibWeb/Platform/FontPlugin.h | 36 +++++++++++++++ Userland/Services/WebContent/CMakeLists.txt | 1 + .../WebContent/FontPluginSerenity.cpp | 44 +++++++++++++++++++ .../Services/WebContent/FontPluginSerenity.h | 22 ++++++++++ Userland/Services/WebContent/main.cpp | 4 +- 8 files changed, 153 insertions(+), 8 deletions(-) create mode 100644 Userland/Libraries/LibWeb/Platform/FontPlugin.cpp create mode 100644 Userland/Libraries/LibWeb/Platform/FontPlugin.h create mode 100644 Userland/Services/WebContent/FontPluginSerenity.cpp create mode 100644 Userland/Services/WebContent/FontPluginSerenity.h diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 079311fe98..57ed3f6193 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -352,6 +352,7 @@ set(SOURCES Painting/StackingContext.cpp Painting/TextPaintable.cpp Platform/EventLoopPlugin.cpp + Platform/FontPlugin.cpp Platform/Timer.cpp RequestIdleCallback/IdleDeadline.cpp ResizeObserver/ResizeObserver.cpp diff --git a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp index fb484acf06..7f7a096efa 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include namespace Web::CSS { @@ -1029,28 +1030,39 @@ void StyleComputer::compute_font(StyleProperties& style, DOM::Element const* ele return {}; }; - // FIXME: Replace hard-coded font names with a relevant call to FontDatabase. - // Currently, we cannot request the default font's name, or request it at a specific size and weight. - // So, hard-coded font names it is. auto find_generic_font = [&](ValueID font_id) -> RefPtr { + Platform::GenericFont generic_font {}; switch (font_id) { case ValueID::Monospace: case ValueID::UiMonospace: + generic_font = Platform::GenericFont::Monospace; monospace = true; - return find_font("Csilla"); + break; case ValueID::Serif: - return find_font("Roman"); + generic_font = Platform::GenericFont::Serif; + break; case ValueID::Fantasy: - return find_font("Comic Book"); + generic_font = Platform::GenericFont::Fantasy; + break; case ValueID::SansSerif: + generic_font = Platform::GenericFont::SansSerif; + break; case ValueID::Cursive: + generic_font = Platform::GenericFont::Cursive; + break; case ValueID::UiSerif: + generic_font = Platform::GenericFont::UiSerif; + break; case ValueID::UiSansSerif: + generic_font = Platform::GenericFont::UiSansSerif; + break; case ValueID::UiRounded: - return find_font("Katica"); + generic_font = Platform::GenericFont::UiRounded; + break; default: return {}; } + return find_font(Platform::FontPlugin::the().generic_font_name(generic_font)); }; RefPtr found_font; diff --git a/Userland/Libraries/LibWeb/Platform/FontPlugin.cpp b/Userland/Libraries/LibWeb/Platform/FontPlugin.cpp new file mode 100644 index 0000000000..fbf9e50396 --- /dev/null +++ b/Userland/Libraries/LibWeb/Platform/FontPlugin.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2022, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +namespace Web::Platform { + +static FontPlugin* s_the; + +FontPlugin& FontPlugin::the() +{ + VERIFY(s_the); + return *s_the; +} + +void FontPlugin::install(FontPlugin& plugin) +{ + VERIFY(!s_the); + s_the = &plugin; +} + +FontPlugin::~FontPlugin() = default; + +} diff --git a/Userland/Libraries/LibWeb/Platform/FontPlugin.h b/Userland/Libraries/LibWeb/Platform/FontPlugin.h new file mode 100644 index 0000000000..0b4b160c8d --- /dev/null +++ b/Userland/Libraries/LibWeb/Platform/FontPlugin.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2022, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::Platform { + +enum class GenericFont { + Cursive, + Fantasy, + Monospace, + SansSerif, + Serif, + UiMonospace, + UiRounded, + UiSansSerif, + UiSerif, + __Count, +}; + +class FontPlugin { +public: + static FontPlugin& the(); + static void install(FontPlugin&); + + virtual ~FontPlugin(); + + virtual String generic_font_name(GenericFont) = 0; +}; + +} diff --git a/Userland/Services/WebContent/CMakeLists.txt b/Userland/Services/WebContent/CMakeLists.txt index 8327b15562..0a46963ba8 100644 --- a/Userland/Services/WebContent/CMakeLists.txt +++ b/Userland/Services/WebContent/CMakeLists.txt @@ -11,6 +11,7 @@ set(SOURCES ConnectionFromClient.cpp ConsoleGlobalObject.cpp EventLoopPluginSerenity.cpp + FontPluginSerenity.cpp PageHost.cpp TimerSerenity.cpp WebContentClientEndpoint.h diff --git a/Userland/Services/WebContent/FontPluginSerenity.cpp b/Userland/Services/WebContent/FontPluginSerenity.cpp new file mode 100644 index 0000000000..d965778cc0 --- /dev/null +++ b/Userland/Services/WebContent/FontPluginSerenity.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2022, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "FontPluginSerenity.h" +#include +#include + +namespace WebContent { + +FontPluginSerenity::FontPluginSerenity() +{ +} + +FontPluginSerenity::~FontPluginSerenity() = default; + +String FontPluginSerenity::generic_font_name(Web::Platform::GenericFont generic_font) +{ + // FIXME: Replace hard-coded font names with a relevant call to FontDatabase. + // Currently, we cannot request the default font's name, or request it at a specific size and weight. + // So, hard-coded font names it is. + switch (generic_font) { + case Web::Platform::GenericFont::SansSerif: + case Web::Platform::GenericFont::UiSansSerif: + case Web::Platform::GenericFont::Cursive: + case Web::Platform::GenericFont::UiRounded: + return "Katica"; + case Web::Platform::GenericFont::Monospace: + case Web::Platform::GenericFont::UiMonospace: + return "Csilla"; + case Web::Platform::GenericFont::Serif: + case Web::Platform::GenericFont::UiSerif: + return "Roman"; + case Web::Platform::GenericFont::Fantasy: + return "Comic Book"; + case Web::Platform::GenericFont::__Count: + VERIFY_NOT_REACHED(); + } + VERIFY_NOT_REACHED(); +} + +} diff --git a/Userland/Services/WebContent/FontPluginSerenity.h b/Userland/Services/WebContent/FontPluginSerenity.h new file mode 100644 index 0000000000..af779d4f5f --- /dev/null +++ b/Userland/Services/WebContent/FontPluginSerenity.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2022, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace WebContent { + +class FontPluginSerenity final : public Web::Platform::FontPlugin { +public: + FontPluginSerenity(); + virtual ~FontPluginSerenity(); + + virtual String generic_font_name(Web::Platform::GenericFont) override; +}; + +} diff --git a/Userland/Services/WebContent/main.cpp b/Userland/Services/WebContent/main.cpp index 5a06e6e00c..fccdf5380a 100644 --- a/Userland/Services/WebContent/main.cpp +++ b/Userland/Services/WebContent/main.cpp @@ -1,10 +1,11 @@ /* - * Copyright (c) 2020-2021, Andreas Kling + * Copyright (c) 2020-2022, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #include "EventLoopPluginSerenity.h" +#include "FontPluginSerenity.h" #include #include #include @@ -31,6 +32,7 @@ ErrorOr serenity_main(Main::Arguments) TRY(Core::System::unveil(nullptr, nullptr)); Web::Platform::EventLoopPlugin::install(*new WebContent::EventLoopPluginSerenity); + Web::Platform::FontPlugin::install(*new WebContent::FontPluginSerenity); Web::ImageDecoding::Decoder::initialize(WebView::ImageDecoderClientAdapter::create()); Web::WebSockets::WebSocketClientManager::initialize(TRY(WebView::WebSocketClientManagerAdapter::try_create()));