?? 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 + -