X 逻辑字体描述和 HiDPI

X 逻辑字体描述和 HiDPI

问题:X-server 以固定分辨率提供字体100dpi,而不是当前窗口系统分辨率 ( xdpyinfo | grep -F resolution)。

一点理论。有一些遗留的服务器端字体,它们通过网络(通过 TCP 或 UNIX 套接字)由 X 服务器本身或单独的服务器发送到 X 客户端。X字体服务器(单个或多个)。与通常的客户端字体(Xft、GTK 2+、Qt 2+)不同,“服务器”后端(也称为核心X字体backend)不支持抗锯齿,但支持网络透明(即,没有任何 Alpha 通道的位图通过网络发送)。在应用程序级别,服务器端字体不被指定为XftFontStruct(最常翻译成熟悉的DejaVu Sans Mono:size=12:antialias=true),但作为XLFD。如果我们谈论的是本地计算机,那么相同的字体文件可以同时在两个字体后端注册,并且可用于现代 GTK 和基于 Qt 的应用程序以及旧版应用程序(Xt、Athena、Motif、GTK 1.2、Qt 1.x)。

从历史上看,存在光栅服务器端字体(*.pcf),并且光栅有自己的分辨率(不一定与窗口系统分辨率相同)。因此,XLFD 有RESOLUTION_X和等字段RESOLUTION_Y。为了使光栅字体在渲染到屏幕上时看起来不难看,并且仍然具有所请求的光栅化字形大小 ( PIXEL_SIZE),光栅分辨率必须接近屏幕分辨率,因此光栅字体通常以原始分辨率提供75dpi100dpi(这就是为什么我们仍然有 和 等目录/usr/share/fonts/X11/75dpi/usr/share/fonts/X11/100dpi。因此,下面的行代表相同的 12 pt 字体

-bitstream-charter-bold-r-normal--12-120-75-75-p-75-iso8859-1
-bitstream-charter-bold-r-normal--17-120-100-100-p-107-iso8859-1

光栅化字形大小为

  • 12像素75dpi, 和
  • 17像素100dpi, 分别。

但是,除了光栅字体之外,还有矢量或轮廓字体(TrueType,开放式,土坯类型 1),可以按任何因素缩放,并且在渲染到屏幕上时仍然看起来不错。一些 X-server 实现(特别是,新太阳)也支持土坯类型 3格式,其中字形是使用图灵完备的描述的后记语言。

当然,光栅分辨率的概念不适用于矢量字体,因此我可以在和字段中请求零 ( 0) 甚至星号 ( *) ,并且理论上,我的 X 服务器应该准确地为我提供所请求的字体。这直接在RESOLUTION_XRESOLUTION_YArch Linux 维基文章在上面的链接:

可缩放字体旨在调整大小。可缩放字体名称(如下例所示)在像素和点大小字段、两个分辨率字段以及平均宽度字段中具有零。

...

要指定特定尺寸的可缩放字体,您只需为该POINT_SIZE字段提供一个值,其他与尺寸相关的值可以保持为零。该POINT_SIZE值以十分之一磅为单位,因此输入的值必须是所需磅值乘以十。

因此,以下两个查询中的任何一个都应该返回12点 Courier New窗口系统分辨率下的字体:


-monotype-courier new-medium-r-normal--*-120-*-*-m-*-iso10646-1
-monotype-courier new-medium-r-normal--0-120-0-0-m-0-iso10646-1

或者我是这么想的。问题是,从 96...115dpi 显示器迁移到162dpi4k显示器,我发现我精心挑选的矢量字体突然变得太小了。

事实证明,除非您明确设置RESOLUTION_XRESOLUTION_Y字段162(头脑正常的人不会这样做——Xresources每次更换显示器都需要重写几十行),然后 X 服务器默认将字体渲染为100dpi代替162。和...之间的不同17 号27像素( 的因子1.62 = 162 / 100)非常明显。这是一个现代的例子Debian 10盒子:

Debian 10,Courier New 12pt,162dpi

我认为这种回归是人们逐渐从 X11 中删除过时的子系统的结果,但在德安·伍迪,于 2002 年发布并具有 2.2 内核,我看到了完全相同的事情:

Debian 3,Courier New 12pt,162dpi

唯一的区别是德安·伍迪显然,在通过网络发送位图之前,在服务器端应用提示,以“更干净”的方式呈现字体。

所以这不是回归。这个问题一直存在,并且同样影响所有矢量字体类型(TrueType,开放式,类型1)。

现在,问题。有没有一种方法,无需将窗口系统分辨率硬编码到每个单独资源的用户设置中,就可以比作者推荐的更轻松地度过难关?系统间共享X资源文章?

是否可以通过更改X服务器本身或其依赖的库的全局配置来解决问题(libfreetypelibxfont)?

相关内容