胥小武, 余立建, 劉洪雨
(西南交通大學 信息科學與技術(shù)學院, 成都 610031)
在WindML下漢字、圖形界面及圖片顯示的開發(fā)研究
胥小武, 余立建, 劉洪雨
(西南交通大學 信息科學與技術(shù)學院, 成都 610031)
本文介紹WindML的結(jié)構(gòu),重點敘述在開發(fā)文字圖形前字庫的原理、結(jié)構(gòu)和配置、顯示圖片文件前的準備工作及WindML設置編譯的重要注意事項,最后用具體的項目開發(fā)成果,展示了在VxWorks下用WindML開發(fā)的文字、圖形、圖片文件的顯示。
VxWorks;WindML;文字;圖形;圖片文件
VxWorks實時操作系統(tǒng)由400多個相對獨立的、短小精煉的目標模塊組成,用戶可根據(jù)需要選擇適當?shù)哪K來裁剪和配置系統(tǒng),這就有效保證了系統(tǒng)的安全性和可靠性[1]。VxWorks包含了BSP,Wind內(nèi)核,I/O系統(tǒng),文件系統(tǒng),網(wǎng)絡系統(tǒng),圖形系統(tǒng)等[2]。
WindML是VxWorks下的一部分,它支持多媒體程序運行于嵌入式操作系統(tǒng),主要用于提供基本的圖形、視頻和聲頻技術(shù)應用開發(fā)。WindML API提供了一個統(tǒng)一的圖形硬件接口及處理輸入/輸出設備事件的能力。
WindML包括兩個組件:(1)SDK。它提供了圖形資源的初始化和清理例程,多媒體API包括了2D圖形化界面、區(qū)域管理、窗口、顏色管理、視頻音頻、JPEG支持、事件服務、內(nèi)存管理、擴展API和設備管理;(2)DDK。它提供了一個完整的常見硬件配置,參考驅(qū)動程序例程和API文檔可以快速建立起新的驅(qū)動程序[3]。 WindML的層次結(jié)構(gòu)如圖1所示。?
圖1 WindML層次結(jié)構(gòu)圖
在WindML第一次使用之前要配置、編譯WindML。VxWorks中的板級支持包BSP (board support package)是介于底層硬件和上層軟件之間的底層軟件開發(fā)包,它主要用來屏蔽底層硬件,進行硬件系統(tǒng)的初始化并調(diào)用外設的驅(qū)動程序接口管理系統(tǒng)外設。當用戶開發(fā)目標板的BSP時,可以從所提供的BSP中選一個接近的來修改。根據(jù)基本的硬件信息來修改相應的BSP文件中的組成文件包括makefile,config.h,romInit. s,sysLn97xEnd.c等文件[4~5]。例如修改config. h 中定義的一些參數(shù),使編譯出來的系統(tǒng)引導程序bootrom 和VxWorks 的映像符合要求,修改sysLn97xEnd.c 文件,以使系統(tǒng)的網(wǎng)絡功能正常運行。
修改完成后,開始編譯用戶定義的BSP,打開Tornado選擇build boot room,確保select a BSP的選項是自己命名的BSP名字,select an image to build->bootrom->select a tool->gnu。
當配置好后點擊OK進行編譯,成功后自定義的BSP就可以用了。
1.1 漢字字庫設置
WindML根據(jù)ISO8859-1標準為8位字符表示和UNICODE標準的16位字符表示提供了位圖字體集,WindML本身不支持中文顯示,想要實現(xiàn)中文顯示,要利用WindML中對雙字節(jié)編碼的支持實現(xiàn)漢字的點陣存儲、點陣獲取、點陣顯示的全過程[6~7]。一般從網(wǎng)上下載的字庫或用軟件轉(zhuǎn)換過來的字庫需要把相應的字庫C文件修改,否則放到ugl/fonts/bmf文件夾中后,配置WindML中的bitmap font項無法識別,也就是整個excluded和include都沒有字體庫,修改內(nèi)容如圖2所示。
圖2 修改C文件內(nèi)容
下載或轉(zhuǎn)換過來的字庫C文件沒有“/* Yahei12.c - Yahei_12 font for BMF font driver */”,WindML無法識別。在標準的編譯器里,不管是C還是 C++語言,“/* Yahei12.c - Yahei_12 font for BMF font driver */”都是被編譯器忽略掉的,但是在這里不能忽略掉,Yahei_12就是代表字庫中有Yahei 12中文字庫。改好這一點,WindML可以識別加進去的字庫,但是在編譯WindML時還會出現(xiàn)錯誤。要想解決問題,必須確保在所編譯的字體文件中有如下所示的文字,其具體的含義如下:
{
{24,24}, /*表示點陣大小 */
{UGL_FONT_BOLD_OFF,
UGL_FONT_BOLD_OFF},
UGL_FONT_UPRIGHT, /*表示斜體*/
UGL_FONT_PROPORTIONAL, /*表示行間距屬性*/
UGL_FONT_ISO_8859_1, /*表示字符集*/
"Yahei 12x12 Dot", /*表示字體名稱*/
"Yahei" /*表示字體系列名稱*/
}, /*點陣名稱等點陣屬性表 */
0, /*表示行間距*/
24, /*最大上偏移位置*/
0, /*最大下偏移位置*/
24, /*最大寬度*/
pageArray /*字形頁*/
}; /*點陣描述解構(gòu)*/
上面所述就是點陣的基本結(jié)構(gòu),通過uglFont FindString(fontDrvId,”familyName=Yahei;pixelSiz e=16”,&systemFontDef)能找到自定義的字庫文件。
字體C文件的最后"Yahei 12x12 Dot"、"Yahei",一定要改為自定義文件名和相應的點陣,不然編譯WindML時會出現(xiàn)錯誤。
1.2 WindML的配置及編譯
WindML具體的配置如下:Tornado環(huán)境下打開Tools→WindML…,在WindML configuration選擇編譯的文件名,點擊configure進入WindML Configuration,在build選項中選擇處理器類型、工具等信息;在graphics driver中選擇開發(fā)板的圖形驅(qū)動,在display中選擇顯示器的型號,在圖形設置graphics setting配置顯示屏大小,刷新的頻率;在advanced選項中,如果需求圖片、視頻,可以選擇JPEG和double buffer 。新增漢字庫中的漢字編碼是雙字節(jié),在編譯WindML時要把bitmap fonts 中的include Unicode support選上。
完成配置后點擊build開始編譯WindML,在此之前最好clean一次。
2.1 漢字、圖形的顯示
在顯示漢字之前,必須初始化字體驅(qū)動和字體引擎,字體驅(qū)動在2D字體的API層和字體引擎之間提供接口,同時為圖形驅(qū)動程序和字體引擎扮演者服務的角色,其結(jié)構(gòu)如圖3所示。
圖3 字體驅(qū)動與字體引擎
2D字體API:應用程序可以使用API來顯示文字,而不用考慮字體引擎本身的能力。這些API服務于WindML中所有的字體引擎。
字體驅(qū)動:字體驅(qū)動在2D字體API和字體引擎專有的API之間提供了一個抽象層。字體驅(qū)動也是顯示驅(qū)動以及字體引擎之間的接口。有了字體驅(qū)動層,應用程序就可以通過使用相同的2D字體API來訪問不同的字體引擎。
字體引擎:通過使用字體驅(qū)動的服務提供并顯示文字。
開發(fā)應用程序時,用uglInitialize()函數(shù)初始化字體引擎和字體驅(qū)動,用uglDeinitialize()銷毀字體引擎和字體驅(qū)動。用下面的函數(shù)找到設備標識符,輸入服務標識符,字體驅(qū)動標識符,具體的代碼如下:
if(uglInitialize() == UGL_STATUS_ERROR) {return
; } /*初始化字體引擎和字體驅(qū)動*/
pRegistryData=uglRegistryFind(UGL_DISPLAY_TY
PE, 0, 0, 0); /*在注冊表中找到相應的設
備號*/
deviceID = (UGL_DEVICE_ID)pRegistryData->id;
/*找到設備ID號*/
pRegistryData=uglRegistryFind(UGL_INPUT_SERV
ICE_TYPE, 0, 0, 0);
inputServiceId=(UGL_INPUT_SERVICE_ID)pRegis
tryData->id; /*找到輸入服務ID號*/
pRegistryData=uglRegistryFind(UGL_FONT_ENGI
NE_TYPE, 0, 0, 0);
fontDrvId=(UGL_FONT_DRIVER_ID)pRegistryDat a->id; /*找到字體驅(qū)動ID號*/
接下來,用函數(shù)uglCreateGc()來創(chuàng)建圖形上下文:
gc = uglGcCreate(deviceID); /*創(chuàng)建上下文*/
textOrigin = UGL_FONT_TEXT_UPPER_LEFT;
/*是文字的顯示從左上開始*/
uglFontDriverInfo(fontDrvId,
UGL_FONT_TEXT_ORIGIN, &textOrigin);
/*是文字的顯示從左上開始*/
uglFontFindString(fontDrvId, "familyName=Yahei;
pixelSize=24", &fontDef)
textFont = uglFontCreate(fontDrvId, &fontDef);
/*初始化自定義的文字字體大小樣式*/
uglColorAlloc (deviceID, &bgColor, UGL_NULL,
&textBgColor, 1); /*設置屏幕背景顏色*/
uglColorAlloc(deviceID, &foreColor, UGL_NULL,
&textForeColor, 1); /*設置屏幕前景顏色*/
uglForegroundColorSet(gc, textForeColor);
/*設置文字背景顏色
uglBackgroundColorSet(gc, textBgColor);
/*設置文字背景顏色*/
uglFontSet(gc, textFont);
/*設置字體的顏色和字體的背景顏色。*/
通過上面的步驟就可以調(diào)用uglTextDraw()函數(shù)顯示出單字節(jié)字符,調(diào)用uglTextDrawW()函數(shù)顯示出雙字節(jié)字符,uglRectangle(), uglEllipse()函數(shù)分別是畫矩形、圓圈和橢圓形狀,其具體的實例如圖4所示。
圖4 漢字圖形的顯示界面
2.2 JPEG圖片的顯示
WindML中2D位圖管理的API允許創(chuàng)建或者渲染單色、彩色、透明位圖到顯示器上。
VxWorks是一個實時操作系統(tǒng),有硬盤等設備,要將JPEG圖片顯示在顯示屏上則需要把JPEG文件上傳到VxWorks的硬盤里,假設VxWorks的盤符為ata0a,利用ftp工具把JPEG文件上傳到VxWorks硬盤里。首先進入到VxWorks的virtual console控制臺界面中,輸入cd “/ata0a”,進入VxWorks硬盤,用ls命令查看硬盤里的文件,如果要將圖片文件放入一個新的文件夾就用命令mkdir image創(chuàng)建一個存放圖片的文件夾,創(chuàng)建后再次用ls命令查看是否已經(jīng)成功的操作。打開ftp文件傳輸軟件把JPEG文件上傳到VxWorks硬盤中。
前期準備工作后,進行軟件代碼的編寫。WindML 2D設備和驅(qū)動的擴展機制為處理圖片數(shù)據(jù)奠定了基礎,使得WindML支持處理JPEG圖片。首先用函數(shù)uglJpegInit()初始化JPEG的擴展功能,驗證JPEG擴展功能為特別的圖形設備而安裝,初始化后uglJpegInit()函數(shù)會返回UGL_JPEG_ID,此ID號為以后的JPEG例程調(diào)用作為一個參數(shù)值而返回。
WindML定義了一種方便的點陣圖稱作DDB(設備有關(guān)位圖),如果要顯示的JPEG圖片較大,則花費在處理圖片的時間越長,因此要權(quán)衡圖片大小和處理時間。
顯示圖片除了需要初始化字體庫和設備標識符外還需要調(diào)用uglJpegInit()函數(shù)初始化JPEG庫和JPEG的擴展功能,這樣才能讓JPEG圖片顯示在界面上,初始化完成后會返回一個ID號,接著要設置JPEG引擎,具體的代碼如下:
jpegId = uglJpegInit(devId, &jpegVersion);
uglJpegModeSet(jpegId, &jpegMode);
把要顯示的JPEG圖片文件的內(nèi)容讀到文件指針里,調(diào)用uglJpegToDDBFromFile()函數(shù)解壓縮后寫入到位圖中,然后調(diào)用uglBitmapBlt()函數(shù)把UGL_BITMAP_ID傳輸?shù)経GL_DDB_ID中,并以UGL_GC_ID開始繪制圖片,以下是代碼:
uglJpegToDDBFromFile (jpegId, fp, &jpeg-DdbId, UGL_NULL, 0, 0);
uglBitmapSizeGet(jpegDdbId, &jpegWidth, &jpegHeight);
uglBitmapBlt(gc, jpegDdbId, 0, 0, jpegWidth -1, jpegHeight - 1, UGL_DEFAULT_ID, 0, 0);
本實例是利用WindML支持2D位圖的功能顯示出JPEG圖片,程序?qū)懞煤筮M行編譯,將其下載到目標板上,運行后在終端顯示如圖5所示。
圖5 JEPG圖片顯示結(jié)果
本文介紹了在WindML下開發(fā)字體、圖形及圖片文件的顯示,程序開發(fā)后能夠運行在具體的項目板上,同時對開發(fā)中可能出現(xiàn)的問題和解決方案做了詳細的步驟說明,應用于實際的開發(fā)項目中取得了良好的效果。
[1] 周啟平,張 楊,吳 瓊.VxWorks開發(fā)指南和Tornado實用手冊[M].北京:中國電力出版社,2004.
[2] 孫鳳麗,王 瑞,楊桂枝,等.實時嵌入式操作系統(tǒng)VxWorks結(jié)構(gòu)分析和剪裁[J].軟件產(chǎn)業(yè)與工程,2013(1):33-36.
[3] 楊 蔚.基于VxWorks 的數(shù)據(jù)采集與重演軟件的圖形界面的設計與實現(xiàn)[J].宇航計測技術(shù),2012,32(3):69-74.
[4] 王 洋.VxWorks嵌入式實時操作系統(tǒng)設備驅(qū)動與BSP開發(fā)設計[M].北京:北京航空航天大學出版社,2012.
[5] 王彥剛,呂遵明,萬留進.VxWorks系統(tǒng)的BSP設計與實現(xiàn)[J].計算機系統(tǒng)應用,2011,20(12):91-94.
[6] 劉亞麗,顏麗娟.一種基于VxWorks 的漢字輸入法實現(xiàn)[J].電子科技,2012,25(2):97-99.
[7] 韓改寧.嵌入式系統(tǒng)VxWorks下漢字輸入法的研究與實現(xiàn)[J].咸陽師范學院學報,2012,27(4):44 - 46.
責任編輯 陳 蓉
Chinese character, graphics interface and photo display under WindML
XU Xiaowu, YU Lijian, LIU Hongyu
( School of Information Science and Technology , Southwest Jiaotong University, Chengdu 610031, China)
VxWorks; WindML; text; graphics; image fi le
: This paper introduced the structure of WindML, focused on the development, described the principle of preceding text graphics character, structure and con fi guration, the preparatory work before displaying the picture fi le and the important note of WindML setting compile. With the development of speci fi c projects, the paper demonstrated the text, graphics, images, fi les, which were developed by WindML under VxWorks.
2014-03-04
胥小武,在讀碩士研究生;余立建,教授。
U29∶TP39
A
1005-8451(2014)08-0049-04