在x11中添加非常大的字体

时间:2017-03-01 12:32:11

标签: c linux fonts x11 true-type-fonts

我想在x11应用程序中添加字体。我尝试添加,但我发现使用字体名称更改其大小有困难。当我更改字体的点和像素时,它变成了非常小的字体。任何人都可以帮助获取大字体名称。

在这里,我附上了我尝试过的示例代码,

#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
    Display *d;
    Window w,w1, w2, w3;
    XEvent e;
    int s;
    XGCValues gr_values1 , gr_values2, gr_values3;
    XFontStruct *font1, *font2, *font3;
    GC gr_context1, gr_context2, gr_context3;
    XColor color, dummy;

    d=XOpenDisplay(NULL);
    if (d == NULL) {
        fprintf(stderr,"cant't open the display");
        exit(1);
    }
    s=DefaultScreen(d);

    w=XCreateSimpleWindow(d,RootWindow(d,s),0,0,DisplayWidth(d,s),DisplayHeight(d,s),2,BlackPixel(d,s),WhitePixel(d,s));
    w1=XCreateSimpleWindow(d,w,200,200,200,100,2,BlackPixel(d,s),WhitePixel(d,s));
    w2=XCreateSimpleWindow(d,w,400,200,200,100,2,BlackPixel(d,s),WhitePixel(d,s));
    w3=XCreateSimpleWindow(d,w,600,200,200,100,2,BlackPixel(d,s),WhitePixel(d,s));

    font1 = XLoadQueryFont(d, "-adobe-new century schoolbook-bold-r-normal--24-240-75-75-p-149-iso8859-9");
    font2 = XLoadQueryFont(d, "-adobe-new century schoolbook-bold-r-normal--18-180-75-75-p-113-iso8859-9");
    font3 = XLoadQueryFont(d, "-adobe-new century schoolbook-bold-r-normal--12-120-75-75-p-77-iso8859-9");
    XAllocNamedColor(d, DefaultColormap(d, s),"purple",&color,&dummy);

    gr_values1.font = font1->fid;
    gr_values1.foreground = color.pixel;
    gr_context1=XCreateGC(d,w,GCFont+GCForeground, &gr_values1);
    gr_values2.font = font2->fid;
    gr_values2.foreground = color.pixel;
    gr_context2=XCreateGC(d,w,GCFont+GCForeground, &gr_values2);
    gr_values3.font = font3->fid;
    gr_values3.foreground = color.pixel;
    gr_context3=XCreateGC(d,w,GCFont+GCForeground, &gr_values3);

    XSetFont(d,gr_context1,font1->fid);
    XSetFont(d,gr_context2,font2->fid);
    XSetFont(d,gr_context3,font3->fid);

    XSelectInput(d,w,ExposureMask);
    XSelectInput(d,w1,KeyPressMask);
    XSelectInput(d,w2,KeyPressMask);
    XSelectInput(d,w3,KeyPressMask);

    XMapWindow(d,w);

    while(1){
        XNextEvent(d, &e);
        if (e.xany.window == w) {
            if (e.type == Expose) {
                 XMapWindow(d,w1);
                 XMapWindow(d,w2);
                 XMapWindow(d,w3);
            }
        }
        if (e.xany.window == w1) {
            if (e.type == KeyPress) {
                XDrawString(d,w1,gr_context1,50,50,"hello",5);
                XDrawString(d,w2,gr_context2,50,50,"hello",5);
                XDrawString(d,w3,gr_context3,50,50,"hello",5);
            }
        }
    }
    XCloseDisplay(d);
    return 0;
}

output of above code

这些尺寸对我的应用来说还不够。例如,我需要size-96(在LibreOffice Writer中选择时) this is the font selected in LibreOffice Writer, this is size-96. I want like this

还建议加载TrueType字体

1 个答案:

答案 0 :(得分:2)

[因为简短的评论似乎不够充分解释]

一次一次:

  • 7/8位字符编码(每个字体最多256个符号),
  • 低分辨率屏幕(最大800×600)是常态,
  • 字体很少(没有真正的字体创建工具,逐像素设计)。

所以人们写了一些叫做X11核心字体系统的东西,其主要目的是帮助你选择一堆服务器端昂贵的付费企业256字符单分辨率位图字体。并且“帮助”采用了不明确的XFLD字符串形式,xfontsel作为帮助者。

然后发生了:

  • 桌面发布,
  • 矢量字体(Postscript),
  • 智能字体(TrueType,然后是OpenType:grit-fitting,提示,复杂的字形组成和定位,连字等),
  • 大型编码字体(Unicode),
  • 多方位语言,
  • 多面字体(不仅是常规+粗体+斜体),
  • 更大的字体可用性(用于Web的Microsoft核心字体,然后是GNOME的Bitstream Vera,然后是Open Fonts库,然后是Google fonts目录)
  • 更好的分辨率屏幕
  • HiDPI
  • 颜色字体
  • 符号字体(数学,工程符号和表情符号)

用户开始不关心XFLD字符串的大约90%的设置。

X11核心字体系统开始故障转移。它的服务器端缓存模型实际上是为小型单一尺寸位图字体设计的,而不是复杂的多兆字节矢量文件。

X11核心字体维护者(XFRee86然后Xorg)挣扎了一段时间以适应现代,然后放弃,因为整个设计完全不适应。

  • 他们将矢量字体光栅化(从矢量转换为位图)外包给freetype。
  • 使用fontconfig将字形缓存移到客户端(使用Xft作为踏脚石,您应该完全忘记)
  • 文字方向已移至freebidi。
  • TrueType / OpenType的“智能”部分对于freetype来说过于复杂,所以它再次外包给GTK(pango ......)和QT整形引擎
  • 然后(一旦两个团队厌倦了单独处理OpenType细节和规范更新)再次在harfbuzz-ng中合并。

每个复杂的开源软件操纵重要的文本都被移植到新堆栈。 Including massive codebases such as LibreOffice

大厂商注意到并开始直接为这些项目做出贡献(例如,现在freetype使用的CFF引擎是由Adobe编写的。市场上大多数Opentype OTF字体都使用CFF形状。)

唯一不关心的人是专有UNIX软件供应商,他们非常乐意向您推销围绕1980年SGI / Solaris / HP-UX工作站功能设计的过时图形代码,比如看不起Linux系统,并等待Windows NT风靡全球。他们的目标客户通常是工程/科学人员,只要没有其他选择并且计算似乎正确,他们就可以随时处理损坏的文本。虽然那些人喜欢他们的数据可视化图表。我怀疑HiDPI将成为科学软件在X11位图字体时代的终结。

因此:

  • 不要试图推动X11核心字体系统超出其限制,许多其他人在你之前尝试并最终放弃它
  • 除非你想被降级到与上世纪Unix工作站相同的坟墓场,否则在你还有一些用户时将你的代码移植到fontconfig + freebidy + freetype + harfbuzz-ng
相关问题