⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 minigui 体系结构之三逻辑字体以及多字体和多字符集实现.htm

📁 是一个标准的体系结构
💻 HTM
📖 第 1 页 / 共 4 页
字号:
  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&amp;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 + -