嵌入式GUI系統(tǒng)是嵌入式系統(tǒng)中實(shí)現(xiàn)友好人機(jī)界面的關(guān)鍵技術(shù),應(yīng)用于嵌入式的GUI系統(tǒng)必須具備體積小、反應(yīng)快,、高可靠性,、可移植性好以及可裁減等特點(diǎn),對于實(shí)時(shí)系統(tǒng)還需要有時(shí)實(shí)方面的要求。目前,流行的嵌入式GUI系統(tǒng)有Microwindows,、MiniGUI,、Qt/Embedded等?;蠱icrowindows以其開放的源代碼,、可以裁減到100k的內(nèi)核、與W in32兼容的API以及高度的可移植性在嵌入式系統(tǒng)中得到了廣泛的應(yīng)用,。 Microwindows是一個(gè)開放源碼的嵌入式GU項(xiàng)目,目的在于把現(xiàn)代圖形視窗環(huán)境的特性引入到小型設(shè)備上,。MicroW indows起源于NanoGUI項(xiàng)目目前的發(fā)布包括Mircrowindows和Nano-X兩部分代碼。Microwindows系統(tǒng)采用分層的設(shè)計(jì)方案以滿足不同的實(shí)現(xiàn)需要,??傮w分為三層:最下面的設(shè)備驅(qū)動(dòng)層、中間的圖形引擎層,、面向應(yīng)用程序的API接口層,。設(shè)備驅(qū)動(dòng)部分提供了屏幕、鼠標(biāo)/觸摸屏,、鍵盤以及其它I/O設(shè)備的實(shí)際操作,并向上提供統(tǒng)一接口以實(shí)現(xiàn)設(shè)備無關(guān)圖形引擎,。中間層實(shí)現(xiàn)了畫點(diǎn)、畫線,、多邊形,、剪切區(qū)以及顏色模式設(shè)置等功能。Microwindows提供了ECMAAPIW和Nano-XAPIs兩套不同標(biāo)準(zhǔn)的API,分別兼容W in32和XW indow,其它系統(tǒng)上編寫的應(yīng)用程序可以很容易移到Microwindows上運(yùn)行,。 Microwindows的中文化 1,、中文編碼與Unicode編碼 中文不同于ASCII字符,一個(gè)中文需要2個(gè)字節(jié)來編碼,通用的中文編碼標(biāo)準(zhǔn)有GB2312,、GBK、GB18030,、BIG5(繁體),在嵌入式系統(tǒng)中我們采用GB2312標(biāo)準(zhǔn),也是國家標(biāo)準(zhǔn),。為了區(qū)別中文與基本的ASCII字符,漢字的編碼的每個(gè)字節(jié)是高位均為1,而0-127之間的編碼用于基本的ASCII字符,因此我們可以同時(shí)顯示中文與英文,而不會(huì)出現(xiàn)問題。而不同的多字節(jié)編碼之間是不容易區(qū)分的,比如中文與日文,還有拉丁文,因此一些系統(tǒng)在進(jìn)行處理的時(shí)候,會(huì)把不同的編碼轉(zhuǎn)成為通用的Unicode編碼,Unicode編碼規(guī)則是每個(gè)字符采用2字節(jié)或4字節(jié)進(jìn)行編碼,基本包括了世界上所有字符的編碼,。 2,、直接加載中文字體 Microwindows內(nèi)建了對中文的支持,通過下載中文字庫包,修改config文件,可以讓Microwindow支持簡單的中文輸出,這是一種最簡單的方法,在這里不作具體介紹。 3,、添加Truetype字體驅(qū)動(dòng)模塊Freetype2 Microwindows增加了對Freetype2的支持FreeType2是TTF矢量字體的圖形引擎庫,通過引入Freetype2,使得Microwindows可以支持任何在W indows下使用的TTF,、TTC字體庫。具體實(shí)現(xiàn)如下: (1)下載Freetype2的源代碼,解壓編譯后,生成libfreetype. a庫文件,拷貝到uClinx的/usr/lib庫 目錄下,。 (2)從W indows字庫拷貝所需字庫文件到uClinux的/fonts/truetype目錄下,如simhe.i ttf(簡 體黑體),、simson. fft(簡體宋體)。 (3)修改config文件如下: HAVE_FREETYPE_2_SUPPORT = Y HZK_FONT_DIR = /usr/include LIBFT2LIB = /usr/lib/libfreetype. A (4)修改應(yīng)用程序的CreateFont函數(shù)如下: newfont = CreateFont(12, //可以設(shè)置為任意值0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,FF_DONTCARE|DEFAULT_PITCH,“simson. ttf”//設(shè)置為字庫文件名); //創(chuàng)建漢字字體 (5)修正Freetype2的編碼問題 通過輸出中文進(jìn)行驗(yàn)證,出來的并不是預(yù)期的結(jié)果,而字符的輸出是正確的,。這是因?yàn)镕reetype字庫引擎對文本的輸入是按Unicode編碼處理的(這與4. 2節(jié)中加載中文字庫是不同的,前者是按ASCII處理的),。 在文件src/engine/font_freetype2. c的freetype_drawtext(... )函數(shù)中有明確的說明如下: static void freetype2 _ drawtext(PMWFONT pfont, PSDpsd, MWCOORD ax,MWCOORD ay, const void * text, int cc, MWTEXT-FLAGS flags); //text: 16位Unicode編碼字符串 //cc:字符串字符個(gè)數(shù) 再看一下文本輸出API函數(shù): DrawText、DrawTextA,、DrawTexWt與freetype2_drawtext的關(guān)系,其中DrawText被定義為宏#define DrawTextDrawTextA, DrawTextA與DrawTexWt實(shí)現(xiàn)基本相同,其中DrawTextA接受ASCII字符, DrawTexWt接受寬字符,。DrawText的內(nèi)部實(shí)現(xiàn)如下(-->表示調(diào)用->表示指針): a) DrawText -->MwDrawText -->MwExtTextOu --> GdText b) GdText調(diào)用gr_pfont->fontprocs->DrawText c)其中g(shù)r_pfont->fontproc->DrawText為系統(tǒng)當(dāng)前字體的處理例程,當(dāng)使用Freetype2字庫驅(qū)動(dòng)庫時(shí),DrawTex即為freetype2_drawtext。 當(dāng)用DrawText輸出中文時(shí),在GdText函數(shù)內(nèi)有一個(gè)從ASCII到Unicode的轉(zhuǎn)換,可是這個(gè)轉(zhuǎn)換并沒有解決問題,這一點(diǎn)可以從src/engine/dev-fon.t c的GdConvertEncoding函數(shù)中得到驗(yàn)證,此函數(shù)只是簡單在每一個(gè)ASCII編碼前加上一個(gè)0字節(jié)轉(zhuǎn)為雙字節(jié),根本不符合GB2312到Unicode的轉(zhuǎn)換規(guī)則,從而導(dǎo)致了freetype2_drawtext的輸出錯(cuò)誤,。 那么,是否可以像W in32那樣直接如下調(diào)用 DrawTexWt ()實(shí)現(xiàn)呢? DrawTexWt (…TEXT(“要輸出的文本”)…); 確實(shí)在Microwindows下也定義了如下的字符串轉(zhuǎn)換的宏,可惜沒有實(shí)現(xiàn),。 #define __TEXT(quote) quote #defineTEXT(quote) __TEXT(quote) 由以上分析可得,Freetype2的中文化還需要進(jìn)行編碼轉(zhuǎn)換,下面給出了兩種解決從GB2312到 Unicode的方法: 方法一:使用iconv編碼轉(zhuǎn)換庫 Libiconv. a提供三個(gè)轉(zhuǎn)換接口函數(shù)iconv-open、icon,、iconv_close來實(shí)現(xiàn)編碼轉(zhuǎn)換,要包含頭 文件iconv. h。 方法二:使用setlocale進(jìn)行轉(zhuǎn)換 setlocale是與系統(tǒng)locale設(shè)置相關(guān)的函數(shù),即系統(tǒng)本地化設(shè)置,介紹如下: string setlocale(string category, string locale); //設(shè)置本地化屬性,主要是字符集和語言相及關(guān)信息 size_tmbstowcs(wchar_t*wcstr, const char*mbstr, size_t count); //將多字節(jié)字字符串轉(zhuǎn)換為Unicode字符串 size_twcstombs(char*mbstr, constwchar_t*wcstr, size_t count); //將Unicode字符串轉(zhuǎn)換為多字節(jié)字字符串當(dāng)設(shè)置如下時(shí),可以實(shí)現(xiàn)GB2312到Unicod的轉(zhuǎn)換: Setlocale(LT_CTYPE,“zh_CN.GB2312”); 以上兩種方法均可實(shí)現(xiàn)GB2312字符集到Unicode編碼的相互轉(zhuǎn)換問題,不僅適用于中文,也適用于其它DBCS字符集的情況,。 4,、修改圖形引擎實(shí)現(xiàn)本地化和中文化 軟件中引入國際化與本地化是實(shí)現(xiàn)軟件通用化的基本方法。在21世紀(jì)信息化高度發(fā)達(dá)的時(shí) 代,軟件國際化與本地化越來越受到人們的高度重視,盡管Microwindows支持多種語言文字,但要實(shí)現(xiàn)靈活的多國語言支持,還需要進(jìn)一步地改進(jìn)與完善,。下面是通過修改圖形引擎,結(jié)合Linux的Lo-cale設(shè)置實(shí)現(xiàn)的軟件運(yùn)行時(shí)多種語言任意切換的功能,。實(shí)現(xiàn)如下: (1)Microwindows的字體設(shè)置 Microwindows的字體設(shè)置并不是在窗口創(chuàng)建時(shí)進(jìn)行初始化的,而是在窗體第一次繪制時(shí)調(diào)用GetDC獲取設(shè)備上下文時(shí)設(shè)置的,這是創(chuàng)建窗口的一種優(yōu)化技術(shù),如下所示: 調(diào)用關(guān)系如下: GetDC( ) --> GetDCEx( ) ( srcmwin/wingd.i c) DC WINAPI GetDCEx(HWND hwnd, HRGN hrgnClip, DWORD flags) { ... //設(shè)置窗口設(shè)備句柄的字體 hdc->font= (MWFONTOBJ* )GetStockObject(SYS-TEM_FONT); ... hwnd->owndc = hdc; //保存設(shè)備句柄到窗口,下次調(diào)用時(shí)使用 } 由于GetDCEx()是所有窗口顯示必須調(diào)用的函數(shù),因此通過修改hdc->font的值,我們可以改變所有窗口的默認(rèn)字庫,從而更換了系統(tǒng)的字體。 (2)加入FreeType2內(nèi)建字體支持,支持本地化為了加入我們需要的默認(rèn)字體,可以創(chuàng)建基于 Unicode編碼的Freetype2內(nèi)建字體,在src/mwinwingd.i c中加入以下代碼: #define FONTNAME“simson” staticMWFONTOBJOBJ_FREETYPE_FONT = { {OBJ_FONT, TRUE}, NULL, FONTNAME; //字體名 }; //創(chuàng)建FreeType作為內(nèi)建字體 MWFONTOBJ* GetFreeTypeFontOBJ() { Static PMWFONT pfont = NULL; MWFONTOBJ* pFont =&OBJ_FREETYPE_FONT; If(! pfont) { pFont- > pfont = GdCreateFont(&srcdev,“”, 16,NULL); pFont->font = pfont; } return pFont; } (3)使用setlocale進(jìn)行編碼轉(zhuǎn)換,將前面的Setlocale(LT_CTYPE,“zh_CN. GB2312”)修改為Setlocale(LT_CTYPE, CHARSETNAME),。最后,通過將字體名FONTNAME與字符集名CHARSETNAME與作為環(huán)境變量進(jìn)行傳入,一個(gè)支持多字體多語言切換的Microwindows就實(shí)現(xiàn)了,。 5、中文化方法小結(jié)與比較 (1)直接加載中文字庫是Microwindows自帶的最容易實(shí)現(xiàn)的一種中文化方法,。其優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,容易操作;缺點(diǎn)是只支持固定的12和16兩種高度的點(diǎn)陣字體,而且必須在應(yīng)用程序中指定所用字體,。 (2)通過引入Truetype字體驅(qū)動(dòng)模塊實(shí)現(xiàn)中文化是比較理想的方案, FreeType2不僅對TrueTyp 字庫提供了良好的支持,而且完全兼容微軟的TT字庫。其優(yōu)點(diǎn)是字形美觀,、字體大小可以任意變化;可選用的字體庫多;兼容其它編碼的字體庫,為支持多國語言提供了條件,。缺點(diǎn)是實(shí)現(xiàn)比較復(fù)雜,不僅需要下載Freetype2的庫,還要修正其中的編碼問題;另外對嵌入式的系統(tǒng)而言,額外的存空間開銷也是不利的因素。 (3)修改圖形引擎實(shí)現(xiàn)本地化和中文化是軟件國際化的一部分。通過引入Freetype2,、修改窗口句柄的字體加載機(jī)制,將Microwindows圖形系統(tǒng)與Linux系統(tǒng)中的Locale連接起來,使Microwindow具備了支持軟件本地化的能力,。該方法是對M-crowindows的進(jìn)一步改進(jìn)與功能增強(qiáng),是Microwin-dows中文化的高級(jí)方法。其優(yōu)點(diǎn)是不僅解決了中文化問題,同時(shí)具有良好的適應(yīng)性和更大的靈活性,。其缺點(diǎn)是實(shí)現(xiàn)復(fù)雜,需要更多的系統(tǒng)支持和開銷,。綜上所述,我們可以用不同的方法來實(shí)現(xiàn)M-crowindows的中文化,但各種方法的實(shí)現(xiàn)難度和代價(jià)不盡相同,用戶可以根據(jù)實(shí)際需求進(jìn)行選擇。 《基于uClinux的Microwindows的移植與中文化研究*》代志華 |
|