From: Pieter van Prooijen <pieter.van.prooijen@teloden.nl>
To: Po Lu <luangruo@yahoo.com>
Cc: 54564@debbugs.gnu.org
Subject: bug#54564: 29.0.50; [PATCH] Use gsettings font rendering entries for pgtk builds
Date: Fri, 13 May 2022 13:38:16 +0200 [thread overview]
Message-ID: <d4da24a8f50195b63489597551b6b660448f1843.camel@teloden.nl> (raw)
In-Reply-To: <04ae2baf0a2a974bb411820c4d294b82d86ddc92.camel@teloden.nl>
[-- Attachment #1: Type: text/plain, Size: 3447 bytes --]
Hello All,
The copyright assignment paperwork came through, is it possible to
incorporate the gsetting font rendering changes? I've attached a patch
against the current master, let me know if I need to change anything.
Kind Regards,
Pieter
On Fri, 2022-04-08 at 20:44 +0200, Pieter van Prooijen wrote:
> Hi,
>
> Yes, your patch fixes the problem as well, and I don't see any
> other side effects at a first glance. I've changed my patch to
> incorporate it and revert the changes to ftcrfont_draw.
>
> Thanks,
>
> Pieter
>
>
> On Fri, 2022-04-08 at 07:38 +0800, Po Lu wrote:
> > Pieter van Prooijen <pieter.van.prooijen@teloden.nl> writes:
> >
> > > Hi All,
> > >
> > > It took a fair bit of digging, but sub-pixel anti-aliasing on
> > > pgtk
> > > now
> > > seems to work correctly.
> > >
> > > The problem lies with the "source" operator set by pgtk when
> > > drawing a
> > > font, this will take a particular execution path in the cairo
> > > glyph
> > > compositor (using a mask image) which converts the colors created
> > > by
> > > freetype for the sub pixel effect to greys-cale. Using the
> > > default
> > > "over" operator takes a different path which preserves the
> > > colors.
> > > Note
> > > that on small screens the difference between sub-pixel and grey-
> > > scale
> > > rendering is hard to see, it's more pronounced on larger
> > > displays)
> >
> > Ah thanks. Does this fix the problem as well?
> >
> > diff --git a/src/pgtkterm.c b/src/pgtkterm.c
> > index b2816aa04a..5fbc56ae81 100644
> > --- a/src/pgtkterm.c
> > +++ b/src/pgtkterm.c
> > @@ -7037,8 +7037,11 @@ pgtk_set_cr_source_with_color (struct frame
> > *f, unsigned long color,
> > pgtk_query_color (f, &col);
> >
> > if (!respects_alpha_background)
> > - cairo_set_source_rgb (FRAME_CR_CONTEXT (f), col.red / 65535.0,
> > - col.green / 65535.0, col.blue / 65535.0);
> > + {
> > + cairo_set_source_rgb (FRAME_CR_CONTEXT (f), col.red /
> > 65535.0,
> > + col.green / 65535.0, col.blue /
> > 65535.0);
> > + cairo_set_operator (FRAME_CR_CONTEXT (f),
> > CAIRO_OPERATOR_OVER);
> > + }
> > else
> > {
> > cairo_set_source_rgba (FRAME_CR_CONTEXT (f), col.red /
> > 65535.0,
> >
> > > I've also fixed the indent error, but couldn't find the non-
> > > breaking
> > > space in the patch, it's perhaps caused by the mail program.
> >
> > It was previously filled with non-breaking spaces, but the patch
> > you
> > attached looks fine now.
> >
> > > Regarding the copyright assignment, I've had no response after
> > > sending
> > > in the questionnaire at
> > > https://git.savannah.gnu.org/cgit/gnulib.git/plain/doc/Copyright/
> > > re
> > > quest-assign.future
> > > to assign@gnu.org
> >
> > It takes a while; if you don't get a response in 2 weeks, you
> > should
> > contact Eli or Lars, and they will ask the folks at the FSF to
> > expedite
> > things.
> >
> > > Do you get sent a paper form of some kind which has to be filled
> > > in?
> > > (I'm not at my home address atm so I will have missed that)
> >
> > You get sent a document you have to print and fill in, I think, but
> > that
> > depends on the country you're in.
> >
> > Thanks.
>
[-- Attachment #2: 0001-Use-gsettings-font-rendering-entries-for-pgtk-builds.patch --]
[-- Type: text/x-patch, Size: 9771 bytes --]
From 84d4401a9a9e628815fa30147ee08d4597af53d6 Mon Sep 17 00:00:00 2001
From: Pieter van Prooijen <pieter.van.prooijen@teloden.nl>
Date: Sun, 8 May 2022 16:27:38 +0200
Subject: [PATCH] Use gsettings font rendering entries for pgtk builds
If present, apply the gsettings font hinting and antialiasing
entries when creating a font in cairo. Do this at
initialization and when the entries change, re-rendering the
frames.
* src/ftcrfont.c (ftcrfont_open): Use the font_options derived
from gsettings when opening a font.
(ftcrfont_cached_font_ok): Report a cached font as invalid if
its font options differ from the current options inside
gsettings.
* src/xsettings.c (apply_gsettings_font_hinting)
(apply_gsettings_font_alias, apply_gsettings_font_rgba_order):
Convert the settings from GSettings to the cairo_font_options_t
object.
(init_gsettings, something_changed_gsettingsCB): Invoke the
apply functions if the relevant settings changed.
(store_font_options_changed): Store an event to re-render the
fonts.
(xsetting_get_font_options)
* src/xsettings.h (xsettings_get_font_options): New function.
---
src/ftcrfont.c | 33 +++++++++++
src/xsettings.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++
src/xsettings.h | 5 ++
3 files changed, 185 insertions(+)
diff --git a/src/ftcrfont.c b/src/ftcrfont.c
index 98a28af5f2..6bb41110d5 100644
--- a/src/ftcrfont.c
+++ b/src/ftcrfont.c
@@ -37,6 +37,9 @@
#include "font.h"
#include "ftfont.h"
#include "pdumper.h"
+#ifdef HAVE_PGTK
+#include "xsettings.h"
+#endif
#ifdef USE_BE_CAIRO
#define RED_FROM_ULONG(color) (((color) >> 16) & 0xff)
@@ -168,7 +171,12 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
cairo_matrix_t font_matrix, ctm;
cairo_matrix_init_scale (&font_matrix, pixel_size, pixel_size);
cairo_matrix_init_identity (&ctm);
+
+#ifdef HAVE_PGTK
+ cairo_font_options_t *options = xsettings_get_font_options ();
+#else
cairo_font_options_t *options = cairo_font_options_create ();
+#endif
#ifdef USE_BE_CAIRO
if (be_use_subpixel_antialiasing ())
cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_SUBPIXEL);
@@ -624,6 +632,28 @@ ftcrfont_draw (struct glyph_string *s,
return len;
}
+#ifdef HAVE_PGTK
+/* Determine if FONT_OBJECT is a valid cached font for ENTITY by
+ comparing the options used to open it with the user's current
+ preferences specified via GSettings. */
+static bool
+ftcrfont_cached_font_ok (struct frame *f, Lisp_Object font_object,
+ Lisp_Object entity)
+{
+ struct font_info *info = (struct font_info *) XFONT_OBJECT (font_object);
+
+ cairo_font_options_t *options = cairo_font_options_create ();
+ cairo_scaled_font_get_font_options (info->cr_scaled_font, options);
+ cairo_font_options_t *gsettings_options = xsettings_get_font_options ();
+
+ bool equal = cairo_font_options_equal (options, gsettings_options);
+ cairo_font_options_destroy (options);
+ cairo_font_options_destroy (gsettings_options);
+
+ return equal;
+}
+#endif
+
#ifdef HAVE_HARFBUZZ
static Lisp_Object
@@ -694,6 +724,9 @@ ftcrhbfont_end_hb_font (struct font *font, hb_font_t *hb_font)
#endif
.filter_properties = ftfont_filter_properties,
.combining_capability = ftfont_combining_capability,
+#ifdef HAVE_PGTK
+ .cached_font_ok = ftcrfont_cached_font_ok
+#endif
};
#ifdef HAVE_HARFBUZZ
struct font_driver ftcrhbfont_driver;
diff --git a/src/xsettings.c b/src/xsettings.c
index 71d02e6152..e71887e03d 100644
--- a/src/xsettings.c
+++ b/src/xsettings.c
@@ -215,11 +215,116 @@ #define GSETTINGS_MONO_FONT "monospace-font-name"
#define GSETTINGS_FONT_NAME "font-name"
#endif
+#ifdef HAVE_PGTK
+#define GSETTINGS_FONT_ANTIALIASING "font-antialiasing"
+#define GSETTINGS_FONT_RGBA_ORDER "font-rgba-order"
+#define GSETTINGS_FONT_HINTING "font-hinting"
+#endif
/* The single GSettings instance, or NULL if not connected to GSettings. */
static GSettings *gsettings_client;
+#ifdef HAVE_PGTK
+
+/* The cairo font_options as obtained using gsettings. */
+static cairo_font_options_t *font_options;
+
+/* Store an event for re-rendering of the fonts. */
+static void
+store_font_options_changed (void)
+{
+ if (dpyinfo_valid (first_dpyinfo))
+ store_config_changed_event (Qfont_render,
+ XCAR (first_dpyinfo->name_list_element));
+}
+
+/* Apply changes in the hinting system setting. */
+static void
+apply_gsettings_font_hinting (GSettings *settings)
+{
+ GVariant *val = g_settings_get_value (settings, GSETTINGS_FONT_HINTING);
+ if (val)
+ {
+ g_variant_ref_sink (val);
+ if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING))
+ {
+ const char *hinting = g_variant_get_string (val, NULL);
+
+ if (!strcmp (hinting, "full"))
+ cairo_font_options_set_hint_style (font_options,
+ CAIRO_HINT_STYLE_FULL);
+ else if (!strcmp (hinting, "medium"))
+ cairo_font_options_set_hint_style (font_options,
+ CAIRO_HINT_STYLE_MEDIUM);
+ else if (!strcmp (hinting, "slight"))
+ cairo_font_options_set_hint_style (font_options,
+ CAIRO_HINT_STYLE_SLIGHT);
+ else if (!strcmp (hinting, "none"))
+ cairo_font_options_set_hint_style (font_options,
+ CAIRO_HINT_STYLE_NONE);
+ }
+ g_variant_unref (val);
+ }
+}
+
+/* Apply changes in the antialiasing system setting. */
+static void
+apply_gsettings_font_antialias (GSettings *settings)
+{
+ GVariant *val = g_settings_get_value (settings, GSETTINGS_FONT_ANTIALIASING);
+ if (val)
+ {
+ g_variant_ref_sink (val);
+ if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING))
+ {
+ const char *antialias = g_variant_get_string (val, NULL);
+
+ if (!strcmp (antialias, "none"))
+ cairo_font_options_set_antialias (font_options,
+ CAIRO_ANTIALIAS_NONE);
+ else if (!strcmp (antialias, "grayscale"))
+ cairo_font_options_set_antialias (font_options,
+ CAIRO_ANTIALIAS_GRAY);
+ else if (!strcmp (antialias, "rgba"))
+ cairo_font_options_set_antialias (font_options,
+ CAIRO_ANTIALIAS_SUBPIXEL);
+ }
+ g_variant_unref (val);
+ }
+}
+
+/* Apply the settings for the rgb element ordering. */
+static void
+apply_gsettings_font_rgba_order (GSettings *settings)
+{
+ GVariant *val = g_settings_get_value (settings,
+ GSETTINGS_FONT_RGBA_ORDER);
+ if (val)
+ {
+ g_variant_ref_sink (val);
+ if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING))
+ {
+ const char *rgba_order = g_variant_get_string (val, NULL);
+
+ if (!strcmp (rgba_order, "rgb"))
+ cairo_font_options_set_subpixel_order (font_options,
+ CAIRO_SUBPIXEL_ORDER_RGB);
+ else if (!strcmp (rgba_order, "bgr"))
+ cairo_font_options_set_subpixel_order (font_options,
+ CAIRO_SUBPIXEL_ORDER_BGR);
+ else if (!strcmp (rgba_order, "vrgb"))
+ cairo_font_options_set_subpixel_order (font_options,
+ CAIRO_SUBPIXEL_ORDER_VRGB);
+ else if (!strcmp (rgba_order, "vbgr"))
+ cairo_font_options_set_subpixel_order (font_options,
+ CAIRO_SUBPIXEL_ORDER_VBGR);
+ }
+ g_variant_unref (val);
+ }
+}
+#endif /* HAVE_PGTK */
+
/* Callback called when something changed in GSettings. */
static void
@@ -273,6 +378,23 @@ something_changed_gsettingsCB (GSettings *settings,
}
}
#endif /* USE_CAIRO || HAVE_XFT */
+#ifdef HAVE_PGTK
+ else if (!strcmp (key, GSETTINGS_FONT_ANTIALIASING))
+ {
+ apply_gsettings_font_antialias (settings);
+ store_font_options_changed ();
+ }
+ else if (!strcmp (key, GSETTINGS_FONT_HINTING))
+ {
+ apply_gsettings_font_hinting (settings);
+ store_font_options_changed ();
+ }
+ else if (!strcmp (key, GSETTINGS_FONT_RGBA_ORDER))
+ {
+ apply_gsettings_font_rgba_order (settings);
+ store_font_options_changed ();
+ }
+#endif /* HAVE_PGTK */
}
#endif /* HAVE_GSETTINGS */
@@ -900,6 +1022,16 @@ init_gsettings (void)
dupstring (¤t_font, g_variant_get_string (val, NULL));
g_variant_unref (val);
}
+
+ /* Only use the gsettings font entries for the Cairo backend
+ running on PGTK. */
+#ifdef HAVE_PGTK
+ font_options = cairo_font_options_create ();
+ apply_gsettings_font_antialias (gsettings_client);
+ apply_gsettings_font_hinting (gsettings_client);
+ apply_gsettings_font_rgba_order (gsettings_client);
+#endif /* HAVE_PGTK */
+
#endif /* USE_CAIRO || HAVE_XFT */
#endif /* HAVE_GSETTINGS */
@@ -1021,6 +1153,17 @@ xsettings_get_system_normal_font (void)
}
#endif
+#ifdef HAVE_PGTK
+/* Return the cairo font options, updated from the gsettings font
+ config entries. The caller should call cairo_font_options_destroy
+ on the result. */
+cairo_font_options_t *
+xsettings_get_font_options (void)
+{
+ return cairo_font_options_copy (font_options);
+}
+#endif
+
DEFUN ("font-get-system-normal-font", Ffont_get_system_normal_font,
Sfont_get_system_normal_font,
0, 0, 0,
@@ -1073,6 +1216,10 @@ syms_of_xsettings (void)
gconf_client = NULL;
PDUMPER_IGNORE (gconf_client);
#endif
+#ifdef HAVE_PGTK
+ font_options = NULL;
+ PDUMPER_IGNORE (font_options);
+#endif
DEFSYM (Qmonospace_font_name, "monospace-font-name");
DEFSYM (Qfont_name, "font-name");
diff --git a/src/xsettings.h b/src/xsettings.h
index ccaa36489d..5e5df37062 100644
--- a/src/xsettings.h
+++ b/src/xsettings.h
@@ -23,6 +23,8 @@ #define XSETTINGS_H
#ifndef HAVE_PGTK
#include "dispextern.h"
#include <X11/Xlib.h>
+#else
+#include <cairo.h>
#endif
struct x_display_info;
@@ -41,5 +43,8 @@ #define XSETTINGS_H
extern const char *xsettings_get_system_normal_font (void);
#endif
+#ifdef HAVE_PGTK
+extern cairo_font_options_t *xsettings_get_font_options (void);
+#endif
#endif /* XSETTINGS_H */
--
2.34.1
next prev parent reply other threads:[~2022-05-13 11:38 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-25 11:23 bug#54564: 29.0.50; [PATCH] Use gsettings font rendering entries for pgtk builds Pieter van Prooijen
2022-03-26 1:16 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-03-26 6:01 ` Eli Zaretskii
2022-03-26 6:07 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-03-26 6:20 ` Eli Zaretskii
2022-03-26 6:44 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-03-26 7:45 ` Eli Zaretskii
2022-03-26 8:11 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-03-26 9:36 ` Eli Zaretskii
2022-03-26 15:48 ` Pieter van Prooijen
2022-03-27 0:59 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-03-30 8:01 ` Pieter van Prooijen
2022-03-30 8:59 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-03-31 17:30 ` Pieter van Prooijen
2022-04-01 2:00 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-04-07 19:24 ` Pieter van Prooijen
2022-04-07 23:38 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-04-08 18:44 ` Pieter van Prooijen
2022-04-09 0:35 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-05-13 11:38 ` Pieter van Prooijen [this message]
2022-05-13 11:55 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-05-13 11:57 ` Lars Ingebrigtsen
2022-05-13 12:12 ` Eli Zaretskii
2022-05-13 12:51 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d4da24a8f50195b63489597551b6b660448f1843.camel@teloden.nl \
--to=pieter.van.prooijen@teloden.nl \
--cc=54564@debbugs.gnu.org \
--cc=luangruo@yahoo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.