久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Microwindows及其中文化方法

 Rain_Time 2015-09-02

嵌入式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的移植與中文化研究*》代志華

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多