Title: [262138] trunk/Source/WebCore
Revision
262138
Author
[email protected]
Date
2020-05-26 01:01:14 -0700 (Tue, 26 May 2020)

Log Message

[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):

Modified Paths

Diff

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
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to