[zt] Xft编程文档

转载 2004年08月04日 06:52:00

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);

linux 下的字体引擎(xtt freetype xfs xft)

转载:http://blog.csdn.net/wesleyluo/article/details/7470362   linux下主要使用xtt freetype xfs xft这四种字体引擎,...
  • air8412
  • air8412
  • 2012-10-11 19:40:04
  • 1069

linux按键驱动讲解

  • 2009年09月29日 06:54
  • 4KB
  • 下载

[ZT]全国车牌详解(含军牌)

全国车牌详解(含军牌) 当我们驾车在路上是不是经常看到一些很少见甚至不懂是什么部门的车牌呢?或许你能在这里找到答案哦!记得见到那些牛B的车牌可得。。。除非你比他更牛。。。不过我觉得我们吉普挂个“赛”...
  • u014461454
  • u014461454
  • 2014-03-31 17:31:20
  • 822

全程图解主板 (ZT)

 大家知道,主板是所有电脑配件的总平台,其重要性不言而喻。而下面我们就以图解的形式带你来全面了解主板。   一、主板图解   一块主板主要由线路板和它上面的各种元器件组成   1.线路板   PCB印...
  • wishfly
  • wishfly
  • 2005-12-20 12:48:00
  • 987

zlib api使用方法摘要[ZT]

使用方法: 包含zlib.h 连接时指明libz.so路径 compress,compress2为一次将所有串传入的压缩方法 int compress (Bytef *dest,   uLon...
  • vevenlcf
  • vevenlcf
  • 2014-03-03 10:50:05
  • 1378

ubuntu 12.04编译安装FOX TOOLKIT

fox的好处很多,简洁、开源和跨平台无疑非常吸引人。不过,在ubuntu下自己动手编译并安装fox还是费了一番周折。安装成功这个界面库对我而言是相当振奋人心的,因为这是我第一次在linux体验自己动手...
  • qtyl1988
  • qtyl1988
  • 2012-06-29 20:23:03
  • 1959

关于电梯算法的C++实现(zt)

众所周知,面向对象的程序设计更 适合对现实生活中的描述,更加体现了软件的工业化的精神,所以现在大部分的软件开发工作都围绕OOP的思想来进行的。但是在对现实生活中的实际问题,如何 对所研究的系统进行面向...
  • Jofee
  • Jofee
  • 2006-02-23 09:03:00
  • 1853

emacs with xft

emacs with xft (by hanlray(at)gmail.com)emacs21和即将发布的emacs22都是使用core font system的,因此效果比较差;emacs的cvs仓...
  • hansoft
  • hansoft
  • 2007-01-10 22:09:00
  • 1938

windows2003双机备份文档

  • 2011年01月24日 15:03
  • 923KB
  • 下载

国内最丰富的资源网站(ZT)

7年:http://www.7year.com/热战软件园:http://soft.rezhan.comwqsky:http://www.wqsky.com     (所有软件均有破解)非常点距:  ...
  • feijj2002_
  • feijj2002_
  • 2005-07-13 18:56:00
  • 1192
收藏助手
不良信息举报
您举报文章:[zt] Xft编程文档
举报原因:
原因补充:

(最多只允许输入30个字)