On 2020/06/28 14:17, Antoine Jacoutot wrote: > Thanks. > If this works out for you folks, OK with me.
chrisz, any comments on my diff? full email forwarded below in case you can't find it .. ----- Forwarded message from Stuart Henderson <st...@openbsd.org> ----- From: Stuart Henderson <st...@openbsd.org> Date: Sun, 28 Jun 2020 12:44:09 +0100 To: Antoine Jacoutot <ajacou...@bsdfrog.org> Cc: matth...@openbsd.org, ports@openbsd.org Subject: Re: update pango to 1.45.3 with backported patch Mail-Followup-To: Antoine Jacoutot <ajacou...@bsdfrog.org>, matth...@openbsd.org, ports@openbsd.org 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). 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 <khaledho...@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); ----- End forwarded message -----