pango 1.49之后的版本出现字体渲染问题

系统字体配置、中文显示和输入法问题
回复
zrqlx126
帖子: 374
注册时间: 2007-06-22 18:52

pango 1.49之后的版本出现字体渲染问题

#1

帖子 zrqlx126 » 2022-01-29 11:44

一直跟踪ubuntu daily,前一段时间发现pango直接从1.48.10直接更新到1.50.3,然后字体渲染就出现了问题。

首先发现端倪的是mono字族,测试结果如下:
1.50.3版本上,如果中文字体使用Noto Sans Mono CJK SC,那么可以对齐。
2022-01-29 11-31-09屏幕截图.png
如果使用Noto Sans CJK SC则无法对齐。
2022-01-29 11-31-52屏幕截图.png
仔细查无法对齐的显示效果,发现半角空格跟在中文之后会出现宽度压缩的情况。
但是1.48.10版本上,无论使用Noto Sans Mono CJK SC还是使用Noto Sans CJK SC,都可以对齐。


开始以为是noto字体的问题,于是测试了所有能接触到的中文字体,如鸿蒙字体、雅黑字体、小米字体、oppo字体等黑体字体,结果与上述情况相同。按理来说中文字体按照字形划分,可以分为宋、仿、黑、楷等,基本上都是等宽的,没有西文字体“等宽”或者“变宽”一说。
然后迫不得已,查找了pango源码,最终将该问题定位在pango 1.49.0以及以上版本。
2022-01-29 10-58-57屏幕截图.png
查看更新说明,发现了这一句:
* New api: pango_font_get_languages
猜测很可能与该问题有关。于是发看了源代码,由于是一堆的c代码,加上能力有限,实在定位不到问题的具体位置。万能的坛友,有没有这个问题的相关解决方案?
头像
astolia
论坛版主
帖子: 6541
注册时间: 2008-09-18 13:11

Re: pango 1.49之后的版本出现字体渲染问题

#2

帖子 astolia » 2022-01-30 13:18

我大概了解到是怎么回事了。在22.04上安装pango1.0-tools后运行

代码: 全选

pango-view -t '# 用 a #' --serialize-to /tmp/a
可以在/tmp/a看到它是把用和后面的空格看作成一个整体,用了同一种字体。

在你的例子里,如果中文用的是Noto Sans Mono CJK SC,那么它的空格宽度和其他部分用的Ubuntu Mono字体一致,所以看起来能对齐。但换成Noto Sans CJK SC后,由于不是等宽字体,不保证除中文外的字符宽度,所以它的空格和Ubuntu Mono的空格宽度就不一致了,就没法对齐。

pango的开发者曾经回应过对空格的选字逻辑 https://gitlab.gnome.org/GNOME/pango/-/ ... te_1337197 。不过也不一定就是这样,比如把上面的文本换成“# 用 #”时,就能把用字单独提出来了。可以到 https://gitlab.gnome.org/GNOME/pango/-/issues 提一下bug。
zrqlx126
帖子: 374
注册时间: 2007-06-22 18:52

Re: pango 1.49之后的版本出现字体渲染问题

#3

帖子 zrqlx126 » 2022-01-30 22:29

看了作者关于这个问题的答复,承认选字逻辑可能有误,但是目前看不到作者进一步修复这个问题的主观意愿。

1.5之后一直在不停的更新,应该还是实验版本,看起来离稳定还有一段距离。今天甚至看到在代码里,已经将1.4与1.5区别分别对待了,但是代码的测试用例里依然没有常用的cjk字体。

不得不说,这个选字逻辑存在很大的问题。主要问题有三:
首先,对我们简体中文Linux用户来说,字体配置一般只考虑西文和中文字体。西文考虑三类有衬线、无衬线、等宽。中文只考虑宋、黑、楷、仿。然后让西文衬线搭配宋体,这个搭配主要用来显示文档,比如编辑libreoffice文档等。西文无衬线搭配黑体,这个搭配主要用来作为程序界面字体。西文等宽搭配黑体,这个搭配主要用来作为编程字体,写程序码字时,非常方便。
再次,西文字体一般来说,需要设计的字符较少,制作难度要远远低于中日韩等象形文字字体。中日韩这样的字符,设计起来动辄以万为单位,字体文件也远远大于西文字体。加之,至少要设计四个字重,这个工作量就太大了,这也是限制开源中文字体繁荣的最大障碍。
最后,大部分中文字体所涵盖的西文字体,显示效果基本上都不尽如人意,尤其是西文字体部分等宽的中文字体更是难得,即便是流行的思源cjk系列字体,中文字体也根本就没有过多考虑与西文字体严格按照1:2比例设计。所以在linux下,有时候不得不使用一些常用的西文字体进行替换,以便达到较好的显示效果。
总之,这样的选字逻辑,让我们这些经常码字的人,几乎没有更多的选择余地。
回复