X 逻辑字体描述和 HiDPI

Bas*_*ass 5 fonts x11 x-resources dpi high-dpi

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

\n

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

\n

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

\n
-bitstream-charter-bold-r-normal--12-120-75-75-p-75-iso8859-1\n-bitstream-charter-bold-r-normal--17-120-100-100-p-107-iso8859-1\n
Run Code Online (Sandbox Code Playgroud)\n

光栅化字形大小为

\n
    \n
  • 75dpi时为12 像素,并且
  • \n
  • 100dpi时分别为17px
  • \n
\n

但是,除了光栅字体之外,还有矢量或轮廓字体(TrueTypeOpenTypeAdob​​e Type 1),它们可以按任何因素缩放,并且在渲染到屏幕上时仍然看起来不错。一些 X 服务器实现(特别是XSun)还支持Adob​​e Type 3格式,其中字形是使用图灵完备的PostScript语言来描述的。

\n

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

\n
\n

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

\n

...

\n

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

\n
\n

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

\n
\n-monotype-courier new-medium-r-normal--*-120-*-*-m-*-iso10646-1\n-monotype-courier new-medium-r-normal--0-120-0-0-m-0-iso10646-1\n
Run Code Online (Sandbox Code Playgroud)\n

至少我是这么想的。问题是,从 96...115dpi 显示器迁移到162dpi 4k 显示器后,我注意到我精心挑选的矢量字体突然变得太小了。

\n

事实证明,除非您显式地将RESOLUTION_XRESOLUTION_Y字段设置为162(头脑正常的人不会这样做——Xresources每次更换显示器都需要重写几十行),否则 X 服务器默认将字体渲染为100dpi而不是1621727像素之间的差异(系数1.62 = 162 / 100)非常明显。这是现代Debian 10盒子的示例:

\n

Debian 10,Courier New 12pt,162dpi

\n

我认为这种回归是人们逐渐从 X11 中删除过时的子系统的结果,但在2002 年发布的 2.2 内核的D​​ebian Woody中,我看到了完全相同的事情:

\n

Debian 3,Courier New 12pt,162dpi

\n

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

\n

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

\n

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

\n

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

\n