Shell 命令查找使用某些字体呈现的文本的宽度

Shell 命令查找使用某些字体呈现的文本的宽度

我需要找到用某种字体显示的字符串的宽度(以像素为单位)。我知道我可以这样做:

dzen2-textwidth \
   -adobe-times-medium-r-normal--8-80-75-75-p-44-iso8859-1 \
   "A Tale of Two Cities"

(该命令来自dzen2包)

但是,这不支持 Xft。我希望能够使用 Xft 字体格式,例如“Droid Sans:size=12”。

是否有一个程序可以让我做到这一点?

(不用说它应该支持 Unicode,因为我没有使用英语。但我猜任何支持 Xft 的东西都足够现代以支持 Unicode。)

我知道如果我有 GTK/Pango/Whatever 绑定,我可以自己编写一个程序(使用 Ruby/Python/Haskell/NodeJS),但首先我想看看是否有现成的程序(对我来说,C/C++ 程序总是更好,因为我使用的计算机相对较慢,并且脚本的启动时间很长(出于这个原因,顺便说一下,Java 是不可能的)。

答案1

Xft 库有多个XftTextExtents*用于计算字体度量的函数。您只需打开所需的字体并将XGlyphInfo结构的地址传递给XftTextExtentsUtf8()函数即可。

以下是实现该功能的最简单的程序。您可以像这样运行它:

$ ./xft_str_width "Droid Sans:size=12" "A Tale of Two Cities"
174

要编译它,请输入:

cc xft_str_width.c -o xft_str_width `pkg-config --cflags x11 xft freetype2` `pkg-config --libs x11 xft freetype2`

该程序:

#include <err.h>
#include <X11/Xft/Xft.h>

int main(int argc, char **argv) {
  Display *dpy = XOpenDisplay(getenv("DISPLAY"));
  if (!dpy) errx(1, "failed to open display %s", getenv("DISPLAY"));
  if (argc != 3) errx(1, "usage: xft_str_width font text-string");

  XftFont *font = XftFontOpenName(dpy, DefaultScreen(dpy), argv[1]);
  if (!font) errx(1, "no font match");

  XGlyphInfo info;
  XftTextExtentsUtf8(dpy, font, (FcChar8*)argv[2], strlen(argv[2]), &info);
  printf("%d\n", info.xOff);
}

有关XGlyphInfo结构和 Xft 库 API 的更多信息,请参阅这里

相关内容