linux,C ++,xft:如何使用它?

我尝试使用Xft, 教程 ,让他们调用一个教程,看起来像写在朝鲜北方的营地…我也发现了这个。 所以让我尝试一步一步来做:

// g++ XftTest.cc -lX11 -lXft `pkg-config --cflags freetype2` #include<unistd.h> #include<X11/Xlib.h> #include<X11/Xutil.h> #include<X11/Xft/Xft.h> int main() { Display *display; XftFont *font; XftDraw *xftdraw; XRenderColor xrcolor; XftColor xftcolor; display = XOpenDisplay(0); Window XP = XCreateSimpleWindow(display,DefaultRootWindow(display),0,0,360,90,0,0,0); XMapWindow(display,XP); font = NULL; /* added 6/16 */ //font = XftFontOpenName(display,0,"NorthKorea-50"); // how to check if this is good ? font = XftFontOpenName(display,0,"") /* added 6/16 */ if (!font) return 1; xftdraw = XftDrawCreate(display,XP,DefaultVisual(display,0),DefaultColormap(display,0)); xrcolor.red =65535; xrcolor.green=0; xrcolor.blue =0; xrcolor.alpha=65535; XftColorAllocValue(display,DefaultVisual(display,0),DefaultColormap(display,0),&xrcolor,&xftcolor); XftDrawString8(xftdraw, &xftcolor, font, 20,70 , (XftChar8 *)"Joe Dalton", 10); XFlush(display); sleep(2); XftDrawDestroy(xftdraw); XftColorFree(display,DefaultVisual(display,0),DefaultColormap(display,0),&xftcolor); return 0; } 

如你所见,在XftFontOpenNameXftFontOpenName(display,0,"NorthKorea-50")如果你写了一个废话,就像我做的那样,没有任何错误或者告诉我没有一个叫做NorthKorea的字体。 这是有道理的,因为XftFontOpenName返回string中最近的字体。

那么,如何检查我的字体是否匹配? 我怎样才能使用像宋体的字体? 我试过XftFontOpenName(显示,0,“arial-50”),我没有什么不同。

在我的系统上,我的字体文件夹中有这些文件夹:

 $ls /usr/share/fonts/ 100dpi 75dpi cyrillic encodings misc OTF TTF Type1 util 

我可以用同样的方法在这些文件夹中使用任何字体吗?

如果你们有一些漂亮的互联网链接,我很高兴看看。

NB:没有xft标签…

更新6/16

我仍然坚持dat的东西…我不明白,如果我更换

 font = XftFontOpenName(display,0,"NorthKorea-50"); 

通过

 font = XftFontOpenName(display,0,""); 

它仍然加载一个字体…

xlsfonts返回了很多东西,比如dat:

 -monotype-courier new-bold-r-normal--0-0-0-0-m-0-iso8859-10 

但是将此作为parameter passing给XftFontOpenNameXftFontOpenName改变任何内容; 我尝试用XftFontOpenXlfd也加载一个字体,它总是返回NULL

Solutions Collecting From Web of "linux,C ++,xft:如何使用它?"

xft使用fontconfig进行字体发现。 xlsfonts是一种查询旧的X核心字体系统的fontconfig替换。 xlsfonts结果不会以任何可靠的方式映射到fontconfig状态。

所以:

  1. 忘记xft工作的任何捷径 – 就像上个世纪技术书籍中记载的X核心字体系统。 这是完全不同的。 它不是具有抗锯齿和truetype支持的X核心字体。 这是可以使用现代字体和做抗锯齿,但绝对不是任何形式的X核心字体

  2. 阅读fontconfig文档,系统上的fontconfig配置文件,并使用fontconfig实用程序(fc-query,fc-list等)查询fontconfig状态

  3. 作为维护xorg(x核心字体和fontconfig)的人已经告诉你,不要直接使用xft。 xft是第一次尝试编写新字体堆栈的产品。 它的功能不足以管理现代文本和现代字体。 处理现代字体格式复杂性的部分在很久以前就已经在pango中展开了(因为它证明是非常复杂的,它应该是一个单独的项目)。 如果你尝试单独使用xft,那么迟早你会碰到预编码的缺陷,没有人会有兴趣解决你的问题,因为相同的代码已经经历了十年的修复。 避免探戈不是一个捷径。 避免潘戈是试图依靠一个半完成的,放弃多年的项目。

  4. 忘记匹配一个特定的字体文件。 fontconfig将会积极地对抗任何以这种方式工作的企图。 在后核心字体的世界,你给字体系统一个字体模式,它会为你建立一个匹配的字体。 如果结果不是你期望的字体文件,那是因为文件被评估和发现缺乏。 如果你想fontconfig使用这个文件,你将不得不修改字体文件(添加缺少的字形,缺少的字体样式等),而不是写代码来试图强制它。 Fontconfig认为渲染用户可以阅读的文本更重要,而不仅仅是渲染宠物字体可以做的部分。 是的,现在你已经习惯了在其他系统上进行思考。 fontconfig是不同的。 没有什么重写将使其行为像你期望的那样。 没有人对这个重写感兴趣,因为大多数fontconfig在过去几年都非常成功。

字体 opentype 文本渲染 fontconfig linux

您不应将空字符串传递给XftFontOpenName并期望匹配一种字体。 Xft提供对核心字体的支持,嵌套在XftFont中的结构是XFontStruct和XftFontStruct的联合。 在创建新实例时,X11填充XFontStruct中的默认字体,所以在空字符串的情况下,您可能会获得默认的核心字体。

在最简单的方法中,可以像这样硬编码字体名称:

 const char *font_name = "Arial-20"; XftFont *font = XftFontOpenName (display, DefaultScreen(display), font_name); 

或者你可以使用XftFontMatch并在将模式传递给XftFontOpenPattern之前检查“结果”。 见http://keithp.com/~keithp/talks/xtc2001/paper/xft.html#sec-editing

请注意,XCloseDisplay丢失。