Sunday, June 28, 2020

Re: update pango to 1.45.3 with backported patch

On Sun, Jun 28, 2020 at 12:44:09PM +0100, Stuart Henderson wrote:
> On 2020/06/28 12:53, Antoine Jacoutot wrote:
> > On Sat, Jun 27, 2020 at 04:14:35PM +0200, Christopher Zimmermann wrote:
> > > Hi,
> > >
> > > I'm trying to fix monospace bitmap font support for gvim (gtk-2 flavor),
> > > which has been broken since pango 1.44.
> > > It requires several changes:
> > >
> > > 1. fix metrics rounding in vim https://github.com/vim/vim/pull/6168,
> > > already included in our vim port.
> > > 2. fix fonttosfnt in our xenocara or rely on something like fontforge for
> > > the same job.
> > > (https://gitlab.freedesktop.org/xorg/app/fonttosfnt/-/merge_requests/7)
>
> FWIW the current fonttosfnt in xenocara might have some problems with
> spacing but is still good enough to create terminus font .otbs
> demonstrating the problem. Makefile fragment for terminus-font to
> convert:
>
> cd ${WRKSRC}; for i in ter-u*[nb].pcf; do fonttosfnt -c -g 2 -m 2 -o $${i%.pcf}.otb $$i; done
>
> Then run gvim, edit/select font, Terminus
>
> > > 3. fix pango, so it does not accidentally use unsupported pcf fonts when
> > > supported OpenType fonts are present:
> > > https://gitlab.gnome.org/GNOME/pango/-/issues/484
> > > 4. ship bitmap fonts in an OpenType container, too.
> > >
> > > Attached is a diff to update pango to the latest release and backport above
> > > mentioned fix.
> >
> > This is the latest *development* release, not stable.
> > I don't think we want this in our tree, do we?
>
> I agree. Here is a backport to the 1.44 branch which fixes the reported
> problem with gvim (which I don't normally ever use ;)
>
> I'll run with it on my workstation for now but I have not tested it
> extensively with other software.
>
> Current situation in ports is that .pcf fonts don't work with Pango (so
> generally what happens is it will fallback to a not-wanted font). *but*
> if we ship .otb versions alongside the .pcf then software using Pango
> will now see the .otb font and permit the font to be chosen, but will
> actually try to use the unsupported pcf not the otb, resulting in
> broken characters (the usual unicode "missing char" boxes).
>
> The alternative workaround is to change all ports installing pcf fonts
> and convert them to otb (removing the pcf) - but that doesn't help for
> user-installed fonts and maybe there are some programs that still
> require pcf. So fixing in pango seems the right thing to do (especially
> as it's a bug which they've acknowledged/fixed in master).

Thanks.
If this works out for you folks, OK with me.

>
>
>
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/devel/pango/Makefile,v
> retrieving revision 1.129
> diff -u -p -r1.129 Makefile
> --- Makefile 21 Dec 2019 14:38:47 -0000 1.129
> +++ Makefile 28 Jun 2020 11:33:05 -0000
> @@ -3,7 +3,7 @@
> COMMENT= library for layout and rendering of text
>
> GNOME_VERSION= 1.44.7
> -REVISION= 0
> +REVISION= 1
> GNOME_PROJECT= pango
>
> SHARED_LIBS += pango-1.0 3801.0 # 0.4400.7
> Index: patches/patch-pango_pangofc-fontmap_c
> ===================================================================
> RCS file: patches/patch-pango_pangofc-fontmap_c
> diff -N patches/patch-pango_pangofc-fontmap_c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-pango_pangofc-fontmap_c 28 Jun 2020 11:33:05 -0000
> @@ -0,0 +1,110 @@
> +$OpenBSD$
> +
> +Backported from below commit (slightly different due to code reorganisation)
> +
> +From fe1ee773310bac83d8e5d3c062b13a51fb5fb4ad Mon Sep 17 00:00:00 2001
> +From: Khaled Hosny <khaledhosny@eglug.org>
> +Date: Thu, 25 Jun 2020 10:02:21 +0200
> +Subject: [PATCH] fcfontmap: Always reject unsupported font formats
> +
> +Fixes https://gitlab.gnome.org/GNOME/pango/-/issues/484 and
> +https://gitlab.gnome.org/GNOME/pango/-/issues/457
> +---
> + pango/pangofc-fontmap.c | 52 ++++++++++++++++++++---------------------
> + 1 file changed, 26 insertions(+), 26 deletions(-)
> +
> +Index: pango/pangofc-fontmap.c
> +--- pango/pangofc-fontmap.c.orig
> ++++ pango/pangofc-fontmap.c
> +@@ -808,8 +808,15 @@ pango_fc_patterns_get_pattern (PangoFcPatterns *pats)
> + }
> +
> + static gboolean
> +-pango_fc_is_supported_font_format (const char *fontformat)
> ++pango_fc_is_supported_font_format (FcPattern* pattern)
> + {
> ++ FcResult res;
> ++ const char *fontformat;
> ++
> ++ res = FcPatternGetString (pattern, FC_FONTFORMAT, 0, (FcChar8 **)(void*)&fontformat);
> ++ if (res != FcResultMatch)
> ++ return FALSE;
> ++
> + /* harfbuzz supports only SFNT fonts. */
> + /* FIXME: "CFF" is used for both CFF in OpenType and bare CFF files, but
> + * HarfBuzz does not support the later and FontConfig does not seem
> +@@ -831,11 +838,7 @@ filter_fontset_by_format (FcFontSet *fontset)
> +
> + for (i = 0; i < fontset->nfont; i++)
> + {
> +- FcResult res;
> +- const char *s;
> +-
> +- res = FcPatternGetString (fontset->fonts[i], FC_FONTFORMAT, 0, (FcChar8 **)(void*)&s);
> +- if (res == FcResultMatch && pango_fc_is_supported_font_format (s))
> ++ if (pango_fc_is_supported_font_format (fontset->fonts[i]))
> + FcFontSetAdd (result, FcPatternDuplicate (fontset->fonts[i]));
> + }
> +
> +@@ -851,34 +854,32 @@ pango_fc_patterns_get_font_pattern (PangoFcPatterns *p
> + if (!pats->match && !pats->fontset)
> + pats->match = FcFontMatch (pats->fontmap->priv->config, pats->pattern, &result);
> +
> +- if (pats->match)
> ++ if (pats->match && pango_fc_is_supported_font_format (pats->match))
> + {
> + *prepare = FALSE;
> + return pats->match;
> + }
> + }
> +- else
> ++
> ++ if (!pats->fontset)
> + {
> +- if (!pats->fontset)
> +- {
> +- FcResult result;
> +- FcFontSet *fontset;
> +- FcFontSet *filtered;
> ++ FcResult result;
> ++ FcFontSet *fontset;
> ++ FcFontSet *filtered;
> +
> +- fontset = FcFontSort (pats->fontmap->priv->config, pats->pattern, FcFalse, NULL, &result);
> +- filtered = filter_fontset_by_format (fontset);
> +- FcFontSetDestroy (fontset);
> ++ fontset = FcFontSort (pats->fontmap->priv->config, pats->pattern, FcFalse, NULL, &result);
> ++ filtered = filter_fontset_by_format (fontset);
> ++ FcFontSetDestroy (fontset);
> +
> +- pats->fontset = FcFontSetSort (pats->fontmap->priv->config, &filtered, 1, pats->pattern, FcTrue, NULL, &result);
> ++ pats->fontset = FcFontSetSort (pats->fontmap->priv->config, &filtered, 1, pats->pattern, FcTrue, NULL, &result);
> +
> +- FcFontSetDestroy (filtered);
> ++ FcFontSetDestroy (filtered);
> +
> +- if (pats->match)
> +- {
> +- FcPatternDestroy (pats->match);
> +- pats->match = NULL;
> +- }
> +- }
> ++ if (pats->match)
> ++ {
> ++ FcPatternDestroy (pats->match);
> ++ pats->match = NULL;
> ++ }
> + }
> +
> + *prepare = TRUE;
> +@@ -1404,9 +1405,7 @@ pango_fc_font_map_list_families (PangoFontMap *fo
> + int variable;
> + PangoFcFamily *temp_family;
> +
> +- res = FcPatternGetString (fontset->fonts[i], FC_FONTFORMAT, 0, (FcChar8 **)(void*)&s);
> +- g_assert (res == FcResultMatch);
> +- if (!pango_fc_is_supported_font_format (s))
> ++ if (!pango_fc_is_supported_font_format (fontset->fonts[i]))
> + continue;
> +
> + res = FcPatternGetString (fontset->fonts[i], FC_FAMILY, 0, (FcChar8 **)(void*)&s);
>

--
Antoine

No comments:

Post a Comment