我需要找到用某种字体显示的字符串的宽度(以像素为单位)。我知道我可以这样做:
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 的更多信息,请参阅这里。