📄 minigui 体系结构之三逻辑字体以及多字体和多字符集实现.htm
字号:
54 int last_rightSideBearing;
55 int last_advanceX;
56 int last_advanceY;
57 unsigned long last_bpp;
58 char * last_bits;
59
60 } TYPE1INSTANCEINFO, *PTYPE1INSTANCEINFO;
61
</PRE></TD></TR></TBODY></TABLE>
<P>如前面所说,TYPE1INFO和TYPE1INSTANCEINFO数据结构来存储设备字符的类信息和实例信息。初始华时,其实只是注册一个模板,此时利用TYPE1INFO记住其在
T1lib中的Font ID,这里valid用来说明该设备字体是否初始化完毕。</P>
<P>当用户创建一逻辑字体时,如果用户选择的是Type1字体的某一种,就会调用 font_ops 的函数new_instance,该函数根据存在于
DevFont 的data的 TYPE1INFO 结构中的
id,以及用户提供的相关参数,构造一个TYPE1INSTANCEINFO类型的变量,并放入新的设备字体的私有数据data中。从而每个字体实例可以有自己的各种属性。如旋转度。</P>
<P>前面各个字段的意义可以根据名字推测出来,从csUnix2Pixel
开始则是为了实现的方便和高效而自己定义的一些变量,后面解释函数实现时将会说明。last*系列函数主要起缓冲的作用。</P>
<P>2) InitType1Fonts 和 TermType1Fonts 函数</P>
<P>这两个函数负责整个 Type 1 字体的初始化和终结。</P>
<P>InitType1Fonts 的主要任务是:初始化T1lib,根据配置文件提供的信息,将各种字体注册到T1lib,并为每一个字体生成一个
DevFont 结构,注册到系统中去。该结构中包括的 font_ops,是上层对Type 1字体各种操作的窗口。</P>
<P>其实主要的处理功能在 T1lib 中,每次程序向 T1lib 注册一个字体,T1lib会返回一个 Font ID,以后利用该ID
向T1lib请求关于对应字体的某些服务。</P>
<P>TermType1Fonts 则是注销 Type1 字体,关闭T1lib。</P>
<P>InitType1Fonts 注册向系统注册了用来处理 Abode Type1
字体的字体操作集,定义如下(src/font/type1.c):</P>
<TABLE class=code-sample cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><PRE> 780 static FONTOPS type1_font_ops = {
781 get_char_width,
782 get_str_width,
783 get_ave_width,
784 get_max_width,
785 get_font_height,
786 get_font_size,
787 get_font_ascent,
788 get_font_descent,
789 char_bitmap_size,
790 max_bitmap_size,
791 get_char_bitmap,
792 get_char_pixmap,
793 start_str_output,
794 get_char_bbox,
795 get_char_advance,
796 new_instance,
797 delete_instance
798};
</PRE></TD></TR></TBODY></TABLE>
<P>先说明一些基本概念。</P>
<UL>
<LI>ascent:描述某个字符在基准线上有多少扫描线。这里以像素为单位(下同)。
<LI>descent:描述某个字符在基准线下有多少扫描线。当字符的底线在基准线之下时,用负值来表示,所以整个字符的高度就是 ascent -
descent。
<LI>leftSideBearing:某个字符从其原点到最左边像素点的水平距离,也可以称为该字符的left margin。
<LI>rightSideBearing:某个字符从其原点到最右边像素点的水平距离,也可以称为该字符的right margin。
<LI>advanceX:在某字符的图象被放置后,当前原点需要前进的水平距离。它通常比字符图像的宽度要大,因为两个字符之间存在一定的空白。由于该值对齐至像素,所以一些要求精确的内部计算不能用它,会累积误差。
<LI>advanceY:在某字符的图象被放置后,当前原点需要前进的竖直距离。 </LI></UL>
<P>这样,get_char_width、get_str_width、get_ave_width、get_max_width、get_font_height、get_font_size、get_font_ascent、get_font_descent、char_bitmap_size、max_bitmap_size、get_char_advance
等函数的功能就很明显了,它们其实就是取出字体的一些度量(Metrics)。其实,这些信息都是从T1lib内部取得,需要注意的是T1lib 内部使用
PS 单位,而MiniGUI使用的单位是pixel, 需要转换。以下以 get_char_bitmap 和 get_char_pixmap
等函数为例说明。</P>
<P>3) get_char_bitmap 和 get_char_pixmap</P>
<P>这两个函数是主要的光栅化函数。它们首先判断一下需要光栅化的字符是否刚刚被光栅化过,如果是,直接返回缓冲里的值。</P>
<P>前面讲过,T1Lib
支持5灰度的低分辨率和17灰度的高分辨率的反走样。这里的get_char_bitmap返回普通的光栅化位图,而get_char_pixmap返回经过反走样后的像素位图。如果字体在初始化时调用</P>
<TABLE class=code-sample cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><PRE>T1_AASetLevel (T1_AA_LOW)
</PRE></TD></TR></TBODY></TABLE>
<P>则这里使用5灰度像素,如果初始化时是调用:</P>
<TABLE class=code-sample cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><PRE>T1_AASetLevel (T1_AA_HIGH)
</PRE></TD></TR></TBODY></TABLE>
<P>则这里使用17灰度像素。</P>
<P>这里使用的反走样其实很简单,就是先将字体放大,然后再取样缩小。低精度是放大四倍(2*2),高精度则是放大16倍(4*4),灰度值则有n+1种。</P>
<P>当然,为了提高性能,每次光栅化的结果都要被放到缓冲里,下次如果要光栅化相同的字符,并且方式相同,则可以大大地提高效率。</P>
<P>4) start_str_output</P>
<P>开始字符串输出时调用该函数。完成一些初始化工作。</P>
<P>5) get_char_bbox</P>
<P>给出当前原点值(*px,*py),调用该函数要求得到在字符被画出后的原点值(新的*px,*py),以及当前字符的宽度和高度。</P>
<P>6) new_instance 和 delete_instance</P>
<P>当用户创建一个新的逻辑字体时调用new_instance ,当用户删除一个逻辑字体时会调用delete_instance。</P>
<P>new_instance
根据传给它的一些参数(size,rotation,font_id等)初始化一个TYPE1INSTANCEINFO类型的变量,并将其与新的设备字体关联,将该设备字体返回。以后上层就通过该设备字体得到字体实例相关的信息。</P>
<P>delete_instance 则用来删除相关的数据结构。</P><A id=5 name=5></A>
<P><STRONG class=subhead>5 小结</STRONG></P>
<P>面向对象技术在软件设计当中占有非常重要的地位,但面向对象并不是 C++
等语言的专利。实际上,在诸如操作系统等系统软件当中,面向对象技术的使用是非常广泛的。利用 C
语言实现面向对象技术,不仅结构清晰,而且在执行效率等方面也有 C++
等语言无法相比的优势。从本文描述的字体和字符集的实现当中我们可以看到,采用面向对象技术,将大大提高系统的灵活性和可扩展性。</P>
<P>MiniGUI
作为一个面向实时嵌入式系统的图形用户界面支持系统,对其执行效率、可定制、可扩展等方面有非常高的要求。为了提高系统的灵活性和可扩展性,我们在一些关键模块当中使用了面向对象的技术。实践表明,面向对象的技术在
MiniGUI 中的运用是成功的。</P><A id=resources name=resources></A>
<P><STRONG class=subhead>资源</STRONG></P>
<UL>
<LI><B>字符集及字体</B> </LI></UL>
<UL>
<LI><A
href="http://czyborra.com/charsets/iso8859.html">ISO8859字符集及BDF字体</A>
<LI><A
href="http://www.oreilly.com/people/authors/lunde/cjk_inf.html">CJK
字符集信息大全</A>
<LI><A
href="http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib/t1lib.html">T1Lib
库</A> </LI></UL>
<UL class=noindent>
<LI><B>MiniGUI 资源</B> </LI></UL>
<UL>
<LI><A href="http://www.minigui.org/">MiniGUI 主页</A>
<LI><A href="ftp://ftp.minigui.org/pub/minigui">MiniGUI FTP 站点</A>
</LI></UL>
<UL class=noindent>
<LI><B>MiniGUI 邮件列表</B> </LI></UL>
<UL>
<LI>发信:<A
href="mailto:minigui-devel@egroups.com">minigui-devel@egroups.com</A>
<LI>订阅:<A
href="mailto:minigui-devel-subscribe@egroups.com">minigui-devel-subscribe@egroups.com</A>
<LI>解除订阅:<A
href="mailto:minigui-devel-unsubscribe@egroups.com">minigui-devel-unsubscribe@egroups.com</A>
</LI></UL><A id=author name=author></A>
<P><STRONG class=subhead>关于作者</STRONG><BR>魏永明(<A
href="mailto:ymwei@minigui.org">ymwei@minigui.org</A>),男,27
岁,工学硕士,现任蓝点软件(深圳)有限公司北京研发中心技术主管。国内最有影响的自由软件项目之一-- MiniGUI
的创始人以及主要开发人员。著有《Linux 实用教程》与《学用 Linux 与 Windows NT》,并主持翻译了《Red Hat Linux
奥秘》、《Linux 编程宝典》 等大量优秀的 Linux 技术著作。是清华大学 AKA Linux 编程技术系列讲座的主讲人。</P><!-- End paper --><BR></TD>
<TD vAlign=top width=8><IMG height=1 alt=""
src="MiniGUI 体系结构之三逻辑字体以及多字体和多字符集实现.files/c.gif" width=8></TD></TR>
<TR vAlign=top height=8>
<TD vAlign=top width=8></TD>
<TD vAlign=top width=8></TD>
<TD vAlign=top width=8></TD></TR>
<TR vAlign=top height=8>
<TD vAlign=top width=8><!-- gutter --></TD>
<TD vAlign=top width=8><!-- comments #7: rate article form -->
<TABLE cellSpacing=0 cellPadding=0 width=150 border=0>
<TBODY>
<TR>
<TD width="100%" bgColor=#cc6633 height=3><IMG height=3 alt=""
src="MiniGUI 体系结构之三逻辑字体以及多字体和多字符集实现.files/c.gif" width=150
border=0></TD></TR>
<TR>
<TD width="100%" bgColor=#333333 height=1><IMG height=1 alt=""
src="MiniGUI 体系结构之三逻辑字体以及多字体和多字符集实现.files/c.gif" width=150
border=0></TD></TR>
<TR>
<TD width="100%" bgColor=#000000 height=1><IMG height=1 alt=""
src="MiniGUI 体系结构之三逻辑字体以及多字体和多字符集实现.files/c.gif" width=150
border=0></TD></TR>
<TR>
<TD width="100%" bgColor=#ffffff height=5><IMG height=5 alt=""
src="MiniGUI 体系结构之三逻辑字体以及多字体和多字符集实现.files/c.gif" width=150
border=0></TD></TR>
<TR vAlign=top>
<TD>
<FORM
action=/developerWorks/cn/cnratings.nsf/RateArticle?CreateDocument
method=post><!-- comments #7: paste title here --><INPUT type=hidden
value="MiniGUI 体系结构之三:逻辑字体以及多字体和多字符集实现" name=ArticleTitle> <!-- comments #7: paste zone here --><INPUT type=hidden value=Linux
name=Zone> <INPUT type=hidden value="simplified chinese"
name=region> <INPUT type=hidden
value=/developerWorks/cn/thankyou/feedback-linux.html
name=RedirectURL> <FONT face=helvetica,helv,arial
size=-1><B>您对这篇文章的看法如何?</B></FONT>
<P></P>
<TABLE cellSpacing=0 cellPadding=0 width=570 border=0>
<TBODY>
<TR vAlign=top>
<TD><INPUT type=radio value=5 name=Rating><FONT
face="HELVETICA, HELV, ARIAL" size=-1>真棒!</FONT></TD>
<TD><INPUT type=radio value=4 name=Rating><FONT
face="HELVETICA, HELV, ARIAL" size=-1>好材料</FONT></TD>
<TD><INPUT type=radio value=3 name=Rating><FONT
face="HELVETICA, HELV, ARIAL" size=-1>一般;尚可</FONT></TD>
<TD><INPUT type=radio value=2 name=Rating><FONT
face="HELVETICA, HELV, ARIAL" size=-1>需提高</FONT></TD>
<TD><INPUT type=radio value=1 name=Rating><FONT
face="HELVETICA, HELV, ARIAL"
size=-1>太差!</FONT></TD></TR></TBODY></TABLE><BR><FONT
face=helvetica,helv,arial size=-1><B>建议?</B></FONT><BR><TEXTAREA name=Comments rows=3 wrap=virtual cols=52></TEXTAREA><BR><BR><INPUT type=submit value=提交反馈意见></FORM></TD></TR></TBODY></TABLE><!-- end rate article form --></TD>
<TD vAlign=top width=8></TD></TR>
<TR vAlign=top height=8>
<TD vAlign=top width=8></TD>
<TD vAlign=top width=8></TD>
<TD vAlign=top
width=8></TD></TR></TBODY></TABLE><!-- end content --></TD></TR></TABLE><!-- ---------------footer------------------- -->
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD align=right width="100%" colSpan=2 height=30>(c) Copyright IBM Corp.
2001, (c) Copyright IBM China 2001, All Right Reserved</TD></TR>
<TR>
<TD width=150>
<TABLE cellSpacing=0 cellPadding=0 width=150 border=0>
<TBODY>
<TR bgColor=#000000>
<TD align=middle width=49><A class=nav style="COLOR: #ffffff"
href="http://www.ibm.com/privacy/"><FONT face="Arial, sans-serif"
color=#ffffff size=-1>隐私</FONT></A></TD>
<TD width=1 bgColor=#959595><IMG height=20 alt=""
src="MiniGUI 体系结构之三逻辑字体以及多字体和多字符集实现.files/c.gif" width=1
border=0></TD>
<TD align=middle width=49><A class=nav style="COLOR: #ffffff"
href="http://www.ibm.com/legal/"><FONT face="Arial, sans-serif"
color=#ffffff size=-1>法律</FONT></A></TD>
<TD width=1 bgColor=#959595><IMG height=20 alt=""
src="MiniGUI 体系结构之三逻辑字体以及多字体和多字符集实现.files/c.gif" width=1
border=0></TD>
<TD align=middle width=49><A class=nav style="COLOR: #ffffff"
href="http://www.cn.ibm.com/Main.nsf/HTMLS/aboutibm&contactus"><FONT
face="Arial, sans-serif" color=#ffffff size=-1>联系</FONT></A></TD>
<TD width=1 bgColor=#959595><IMG height=21 alt=""
src="MiniGUI 体系结构之三逻辑字体以及多字体和多字符集实现.files/c.gif" width=1
border=0></TD></TR></TBODY></TABLE></TD>
<TD width="100%" bgColor=#000000><IMG height=1 alt=""
src="MiniGUI 体系结构之三逻辑字体以及多字体和多字符集实现.files/c.gif" width=1
border=0></TD></TR></TBODY></TABLE>
<SCRIPT language=JavaScript1.2
src="MiniGUI 体系结构之三逻辑字体以及多字体和多字符集实现.files/stats.js"
type=text/javascript></SCRIPT>
<NOSCRIPT><IMG height=1 alt=""
src="D:\新建文件夹\MiniGUI 体系结构之三逻辑字体以及多字体和多字符集实现.files\c(2).gif" width=1
border=0></NOSCRIPT> </BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -