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

(ZT)《openssl 编程》之大数

original url from http://caisenchen.blog.163.com/blog/static/552865502008764841738/11.1 介绍 ...
  • LostSpeed
  • LostSpeed
  • 2016年11月20日 11:51
  • 242

Posix线程编程zt

互斥锁 尽管在Posix Thread中同样可以使用IPC的信号量机制来实现互斥锁mutex功能,但显然semphore的功能过于强大了,在Posix Thread中定义了另外一套专门用于线程同步的...
  • liangshoulong
  • liangshoulong
  • 2017年08月04日 21:58
  • 43

C++MFC编程笔记day05 文档类-单文档和多文档应用程序

文档类    1 相关类    CDocument类-父类是CCmdTarget类,所以,文档类也可以处理菜单等               命令消息。作用保存和管理数据。    注意事项:如何解决断...
  • pukuimin1226
  • pukuimin1226
  • 2014年07月30日 08:59
  • 4989

VS2013/MFC编程入门之一(利用MFC向导生成单文档应用程序框架)

关于VS2013和MSDN如何安装,网上有很多教程,再次就不在赘述,相信大家都已经安装好了。本次MFC编程全程使用简体中文专业版VS2013 进行操作。这一讲给大家一个简单的例子,演示如何生成单文档应...
  • zhaoyinhui0802
  • zhaoyinhui0802
  • 2016年11月22日 22:11
  • 4295

C++模板元编程(zt)

C++模板元编程 摘要 本文简述了模板元编程技术的起源、概念和机制, 并介绍了模板元编程技术在Blitz++和Loki程序库中的应用。  关键字 编译期计算  模板元编程  Blitz++ ...
  • liangshoulong
  • liangshoulong
  • 2017年08月04日 21:59
  • 75

【UE4官方文档翻译】Introduction to C++ Programming in UE4 (介绍UE4中的C++编程)

本文转载自:http://blog.csdn.net/nmnm080/article/details/46571955 Unreal Engine 4.7 原文链接:https://docs...
  • Szu_IT_Man
  • Szu_IT_Man
  • 2016年01月18日 23:49
  • 1923

MS Office 自动化编程 - 从Word文档中获取文档属性

学习Office自动化之前先阅读一些COM书籍,对于理解Office自动化有很大帮助。以下示例代码使用VS2010进行编译。目前市面上已有的关于Office自动化的书籍,多是快餐式的,看过之后只能知道...
  • Augusdi
  • Augusdi
  • 2013年10月24日 15:19
  • 3904

Java操作Excel编程接口

利用java操作Excel,有个开源的东东-jxl.jar,可以到http://sourceforge.net/project/showfiles.php?group_id=79926下载。 下面列...
  • muzizhuben
  • muzizhuben
  • 2014年10月28日 16:16
  • 1078

编程规范 --- 排版

1-1:程序块要采用缩进风格编写,缩进的空格数为4个。 说明:对于由开发工具自动生成的代码可以有不一致。 1-2:相对独立的程序块之间、变量说明之后必须加空行。 示例:如下例子不符合规范。 i...
  • XiaoXiaoPengBo
  • XiaoXiaoPengBo
  • 2016年06月04日 11:35
  • 1579

C++ 泛型编程系列讲座之实施zt

C++ 泛型编程系列讲座之实施 你知道,当一个概念从一个专有名词变成一个普通名词时,说明它真正的深入人心了。比如Kleenex(面巾纸品牌,也指面巾纸),Xerox(施乐,复印机品牌,也指复印机)Q...
  • liangshoulong
  • liangshoulong
  • 2017年08月04日 21:59
  • 61
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[zt] Xft编程文档
举报原因:
原因补充:

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