VxWorks5.5 平臺下矢量字體顯示的實現(xiàn)-設(shè)計應(yīng)用_第1頁
VxWorks5.5 平臺下矢量字體顯示的實現(xiàn)-設(shè)計應(yīng)用_第2頁
VxWorks5.5 平臺下矢量字體顯示的實現(xiàn)-設(shè)計應(yīng)用_第3頁
VxWorks5.5 平臺下矢量字體顯示的實現(xiàn)-設(shè)計應(yīng)用_第4頁
VxWorks5.5 平臺下矢量字體顯示的實現(xiàn)-設(shè)計應(yīng)用_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

精品文檔-下載后可編輯VxWorks5.5平臺下矢量字體顯示的實現(xiàn)-設(shè)計應(yīng)用摘要:VxWorks5.5采用點陣字庫實現(xiàn)字體顯示,這種字庫設(shè)計簡潔,應(yīng)用廣泛,但一個字庫只能對應(yīng)一種字體的一種大小,在不確定使用何種字體的情況下,這種傳統(tǒng)的字體顯示方式便不能夠滿足需求。通過使用TrueType字庫和FreeType字體引擎相結(jié)合的方式,能實現(xiàn)多種字體、任意大小的顯示功能。主要介紹了TrueType、FreeType技術(shù)的基本原理,以及在VxWorks5.5下如何將WindML、FreeType和TrueType三者相結(jié)合實現(xiàn)矢量字體顯示的方法。

1VxWorks5.5點陣字庫的局限性

VxWorks5.5是美國風(fēng)河公司開發(fā)的嵌入式操作系統(tǒng),圖形系統(tǒng)采用WindML3.0,支持點陣字顯示,不支持矢量字體顯示。點陣字采用內(nèi)存模式加載,使用前需要將字體庫先加載到內(nèi)存,再通過WindML圖形接口實現(xiàn)點陣字顯示。點陣字庫采用。c文件方式儲存信息,每個字信息都包含在一個數(shù)據(jù)結(jié)構(gòu)中,其中包含了字體的所有點信息,字體顯示時只要根據(jù)字的寬高將點信息直接送入顯存顯示。這種方式的字體實現(xiàn)簡單、顯示速度快,但是一個字體文件只包含一種字體、一個大小的信息,使用具有一定的局限性。

隨著嵌入式軟件的不斷發(fā)展,在設(shè)計象嵌入式瀏覽器這樣的人機界面的軟件時,發(fā)現(xiàn)點陣字庫已經(jīng)遠遠不能滿足設(shè)計要求,嵌入式瀏覽器對字體的需求是根據(jù)網(wǎng)頁內(nèi)容來決定的,在網(wǎng)頁上任何類型,任何大小的字體都可能出現(xiàn),點陣字庫要將所有字體類型,每種字體的所有大小都包括是不可能的,這種局限性大大降低了瀏覽器的顯示效果。TrueType字庫引入到VxWorks5.5系統(tǒng)下,有效的解決了字體的問題,所有Windows下的TrueType字庫都可以在VxWorks5.5系統(tǒng)直接使用,資源非常豐富,能滿足嵌入式系統(tǒng)對字庫的新需求。

2TrueType字庫原理及FreeType字體引擎

TrueType是Apple公司和Microsoft公司合作開發(fā)的頁面描述語言(簡稱TTF),采用了直線和二次貝賽爾曲線來描述字符的輪廓,結(jié)合了光柵技術(shù)和矢量技術(shù)的優(yōu)點,克服了以往所有點陣字體、矢量字體和向量輪廓字體的缺點,字體可以任意放大、縮小、旋轉(zhuǎn)和變形而不會影響輸出質(zhì)量,提供了真正的設(shè)備無關(guān)性,二次貝賽爾曲線既能保證輪廓曲線的光滑性,又有利于提高字形還原的速度。如下圖1所示。

圖1TrueType字體輪廓圖

FreeType是一個完全的、高品質(zhì)的可移植的字體引擎,它提供同一的接口訪問多種字體格式,包括TrueType,openType,CID,CFF等。支持單色位圖,反走樣位圖的渲染,F(xiàn)reeType庫是高度模塊化的程序庫,它使用ANSIC開發(fā),但采用面向?qū)ο蟮乃枷?,F(xiàn)reeType用戶可以靈活地對它進行裁剪。

3VxWorks5.5下矢量字庫的實現(xiàn)

VxWorks5.5下矢量字庫采用開放源代碼的Freetype庫和Windows下的TrueType字庫結(jié)合實現(xiàn),通過WindML圖形系統(tǒng)將矢量字應(yīng)用到VxWorks5.5系統(tǒng)中。矢量字使用前先初始化WindML圖形系統(tǒng),再初始化矢量字庫,并將矢量字庫的接口函數(shù)掛接到圖形系統(tǒng)下,在應(yīng)用矢量字庫時只需調(diào)用WindML接口函數(shù),調(diào)用方式和點陣字庫一致,實現(xiàn)了與WindML的無縫掛接。TrueType字庫根據(jù)加載方式不同分為動態(tài)加載和靜態(tài)加載兩種方式,動態(tài)加載方式是將TrueType字庫拷貝到目標機硬盤,根據(jù)應(yīng)用程序的設(shè)計要求在程序運行時動態(tài)加載字庫;靜態(tài)加載方式是將TrueType字庫在系統(tǒng)啟動時便加載到目標機內(nèi)存,應(yīng)用程序可以直接調(diào)用字庫信息。動態(tài)加載方式優(yōu)點在于節(jié)省內(nèi)存和加載靈活,缺點在于不同字體切換時消耗的時間長,不適合需字體的頻繁切換的應(yīng)用程序;靜態(tài)加載方式優(yōu)點在于不同字體切換時消耗的時間短,適合需字體的頻繁切換的應(yīng)用程序,缺點在于內(nèi)存消耗大,加載不靈活。

3.1矢量字體的初始化

矢量字庫的初始化主要有矢量字體設(shè)備創(chuàng)建和矢量字體設(shè)備注冊兩部分組成。先創(chuàng)建矢量字體設(shè)備,如果創(chuàng)建成功則將矢量字體設(shè)備注冊到系統(tǒng)中,如果創(chuàng)建不成功則退出程序。

矢量字體設(shè)備創(chuàng)建函數(shù)UGL_FONT_DRIVER*uglFT2FontDriverCreate(UGL_UGI_DRIVER*pDriver,UGL_FT2_FONT_DRV_CFG*pFT2FontConfig),參數(shù)pDriver為圖形系統(tǒng)設(shè)備號,取值graphicsDevID為WindML初始化時創(chuàng)建的圖形系統(tǒng)設(shè)備號;參數(shù)pFT2FontConfig為字體配置結(jié)構(gòu),根據(jù)字體加載的方式不同參數(shù)也不同,具體見3.4章節(jié);返回值ft_fontDevID為矢量字體設(shè)備號。

設(shè)備注冊函數(shù)UGL_STATEuglRegistryAdd(UGL_UINT32type,UGL_UINT32data,UGL_UINT32id,char*name),參數(shù)type為矢量字體設(shè)備類型,需定義一個新設(shè)備類型UGL_FONT_ENGINE_FTTYPE,取值為13;參數(shù)data為圖形系統(tǒng)設(shè)備ID,取值(UGL_UINT32)graphicsDevID;參數(shù)id為矢量字體設(shè)備號,取值(UGL_UINT32)ft_fontDevID;參數(shù)name取值0.

3.2字體單雙字節(jié)編碼轉(zhuǎn)換

字符編碼根據(jù)長度分為單字節(jié)和雙字節(jié)兩種編碼方式,單字節(jié)編碼包括英文字母、數(shù)字和特殊字符等,雙字節(jié)編碼包括漢字和自定義字符等。

WindML字體顯示分雙字節(jié)顯示和單字節(jié)顯示兩種方式,雙字節(jié)顯示是兩個字節(jié)作為字體編碼對字庫進行查詢,找到字符位圖并顯示;單字節(jié)顯示是單個字節(jié)作為字體編碼對字庫進行查詢,找到字符位圖并顯示。當(dāng)英文字符顯示時,可以使用單字節(jié)顯示或雙字節(jié)顯示,當(dāng)中文字符顯示或中英文混合字符顯示時必須使用雙字節(jié)顯示。

VxWorks下字體采用GB2312編碼,中文字符編碼的每個字節(jié)都大于0x80,英文字符編碼都小于0x80,在進行雙字節(jié)顯示時,需要將單字節(jié)字符轉(zhuǎn)換成雙字節(jié)字符。在字符轉(zhuǎn)換時,先獲取整個字符串長度,再判斷每個字節(jié)是否大于0x80,如果小于0x80,則將單字節(jié)擴展成雙字節(jié);如果大于0x80,則將這個字節(jié)與后個字節(jié)組合成一個雙字節(jié);計算雙字節(jié)數(shù)并返回,如上圖2所示。

圖2單字節(jié)字符轉(zhuǎn)換成雙字節(jié)字符。

3.3字體編碼轉(zhuǎn)換

VxWorks5.5下漢字采用GB2312編碼,而FreeType在處理漢字時只能識別Unicode編碼,在處理漢字前需要將GB2312編碼先轉(zhuǎn)換成Unicode編碼,GB2312與Unicode的編碼轉(zhuǎn)換表采用二維數(shù)組保存數(shù)據(jù),共有7000多組對應(yīng)項,如果采用遍歷數(shù)組的方式來進行編碼轉(zhuǎn)換,那么平均每個漢字編碼轉(zhuǎn)換需要做3000多次的編碼比較,這非常影響漢字的處理速度。

為了提高編碼轉(zhuǎn)換的處理速度,編碼轉(zhuǎn)換時采用折半查找方式來實現(xiàn),使用折半查找需要先將GB2312編碼從小到大排列,每個GB2312編碼對應(yīng)一個Unicode編碼。在使用折半查找時,先取first=0end=數(shù)組長度,然后(first+end)/2得到一個中間編號,再通過中間編號獲取相應(yīng)的GB2312編碼和顯示漢字編碼比較大小,如果中間值大,則將first=0end=中間編碼組合再進行折半查找;如果中間值小,則將first=中間編碼end=數(shù)組長度組合再進行折半查找;如果相等,則將GB2312編碼對應(yīng)的Unicode編碼提交程序處理。

使用折半查找一個漢字多只需查找13次,大大提高了漢字Unicode編碼的查找速度,加速了漢字顯示。

3.4字庫加載

字體庫加載方式分動態(tài)和靜態(tài)兩種,兩者之間互有優(yōu)缺點,可根據(jù)用戶的不同需求自主選擇加載方式。

3.4.1字庫動態(tài)加載

字庫動態(tài)加載方式是將windows下的TrueType字體庫文件(*.ttf,*.ttc)拷貝到目標機目錄下,根據(jù)用戶需求在程序執(zhí)行過程中動態(tài)加載字庫。動態(tài)加載的實現(xiàn)方法:先聲明兩個結(jié)構(gòu)變量。

1)UGL_FT2_FONT_DRV_CFGft_font_cfg;

2)UGL_FT2_FONT_PATH_DESCFontPathDesc;

接著設(shè)置FontPathDesc信息,F(xiàn)ontPathDesc.PFontSearchPath="/ata0a/ttf/";FontPathDesc.filter="*.ttf";pFontSearchPath為字體文件搜索路徑,filter為文件過濾器。再設(shè)置ft_font_cfg信息,ft_font_cfg.numFontPathDesc=1;ft_font_cfg.pFontPathDesc=FontPathDesc;ft_font_cfg.defaultCharset=FT_ENCODING_UNICODE;numFontPathDesc為字體搜索路徑的個數(shù),pFontPathDesc為搜索路徑,defaultCharset為設(shè)置矢量字體的編碼模式。按照3.1章節(jié)對矢量字庫進行初始化。

3.4.2字庫靜態(tài)加載

字體庫靜態(tài)加載方式是將windows下的TrueType字體庫文件(*.ttf,*.ttc)編譯生成一個。o文件,并在應(yīng)用程序執(zhí)行前先加載到內(nèi)存。靜態(tài)加載的實現(xiàn)方法:

在編譯生成。o字庫文件前,先確定需要加載的TrueType字體庫文件,例如需要將f:/font/目錄下的simsun.ttc,simkai.ttf文件編譯生成一個。o文件,先創(chuàng)建一個udft2cfg.s文件,將需要編譯的字庫信息填入文件,再使用編譯命令ccpentium-mtune=pentium–march=pentium-O2-nostdlib-fno-builtin-fno-defer-pop-DCPU=PENTIUM-DTOOL_FAMILY=gnu-D_WRS_KERNEL-DWORKS-xassembler-with-cpp-g-cudft2cfg.oudft2cfg.s編譯字體文件,生成udft2cfg.o文件。

靜態(tài)加載方式在矢量字體初始化時所用的字體結(jié)構(gòu)信息與動態(tài)加載有一些區(qū)別,靜態(tài)加載所用字體信息已經(jīng)明確,在初始化時需要將字體信息在結(jié)構(gòu)中描述清楚,結(jié)構(gòu)UGL_FT2_FONT_MEMBUF_DESC描述字體名稱、起始地址,終止地址,并掛接到結(jié)構(gòu)UGL_FT2_FONT_DRV_CFG下,按照3.1章節(jié)對矢量字體進行初始化。

3.5矢量字體的粗、斜體實現(xiàn)

矢量字體顯示方式包括正體、粗體、斜體、和粗斜體四種方式,F(xiàn)reeType字體引擎已經(jīng)實現(xiàn)了對各種顯示方式的支持,但要在VxWorks5.5上支持粗、斜體,需要修改udft2fnt.c和uglfont2.c的部分代碼。udft2fnt.c修改代碼如下:

1)在UGL_FT2_FONT結(jié)構(gòu)中增加兩個結(jié)構(gòu)變量,UGL_SIZEweightsize;UGL_SIZEitalicsize;

2)在uglFT2FontCreate函數(shù)中,去除三個條件pFontDef-weight=pFT2FontDesc-header.weight.minpFontDef-weight=pFT2FontDesc-header.weight.maxpFontDef-italic==pFT2FontDesc-header.Italic;增加字體結(jié)構(gòu)變量weightsize,italicsize的賦值,pFT2Font-weightsize=pFontDef-weight;pFT2Font-italicsize=pFontDef-italic;

3)在uglFT2FontInfo函數(shù)中,增加粗體、斜體信息的設(shè)置和獲取代碼,

caseUGL_FONT_WEIGHT_SET:pFT2Font-weightsize=*((UGL_SIZE*)pInfo);break;

caseUGL_FONT_WEIGHT_GET:(*(UGL_SIZE*)pInfo)=pFT2Font-weightsize;

status=UGL_STATUS_OK;break;

caseUGL_FONT_SLANT_ANGLE_SET:pFT2

Font-italicsize=*((UGL_SIZE*)pInfo);break;

caseUGL_FONT_SLANT_ANGLE_GET:(*(UGL_SIZE*)pInfo)=pFT2Font-italicsize;

status=UGL_STATUS_OK;break;

4)在ft2DrawStringImageCache函數(shù)中,增加矢量字體在斜體時的矩陣值;增加矢量字體在粗、斜體時字體位圖索引的獲取。因為矢量字體在粗、斜體時矩陣值和位圖索引號的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論