[zt] Xft编程文档

http://www.linuxfans.org/nuke/modules.php?name=News&file=article&op=view&sid=1981

 cjacker写著 '
Xft 编程技术


一、首先有几点要说明的:
1,字体技术已经越发的用户透明。两大UI及其衍生套间都已经还好的彻底封装了字体技术
比如,GTK2 采用了pango字体引擎,Qt也很好的封装了Xft及X核心字体实现,所以,用户进行gtk2或者Qt以上等级的程序开发时不需要考虑任何字体实现的问题。
也就是说,如果你要采用Xft进行应用程序开发,你必须保证你使用的UI套件支持了Xft,除非你使用Xlib编程,完全自己处理字体。


2,Xft负责是用户接口,担负freetype和X渲染的界面任务,不负责任何字体渲染,我们可以理解成Xft是一套新的字体管理工具和编程接口, fontConfig负责的是Xft的配置,可以理解成Xft的配置工具,而真正负责字体渲染和字体实现的是freetype和X;一般的应用程序,包括 Xlib程序的开发,不需要考虑任何的字体渲染的问题。
Xft将有关字体应用的编程从XFontSet, -misc-song---------等复杂的字体集中解放出来。


二、数据类型和函数:
开始之前要先完成几个假定:
Display *dis并完成dis的初始化。
int iscreen=DefaultScreen(dis);
Window win=....定义一个窗口。



定义样式XftPattern:
顾名思义,Xft样式,他是一套键值对的集合,每个键都定义了字体的一种属性,XftPattern用于定义某种字体。
比较常用的几个是
family String型 字体族,也就是我们常说的Helvetiva, DongWen--Song等
style String型 字体风格,比如Bold, Italic, Bold Italic
pixelsize Double型 字体大小
antialias Bool型 是否AA,也就是是否平滑边缘。

构造一个空XftPattern的方法:
XftPattern *pattern;
pattern = XftPatternCreate();

为pattern设置属性:
因为XftPattern的属性是各种类型的键值对,所以存在不同的属性添加函数:
处理String型, 使用XftPatternAddString(pattern, “family”, “DongWen—Song”);
将family定义为DongWen—Song

处理Int/Double型,使用XftPatternAddInteger(pattern, “pixelsize”, 48);
将大小定义48,或者采用XftPatternAddDouble();

处理Bool型, 使用XftPatternAddBool(pattern, “ antialias”, 1);
使用AA平滑。

这样就可以基本完成字体的定义了。





匹配字体XftFontMatch:
XftResult result;
XftPattern * XftFontMatch(Display *dis, int iscreen, XftPattern *pattern, XftResult *result);
返回最接近用户定义的样式的样式,用户可能一厢情愿的进行了字体样式定义,比如,明明某种字体没有粗体,但是用户使用
XftPatterAddString(pattern, “style”, “Bold”)定义了粗体,通过XftFontMatch可以对字体样式进行一次检验和过滤,取得最接近用户定义的合法样式。


生成字体XftFont:
指向字体的指针
XftFont * XftFontOpenPattern(Display *dis, XftPattern *pattern)
上面的例子,我们就可以使用
XftResult result;
XftFont *xftFont;
xftFont = XftFontOpenPattern(dis, XftFontMatch(dis, iscreen, pattern, &result);

画到哪里? XftDraw:
Xft需要知道自己应该将什么作为输出的目标,XftDraw是对X相关功能的封装,
XftDraw * xftDrawCreate(Display *dis, Drawable drawable,Visual *visual, Colormap colormap);

针对的本例,我们的XftDraw可以这么创建。
XftDraw *xftDraw;
xftDraw = XftDrawCreate((dis, win, DefaultVisual (dis, DefaultScreen (dis)), DefaultColormap (dis, DefaultScreen (dis)));
很明确,我们要画到上面创建的窗口上。


改变Draw的目标
void XftDrawChange(XftDraw *draw, Drawable drawable);
比如假定还存在一个win2,我们完成对win的输出之后,就可以使用
XftDrawChange(xftDraw, win2)来将目标确定win2.
以什么颜色输出 XftColor
颜色的配置是通过下面一个结构定义的:
typedef struct {
unsigned short red;
unsigned short green;
unsigned short blue;
unsigned short alpha;
} XRenderColor;
typedef struct _XftColor {
unsigned long pixel;
XrenderColor color;
}XftColor;
通过XftColorAllocValue函数完成。

举个例子:
XftColor xftColor;
XrenderColor renderColor;

renderColor.red=0xEEEE;
renderColor.green=0xAAAA;
renderColor.blue=0xDDDD;
renderColor.alpha=0xFFFF;

XftColorAllocValue (dis, DefaultVisual (dis, DefaultScreen (dis)), DefaultColormap (dis, DefaultScreen (dis)), &renderColor, &xftColor);


输出 XftDrawString??? XftDrawRect:
Xft一共有4个输出文本的函数,区别在于接受string的类型不同。
void
XftDrawString8 (XftDraw *d,
XftColor *color,
XftFont *font,
int x,
int y,
XftChar8 *string,
int len);

void
XftDrawString16 (XftDraw *draw,
XftColor *color,
XftFont *font,
int x,
int y,
XftChar16 *string,
int len);

void
XftDrawString32 (XftDraw *draw,
XftColor *color,
XftFont *font,
int x,
int y,
XftChar32 *string,
int len);

void
XftDrawStringUtf8 (XftDraw *d,
XftColor *color,
XftFont *font,
int x,
int y,
XftChar8 *string,
int len);
对英文,用什么都无所谓,对中文,只能采用XftDrawStringUtf8,这个函数也为我们提供了同时处理多语言的可能。

iconv_t convUTF8;
convUTF8=iconv_open(“UTF-8”,”GBK”);

char * str = "测试Xft";
int l1, l2;
char * ps;
char strOut[100] = "";
l1 = strlen(str);
l2 = 99;
ps = strOut;

l1 = iconv(convUTF8, (char **)(&str),&l1, &ps, &l2);

完成普通GBK文本到UTF8的转换。

XftDrawStringUtf8 (xftDraw, &xftColor, xftFont, 100, 100, strOut, strlen (strOut));
在目标窗口的x=100, y=100的位置以xftFont为字体,画出xftColor颜色的文本。

XftDrawRect (xftDraw, &xftColor, 120,120,100,100);
在目标窗口的x=120, y =120的为止,画出宽100,高100的xftColor颜色的实心矩形。



不要留尾巴:
XftPatternDestroy(pattern);
XftDrawDestroy(xftDraw);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值