?? minigui 體系結構之三邏輯字體以及多字體和多字符集實現.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0082)http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-7/index.shtml -->
<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現</TITLE>
<META
content="linux, linux tutorials, linux training, linux standards, linux code, linux resources, linux programming, open source standards, linux how to, IBM, linux 教程, linux 培訓,Linux 文章, Linux 論文, linux 標準, Linux 白皮書 linux 代碼, linux 參考資料, linux 編程, 開放源碼標準"
name=KEYWORDS>
<META content=嵌入,MiniGUI,體系結構,邏輯字體,多字體,多字符集 name=KEYWORDS>
<META
content="本文是 MiniGUI 體系結構系列文章的第三篇,重點介紹 MiniGUI 的邏輯字體支持,主要內容涉及 MiniGUI 中以面向對象技術為基礎構建的多字體和多字符集支持,并舉例說明了如何在 MiniGUI 中實現對新字符集和新字體的支持。"
name=ABSTRACT>
<META
content="本文是 MiniGUI 體系結構系列文章的第三篇,重點介紹 MiniGUI 的邏輯字體支持,主要內容涉及 MiniGUI 中以面向對象技術為基礎構建的多字體和多字符集支持,并舉例說明了如何在 MiniGUI 中實現對新字符集和新字體的支持。"
name=DESCRIPTION>
<META content=public name=SECURITY>
<META content=papers_html name=dWCategory>
<META content=Linux name=zone>
<META http-equiv=Content-Type content="text/html; charset=GB2312">
<META content=index,follow name=ROBOTS>
<META content=2000xxxx name="LAST UPDATED"><LINK
href="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/style.css" type=text/css
rel=stylesheet>
<SCRIPT language=JavaScript type=text/javascript><!-- function nav_pulldown(list) {top.document.location.href = list.options[list.selectedIndex].value;} function wB(){var br="BR";if((navigator.userAgent.indexOf('Mozilla')!= -1)&&((navigator.userAgent.indexOf('Spoofer')==-1)&&(navigator.userAgent.indexOf('compatible')==-1))){br="NS"}return br} function wV(br){var bv=0;bv=navigator.appVersion.substring(0,1);if(br=="IE"){(parseInt(bv));}if(br=="NS"){(parseInt(bv));}return bv;} function wP(){var os="OS";if(navigator.userAgent.indexOf("OS/2")!=-1){os='os/2'}return os;}b=wB();v=wV(b);o=wP(); function change_bgColor() {if (b=="NS" && v==2 && o != "os/2"){document.bgColor="#999999"}} function gotosite() {var L = document.formSpinbox.pickWW.selectedIndex; location.href = document.formSpinbox.pickWW.options[L].value; return false;}//--></SCRIPT>
<LINK href="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/style3.css" type=text/css
rel=stylesheet><!-- comments #2 --><!-- begin insert header includes -->
<META content="MSHTML 6.00.2800.1479" name=GENERATOR></HEAD>
<BODY aLink=#0000ff bgColor=#ffffff leftMargin=2 topMargin=2 marginwidth="2"
marginheight="2">
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR bgColor=#006699>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width=300 border=0>
<TBODY>
<TR bgColor=#006699>
<TD width=150><IMG height=25 alt=IBM
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/mast_logo.gif"
width=150></TD>
<TD width=150
background="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/mgradient.gif"><FONT
face="arial, sans-serif" color=#99ccff
size=-1><B>China</B></FONT><BR><IMG height=1 alt=""
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/c.gif"
width=150></TD></TR></TBODY></TABLE></TD>
<TD align=left>
<TABLE cellSpacing=0 cellPadding=0 width=300 border=0>
<TBODY>
<TR>
<TD width=100><A
href="http://www-900.ibm.com/cgi-bin/click.p?url=http://www.ibm.com/shop/cn"><IMG
height=25 alt=購物
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/shopibm.gif" width=100
border=0></A></TD>
<TD width=100><A
href="http://www-900.ibm.com/cgi-bin/click.p?url=http://www.ibm.com/cn/support"><IMG
height=25 alt=技術支持
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/support_chs.gif" width=100
border=0></A></TD>
<TD width=100><A
href="http://www-900.ibm.com/cgi-bin/click.p?url=http://www.ibm.com/cn/support/product"><IMG
height=25 alt=免費下載
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/downloads_chs.gif"
width=100 border=0></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR bgColor=#000000>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width=600 border=0>
<TBODY>
<TR>
<TD width=150 bgColor=#006699><IMG height=21 alt=""
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/mast_lnav_sp.gif"
width=150></TD>
<TD bgColor=#000000 colSpan=4>
<TABLE height=21 cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD align=middle width=79 bgColor=#000000 height=21><A
class=nav style="COLOR: #ffffff"
href="http://www-900.ibm.com/cgi-bin/click.p?url=http://www.ibm.com/cn"><B>IBM
主頁</B></A></TD>
<TD width=1 bgColor=#959595><IMG height=1 alt=""
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/c.gif" width=1></TD>
<TD align=middle width=79 bgColor=#000000 height=21><A
class=nav style="COLOR: #ffffff"
href="http://www-900.ibm.com/cgi-bin/click.p?url=http://www.ibm.com/products"><B>產品</B></A></TD>
<TD width=1 bgColor=#959595><IMG height=1 alt=""
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/c.gif" width=1></TD>
<TD align=middle width=79 bgColor=#000000 height=21><A
class=nav style="COLOR: #ffffff"
href="http://www-900.ibm.com/cgi-bin/click.p?url=http://www.ibm.com/cn/services"><B>咨詢</B></A></TD>
<TD width=1 bgColor=#959595><IMG height=1 alt=""
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/c.gif" width=1></TD>
<TD align=middle width=79 bgColor=#000000 height=21><A
class=nav style="COLOR: #ffffff"
href="http://www-900.ibm.com/cgi-bin/click.p?url=http://www.ibm.com/cn/industry"><B>行業</B></A></TD>
<TD width=1 bgColor=#959595><IMG height=1 alt=""
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/c.gif" width=1></TD>
<TD align=middle width=79 bgColor=#000000 height=21><A
class=nav style="COLOR: #ffffff"
href="http://www-900.ibm.com/cgi-bin/click.p?url=http://www.ibm.com/cn/news"><B>新聞</B></A></TD>
<TD width=1 bgColor=#959595><IMG height=1 alt=""
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/c.gif" width=1></TD>
<TD align=middle width=79 bgColor=#000000 height=21><A
class=nav style="COLOR: #ffffff"
href="http://www-900.ibm.com/cgi-bin/click.p?url=http://www.ibm.com/cn/ibm"><B>關于
IBM</B></A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD> <A
href="http://www-900.ibm.com/developerWorks/cn/index.html"><B>dW
中國站點</B></A><B> : </B><A
href="http://www-900.ibm.com/developerWorks/cn/linux/"
target=_top><B>Linux 概覽</B></A><B> : </B><B><A
href="http://www-900.ibm.com/developerWorks/cn/cnpapers.nsf/linux-papers-bynewest?OpenView&count=500">文檔庫
- 論文</A></B></TD></TR>
<TR>
<TD width="100%"><IMG height=1 alt=""
src="D:\新建文件夾\MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files\c(1).gif" width=8></TD>
<TR>
<TD bgColor=#cc6633 height=3><IMG height=3 alt=""
src="D:\新建文件夾\MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files\c(1).gif"
width=150></TD></TR>
<TR>
<TD bgColor=#333333 height=1><IMG height=1 alt=""
src="D:\新建文件夾\MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files\c(1).gif"
width=150></TD></TR>
<TR>
<TD bgColor=#000000 height=1><IMG height=1 alt=""
src="D:\新建文件夾\MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files\c(1).gif"
width=150></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR colspan="3">
<TD width=8><!-- gutter --><IMG height=1 alt=""
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/c.gif" width=8></TD>
<TD></TD></TR>
<TR>
<TD vAlign=top width=8><!-- gutter --><IMG height=1 alt=""
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/c.gif" width=8></TD>
<TD vAlign=top><BR>
<P><STRONG class=title>MiniGUI 體系結構之三</STRONG><BR><STRONG
class=subtitle>邏輯字體以及多字體和多字符集實現</STRONG></P>
<P>魏永明<BR>藍點軟件(北京)研發中心技術主管<BR>2001/02/28</P><!-- END title and author lines --><!-- Editor #5: Begin Table of Contents -->
<TABLE cellSpacing=0 cellPadding=0 width=137 align=right border=0>
<TBODY>
<TR>
<TD align=middle bgColor=#cc6633><FONT face=helvetica,helv,arial
color=#ffffff size=-1><B>內容:</B></FONT></TD></TR>
<TR>
<TD width="100%" bgColor=#000000><FONT face=helvetica,helv,arial
size=-3><IMG height=1 alt=""
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/c.gif" width=1
border=0></FONT></TD></TR>
<TR>
<TD width="100%" bgColor=#ffffff><FONT face=helvetica,helv,arial
size=-3><IMG height=4 alt=""
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/c.gif" width=1
border=0></FONT></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-7/index.shtml#1"><FONT
face=宋體 size=2>引言</FONT></A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-7/index.shtml#2"><FONT
face=宋體 size=2>邏輯字體、設備字體以及字符集之間的關系</FONT></A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-7/index.shtml#3"><FONT
face=宋體 size=2>MiniGUI 中的字符集支持</FONT></A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-7/index.shtml#4"><FONT
face=宋體 size=2>MiniGUI 中的字體支持</FONT></A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-7/index.shtml#5"><FONT
face=宋體 size=2>小結</FONT></A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-7/index.shtml#resources"><FONT
face=宋體 size=2>資源</FONT></A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/minigui-7/index.shtml#author"><FONT
face=宋體 size=2>關于作者</FONT></A></TD></TR>
<TR>
<TD bgColor=#000000><FONT face=helvetica,helv,arial size=-3><IMG
height=3 alt="" src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/c.gif"
width=137></FONT></TD></TR></TBODY></TABLE><BR><BR><!-- End Table of Contents --><!-- comments #6: html content of the paper -->
<P><EM>本文是 MiniGUI 體系結構系列文章的第三篇,重點介紹 MiniGUI 的邏輯字體支持,主要內容涉及 MiniGUI
中以面向對象技術為基礎構建的多字體和多字符集支持,并舉例說明了如何在 MiniGUI 中實現對新字符集和新字體的支持。</EM></P><A
id=1 name=1></A>
<P><STRONG class=subhead>1 引言</STRONG></P>
<P>我們在介紹 MiniGUI 體系結構的第一篇文章中提到,MiniGUI 采用了面向對象的技術實現了 GAL、IAL
以及多字體和多字符集的支持。字體和字符集的支持,對任何一個 GUI 系統來講都是不可缺少的。不過,各種 GUI
在實現多字體和多字符集的支持時,采用不同的策略。比如,對多字符集的支持,QT/Embedded采用 UNICODE
為基礎實現,這種方法是目前比較常用的方法,是一種適合于通用系統的解決方案。然而,這種方法帶來許多問題,其中最主要就是 UNICODE
和其他字符集之間的轉換碼表會大大增加 GUI 系統的尺寸。這對某些嵌入式系統來講是不能接受的。</P>
<P>MiniGUI 在內部并沒有采用 UNICODE
為基礎實現多字符集的支持。MiniGUI的策略是,對某個特定的字符集,在內部使用和該字符集完全一致的內碼表示。然后,通過一系列抽象的接口,提供對某個特定字符集文本的一致分析接口。該接口既可以用于對字體模塊,也可以用來實現多字節字符串的分析功能。如果要增加對某個字符集的支持,只需要實現該字符集的接口即可。到目前為止,MiniGUI
已經實現了 ISO8859-x 的單字節字符集支持,以及 GB2312、BIG5、EUCKR、UJIS 等多字節字符集的支持。</P>
<P>和字符集類似,MiniGUI
也針對字體定義了一系列抽象接口,如果要增加對某種字體的支持,只需實現該字體類型的接口即可。到目前為止,MiniGUI 已經實現了對 RBF 和
VBF 字體(這是 MiniGUI 定義的兩種光柵字體格式)、TrueType 和 Adobe Type1 字體等的支持。</P>
<P>在多字體和多字符集的抽象接口之上,MiniGUI 通過邏輯字體為應用程序提供了一致的接口。</P>
<P>本文重點介紹 MiniGUI 的邏輯字體、多字體和多字符集的實現,并以 EUCKR(韓文)字符集和 Adobe Type1
字體為例,說明如何在 MiniGUI 中實現一種新的字符集支持和新的字體類型支持。</P><A id=2 name=2></A>
<P><STRONG class=subhead>2 邏輯字體、設備字體以及字符集之間的關系</STRONG></P>
<P>在 MiniGUI 中,每個邏輯字體至少由一個單字節的設備字體組成。設備字體是直接與底層字體相關聯的數據結構。每個設備字體有一個操作集(即
font_ops),其中包含了 get_char_width、get_char_bitmap 等抽象接口。每個 MiniGUI
所支持的字體類型,比如等寬光柵字體(RBF)、變寬光柵字體(VBF)、TrueType 字體、Adobe Type1
字體等均對應一組字體操作集。通過這個字體操作集,我們就可以從相應的字體文件中獲得某個字符的點陣(對光柵字體而言)或者輪廓(對矢量字體而言)。之后,MiniGUI
上層的繪圖函數就可以將這些點陣輸出到屏幕上,最終就可以看到顯示在屏幕上的文字。</P>
<P>圖 1 給出了邏輯字體、設備字體以及字符集之間的關系。</P>
<P align=center><IMG alt=""
src="MiniGUI 體系結構之三邏輯字體以及多字體和多字符集實現.files/image01.gif" border=0><BR>圖 1
邏輯字體以及相關數據結構</P>
<P>在設備字體結構中,還有一個字符集操作集(即 charset_ops),其中包含了
len_first_char、char_offset、len_first_substr 等抽象接口。每個 MiniGUI 所支持的字符集,比如
ISO8859-x、GB2312、BIG5
等字符集均對應一組字符集操作集。通過這個字符集操作集,我們就可以對某個多種字符集混合的字符串進行文本分析。比如在“ABC中文”這個字符串中,頭三個字符是屬于
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -