VxWorks5.5 平臺下矢量字體顯示的實(shí)現
摘 要:VxWorks5.5 采用點(diǎn)陣字庫實(shí)現字體顯示,這種字庫設計簡(jiǎn)潔,應用廣泛,但一個(gè)字庫只能對應一種字體的一種大小,在不確定使用何種字體的情況下,這種傳統的字體顯示方式便不能夠滿(mǎn)足需求。通過(guò)使用TrueType字庫和FreeType 字體引擎相結合的方式,能實(shí)現多種字體、任意大小的顯示功能。主要介紹了TrueType、FreeType技術(shù)的基本原理,以及在VxWorks5.5 下如何將WindML、FreeType 和TrueType 三者相結合實(shí)現矢量字體顯示的方法。 1 VxWorks5.5點(diǎn)陣字庫的局限性 VxWorks5.5 是美國風(fēng)河公司開(kāi)發(fā)的嵌入式操作系統,圖形系統采用WindML3.0,支持點(diǎn)陣字顯示,不支持矢量字體顯示。點(diǎn)陣字采用內存模式加載,使用前需要將字體庫先加載到內存,再通過(guò)WindML 圖形接口實(shí)現點(diǎn)陣字顯示。點(diǎn)陣字庫采用。c 文件方式儲存信息,每個(gè)字信息都包含在一個(gè)數據結構中,其中包含了字體的所有點(diǎn)信息,字體顯示時(shí)只要根據字的寬高將點(diǎn)信息直接送入顯存顯示。這種方式的字體實(shí)現簡(jiǎn)單、顯示速度快,但是一個(gè)字體文件只包含一種字體、一個(gè)大小的信息,使用具有一定的局限性。 隨著(zhù)嵌入式軟件的不斷發(fā)展,在設計象嵌入式瀏覽器這樣的人機界面的軟件時(shí),發(fā)現點(diǎn)陣字庫已經(jīng)遠遠不能滿(mǎn)足設計要求,嵌入式瀏覽器對字體的需求是根據網(wǎng)頁(yè)內容來(lái)決定的,在網(wǎng)頁(yè)上任何類(lèi)型,任何大小的字體都可能出現,點(diǎn)陣字庫要將所有字體類(lèi)型,每種字體的所有大小都包括是不可能的,這種局限性大大降低了瀏覽器的顯示效果。TrueType 字庫引入到VxWorks5.5 系統下,有效的解決了字體的問(wèn)題,所有Windows 下的TrueType 字庫都可以在VxWorks5.5 系統直接使用,資源非常豐富,能滿(mǎn)足嵌入式系統對字庫的新需求。 2 TrueType字庫原理及FreeType字體引擎 TrueType 是Apple 公司和Microsoft 公司合作開(kāi)發(fā)的頁(yè)面描述語(yǔ)言(簡(jiǎn)稱(chēng)TTF),采用了直線(xiàn)和二次貝賽爾曲線(xiàn)來(lái)描述字符的輪廓,結合了光柵技術(shù)和矢量技術(shù)的優(yōu)點(diǎn),克服了以往所有點(diǎn)陣字體、矢量字體和向量輪廓字體的缺點(diǎn),字體可以任意放大、縮小、旋轉和變形而不會(huì )影響輸出質(zhì)量,提供了真正的設備無(wú)關(guān)性,二次貝賽爾曲線(xiàn)既能保證輪廓曲線(xiàn)的光滑性,又有利于提高字形還原的速度。如下圖1 所示。 圖1 TrueType 字體輪廓圖 FreeType 是一個(gè)完全免費的、高品質(zhì)的可移植的字體引擎,它提供同一的接口訪(fǎng)問(wèn)多種字體格式,包括TrueType,openType,CID,CFF 等。支持單色位圖,反走樣位圖的渲染,FreeType 庫是高度模塊化的程序庫,它使用ANSI C 開(kāi)發(fā),但采用面向對象的思想,FreeType 用戶(hù)可以靈活地對它進(jìn)行裁剪。 3 VxWorks5.5下矢量字庫的實(shí)現 VxWorks5.5 下矢量字庫采用開(kāi)放源代碼的Freetype 庫和Windows 下的TrueType 字庫結合實(shí)現,通過(guò)WindML 圖形系統將矢量字應用到VxWorks5.5系統中。矢量字使用前先初始化WindML 圖形系統,再初始化矢量字庫,并將矢量字庫的接口函數掛接到圖形系統下,在應用矢量字庫時(shí)只需調用WindML 接口函數,調用方式和點(diǎn)陣字庫一致,實(shí)現了與WindML的無(wú)縫掛接。TrueType 字庫根據加載方式不同分為動(dòng)態(tài)加載和靜態(tài)加載兩種方式,動(dòng)態(tài)加載方式是將TrueType 字庫拷貝到目標機硬盤(pán),根據應用程序的設計要求在程序運行時(shí)動(dòng)態(tài)加載字庫;靜態(tài)加載方式是將TrueType 字庫在系統啟動(dòng)時(shí)便加載到目標機內存,應用程序可以直接調用字庫信息。動(dòng)態(tài)加載方式優(yōu)點(diǎn)在于節省內存和加載靈活,缺點(diǎn)在于不同字體切換時(shí)消耗的時(shí)間長(cháng),不適合需字體的頻繁切換的應用程序;靜態(tài)加載方式優(yōu)點(diǎn)在于不同字體切換時(shí)消耗的時(shí)間短,適合需字體的頻繁切換的應用程序,缺點(diǎn)在于內存消耗大,加載不靈活。 3.1 矢量字體的初始化 矢量字庫的初始化主要有矢量字體設備創(chuàng )建和矢量字體設備注冊?xún)刹糠纸M成。先創(chuàng )建矢量字體設備,如果創(chuàng )建成功則將矢量字體設備注冊到系統中,如果創(chuàng )建不成功則退出程序。 矢量字體設備創(chuàng )建函數UGL_FONT_DRIVER*uglFT2FontDriverCreate(UGL_UGI_DRIVER*pDriver,UGL_FT2_FONT_DRV_CFG *pFT2FontConfig),參數pDriver 為圖形系統設備號,取值graphicsDevID 為WindML 初始化時(shí)創(chuàng )建的圖形系統設備號;參數pFT2FontConfig 為字體配置結構,根據字體加載的方式不同參數也不同,具體見(jiàn)3.4 章節;返回值ft_fontDevID為矢量字體設備號。 設備注冊函數UGL_STATE uglRegistryAdd(UGL_UINT32 type, UGL_UINT32 data, UGL_UINT32id, char *name),參數type 為矢量字體設備類(lèi)型,需定義一個(gè)新設備類(lèi)型UGL_FONT_ENGINE_FTTYPE,取值為13;參數data 為圖形系統設備ID,取值(UGL_UINT32)graphicsDevID;參數id 為矢量字體設備號,取值(UGL_UINT32) ft_fontDevID;參數name取值0. 3.2 字體單雙字節編碼轉換 3.4 字庫加載 字體庫加載方式分動(dòng)態(tài)和靜態(tài)兩種,兩者之間互有優(yōu)缺點(diǎn),可根據用戶(hù)的不同需求自主選擇加載方式。 3.4.1 字庫動(dòng)態(tài)加載 字庫動(dòng)態(tài)加載方式是將windows 下的TrueType 字體庫文件(*.ttf,*.ttc)拷貝到目標機目錄下,根據用戶(hù)需求在程序執行過(guò)程中動(dòng)態(tài)加載字庫。動(dòng)態(tài)加載的實(shí)現方法:先聲明兩個(gè)結構變量。 1) UGL_FT2_FONT_DRV_CFG ft_font_cfg; 2) UGL_FT2_FONT_PATH_DESC FontPathDesc; 接著(zhù)設置FontPathDesc 信息, FontPathDesc.PFontSearchPath=/ata0a/ttf/; FontPathDesc.filter=*.ttf;pFontSearchPath 為字體文件搜索路徑,filter 為文件過(guò)濾器。再設置ft_font_cfg 信息,ft_font_cfg.numFontPathDesc=1;ft_font_cfg.pFontPathDesc=FontPathDesc; ft_font_cfg.defaultCharset=FT_ENCODING_UNICODE;numFontPathDesc 為字體搜索路徑的個(gè)數,pFontPathDesc 為搜索路徑,defaultCharset 為設置矢量字體的編碼模式。最后按照3.1 章節對矢量字庫進(jìn)行初始化。 3.4.2 字庫靜態(tài)加載 字體庫靜態(tài)加載方式是將windows 下的TrueType字體庫文件(*.ttf,*.ttc)編譯生成一個(gè)。o 文件,并在應用程序執行前先加載到內存。靜態(tài)加載的實(shí)現方法:
評論