Modified: trunk/Source/WebCore/ChangeLog (262137 => 262138)
--- trunk/Source/WebCore/ChangeLog 2020-05-26 07:59:30 UTC (rev 262137)
+++ trunk/Source/WebCore/ChangeLog 2020-05-26 08:01:14 UTC (rev 262138)
@@ -1,3 +1,21 @@
+2020-05-26 Carlos Garcia Campos <[email protected]>
+
+ [GTK4] Use screen font options as default
+ https://bugs.webkit.org/show_bug.cgi?id=212332
+
+ Reviewed by Adrian Perez de Castro.
+
+ There's no gdk_screen_get_font_options() in GTK4, so we need to get the individual properties from the settings
+ and build a cairo_font_options_t. We can just do the same in GTK3 to avoid ifdefs. Add a helper
+ SystemFontOptions singleton class to monitor and parse the font settings.
+
+ * platform/graphics/gtk/GdkCairoUtilities.cpp:
+ (WebCore::SystemFontOptions::singleton):
+ (WebCore::SystemFontOptions::SystemFontOptions):
+ (WebCore::SystemFontOptions::fontOptions const):
+ (WebCore::SystemFontOptions::updateFontOptions):
+ (WebCore::getDefaultCairoFontOptions):
+
2020-05-25 Simon Fraser <[email protected]>
Use an Optional<> for LayerFragment::boundingBox
Modified: trunk/Source/WebCore/platform/graphics/gtk/GdkCairoUtilities.cpp (262137 => 262138)
--- trunk/Source/WebCore/platform/graphics/gtk/GdkCairoUtilities.cpp 2020-05-26 07:59:30 UTC (rev 262137)
+++ trunk/Source/WebCore/platform/graphics/gtk/GdkCairoUtilities.cpp 2020-05-26 08:01:14 UTC (rev 262138)
@@ -24,9 +24,10 @@
*/
#include "config.h"
+#include "GdkCairoUtilities.h"
+
+#include "CairoUniquePtr.h"
#include "CairoUtilities.h"
-
-#include "GdkCairoUtilities.h"
#include "IntSize.h"
#include <cairo.h>
#include <gtk/gtk.h>
@@ -36,21 +37,107 @@
namespace WebCore {
+class SystemFontOptions {
+public:
+ static SystemFontOptions& singleton()
+ {
+ static LazyNeverDestroyed<SystemFontOptions> fontOptions;
+ static std::once_flag flag;
+ std::call_once(flag, [&] {
+ fontOptions.construct();
+ });
+ return fontOptions;
+ }
+
+ SystemFontOptions()
+ : m_settings(gtk_settings_get_default())
+ {
+ if (m_settings) {
+ auto fontOptionsChangedCallback = +[](GtkSettings*, GParamSpec*, SystemFontOptions* systemFontOptions) {
+ systemFontOptions->updateFontOptions();
+ };
+ g_signal_connect(m_settings, "notify::gtk-xft-antialias", G_CALLBACK(fontOptionsChangedCallback), this);
+ g_signal_connect(m_settings, "notify::gtk-xft-hinting", G_CALLBACK(fontOptionsChangedCallback), this);
+ g_signal_connect(m_settings, "notify::gtk-xft-hintstyle", G_CALLBACK(fontOptionsChangedCallback), this);
+ g_signal_connect(m_settings, "notify::gtk-xft-rgba", G_CALLBACK(fontOptionsChangedCallback), this);
+ updateFontOptions();
+ } else
+ m_fontOptions.reset(cairo_font_options_create());
+ }
+
+ const cairo_font_options_t* fontOptions() const
+ {
+ return m_fontOptions.get();
+ }
+
+private:
+ void updateFontOptions()
+ {
+ m_fontOptions.reset(cairo_font_options_create());
+
+ gint antialias, hinting;
+ GUniqueOutPtr<char> hintStyleString;
+ GUniqueOutPtr<char> rgbaString;
+ g_object_get(m_settings, "gtk-xft-antialias", &antialias, "gtk-xft-hinting", &hinting, "gtk-xft-hintstyle",
+ &hintStyleString.outPtr(), "gtk-xft-rgba", &rgbaString.outPtr(), nullptr);
+
+ cairo_font_options_set_hint_metrics(m_fontOptions.get(), CAIRO_HINT_METRICS_ON);
+
+ cairo_hint_style_t hintStyle = CAIRO_HINT_STYLE_DEFAULT;
+ switch (hinting) {
+ case 0:
+ hintStyle = CAIRO_HINT_STYLE_NONE;
+ break;
+ case 1:
+ if (hintStyleString) {
+ if (!strcmp(hintStyleString.get(), "hintnone"))
+ hintStyle = CAIRO_HINT_STYLE_NONE;
+ else if (!strcmp(hintStyleString.get(), "hintslight"))
+ hintStyle = CAIRO_HINT_STYLE_SLIGHT;
+ else if (!strcmp(hintStyleString.get(), "hintmedium"))
+ hintStyle = CAIRO_HINT_STYLE_MEDIUM;
+ else if (!strcmp(hintStyleString.get(), "hintfull"))
+ hintStyle = CAIRO_HINT_STYLE_FULL;
+ }
+ break;
+ }
+ cairo_font_options_set_hint_style(m_fontOptions.get(), hintStyle);
+
+ cairo_subpixel_order_t subpixelOrder = CAIRO_SUBPIXEL_ORDER_DEFAULT;
+ if (rgbaString) {
+ if (!strcmp(rgbaString.get(), "rgb"))
+ subpixelOrder = CAIRO_SUBPIXEL_ORDER_RGB;
+ else if (!strcmp(rgbaString.get(), "bgr"))
+ subpixelOrder = CAIRO_SUBPIXEL_ORDER_BGR;
+ else if (!strcmp(rgbaString.get(), "vrgb"))
+ subpixelOrder = CAIRO_SUBPIXEL_ORDER_VRGB;
+ else if (!strcmp(rgbaString.get(), "vbgr"))
+ subpixelOrder = CAIRO_SUBPIXEL_ORDER_VBGR;
+ }
+ cairo_font_options_set_subpixel_order(m_fontOptions.get(), subpixelOrder);
+
+ cairo_antialias_t antialiasMode = CAIRO_ANTIALIAS_DEFAULT;
+ switch (antialias) {
+ case 0:
+ antialiasMode = CAIRO_ANTIALIAS_NONE;
+ break;
+ case 1:
+ if (subpixelOrder != CAIRO_SUBPIXEL_ORDER_DEFAULT)
+ antialiasMode = CAIRO_ANTIALIAS_SUBPIXEL;
+ else
+ antialiasMode = CAIRO_ANTIALIAS_GRAY;
+ break;
+ }
+ cairo_font_options_set_antialias(m_fontOptions.get(), antialiasMode);
+ }
+
+ GtkSettings* m_settings;
+ CairoUniquePtr<cairo_font_options_t> m_fontOptions;
+};
+
const cairo_font_options_t* getDefaultCairoFontOptions()
{
-#if !USE(GTK4)
- if (auto* screen = gdk_screen_get_default()) {
- if (auto* options = gdk_screen_get_font_options(screen))
- return options;
- }
-#endif
-
- static cairo_font_options_t* options;
- static std::once_flag flag;
- std::call_once(flag, [] {
- options = cairo_font_options_create();
- });
- return options;
+ return SystemFontOptions::singleton().fontOptions();
}
GdkPixbuf* cairoSurfaceToGdkPixbuf(cairo_surface_t* surface)
@@ -59,4 +146,4 @@
return gdk_pixbuf_get_from_surface(surface, 0, 0, size.width(), size.height());
}
-}
+} // namespace WebCore