摘要:開發(fā)適用于嵌入式設備的小型字庫系統(tǒng),介紹了字庫系統(tǒng)的設計原則及各字庫的編碼和顯示原理,系統(tǒng)已成功應用于一款有線數(shù)字電視接收機。
關鍵詞:點陣字庫;矢量字庫;嵌入式設備;查表法;地址映射
中圖分類號:TP334文獻標識碼:A文章編號:1009-3044(2008)34-1683-02
Designed of Small Font Based on Embedded Platform
CHEN Hui
(Zhongshan Institute, University of Electronic Science and Technology, Zhongshan 528402, china)
Abstract: This paper develops small font system for embedded devices, introduced the character of the system design principles and character encoding and display principles, the system has been success-fully applied to a cable digital TV receiver.
Key words: dot-matrix font; vector font; embedded devices; look-up table method; address mapping
1 引言
文本顯示是用戶界面最基本的功能,為了增加界面的靈活性和美感,就需要有較為完備的字庫系統(tǒng)的支持。由于嵌入式設備的硬件條件不如PC機,因此我們不可能應用現(xiàn)在較為流行的TTF字庫。由于點陣字庫比較小,嵌入式設備目前主要使用點陣字庫,但點陣字庫不便于設計縮放、旋轉等,因此,小型矢量字庫已應用于很多嵌入式設備。本字庫系統(tǒng)就是結合使用了點陣字庫和矢量字庫。
2 字庫簡介
點陣字庫是把每一個字符定義成矩陣,點陣中的每個點只有一種狀態(tài),有筆畫或無筆畫[1]。然后用每個點的虛實來表示漢字的輪廓,對應于二進制數(shù)字1表示有筆畫,對應于此位的象素應置為字符顏色,0表示沒有筆畫,對應于此位的象素應置為背景顏色或不改變。
矢量字庫是基于漢字筆劃存儲的,每筆漢字邊緣用封閉多邊形描述,存儲時只需保存多邊形各頂點坐標即可,但為了節(jié)省存儲空間,采用壓縮存儲方式,每筆先給一個起點坐標(x0,y0),其余頂點采用相對于(x0,y0)的偏移量(△x,△y)表示,用(x0+△x,y0+△y)獲取其實際坐標。
3 字庫設計與實現(xiàn)
結合嵌入式設備存儲空間的限制,我們選用了ucdos3.x部分矢量字庫,TurboC2.0的西文矢量字庫和16、24點陣字庫。ucdos3.x矢量字庫及Turbo的西文矢量字庫存儲方法簡單,解碼算法容易,占用極少的存儲空間,容易實現(xiàn)字型的變換。16、24點陣字庫占用存儲空間少,顯示速度相對于矢量字庫較快,但不容易進行變換。由于16、24點陣字庫是用戶界面較為常用的字體,結合使用這兩種字庫,即可以滿足存儲空間的要求,又能加快文本的顯示速度。下面將具體介紹兩種字庫的結構和顯示原理。
3.1 廣泛漢字矢量字庫的編碼與顯示
在ucdos3.x矢量字庫中,每個漢字的矢量數(shù)據(jù)都由一指針指向,指針區(qū)在每個漢字字庫的開頭0xBB3E字節(jié)。每個漢字矢量數(shù)據(jù)指針占6個字節(jié),前4個字節(jié)為漢字的矢量數(shù)據(jù)在文件中的偏移量,后兩個字節(jié)為漢字矢量數(shù)據(jù)的長度。矢量數(shù)據(jù)格式為:控制碼+坐標值。共有十種控制碼:1)若控制碼第7,6位為11,清除碼,結束當前筆劃,在第一個坐標與當前坐標之間建立連線;建立新筆劃(x,y),各占7位,從控制碼的第5位開始,即11XXXXXXXYYYYYYY;2)
若控制碼的高4位小于等于0x40,控制碼低4位表示坐標值的個數(shù)(即有多少個坐標值),每個坐標占一個字節(jié),(x,y)各占4位,各自的最高位為符號位,即FXXXFYYY;3)若控制碼的高4位等于4,控制碼低4位表示坐標值的個數(shù)(即有多少個坐標值),每個坐標占一個字節(jié),(x,y)各占4位,X,Y均為正,即+XXXX+YYYY;4)若控制碼的高4位等于5,控制碼低4位表示坐標值的個數(shù),每個坐標占一個字節(jié),(x,y)各占4位,X為負,Y為正,即-XXXX+YYYY;5)若控制碼的高4位等于6,控制碼低4位表示坐標值的個數(shù),每個坐標占一個字節(jié),(x,y)各占4位,X,Y均為正,即-XXXX+YYYY;6)若控制碼的高4位等于7,控制碼低4位表示坐標值的個數(shù),每個坐標占一個字節(jié),(x,y)各占4位,X為正,Y為負,即+XXXX-YYYY;7)若控制碼等于0x80,其后1字節(jié)為Y坐標值,最高位為符號位,X坐標不變,即10000000FXXXXXXX;8)若控制碼等于0x90,其后1字節(jié)為Y坐標值,最高位為符號位,X坐標不變,即10010000FXXXXXXX;9) 若控制碼的高4位等于8,控制碼低4位為X坐標值,最高位為符號位,其后一字節(jié)為Y坐標,最高位為符號位,即1000FXXXFYYYYYYY;10)若控制碼的高4位等于9,控制碼低4位為Y坐標值,最高位為符號位,其后一字節(jié)為X坐標,最高位為符號位,即1001FYYYFXXXXXXX。
要顯示ucdos3.x矢量字體,我們首先要找到漢字指針在指針區(qū)的偏移,由下面的公式搜索漢字當前位置:pos=((qu-16)*94+wei-1)*6,變量qu、wei對應于漢字的區(qū)、位碼。找到漢字在字庫中的位置,就要對存儲的坐標進行解碼,依據(jù)ucdos3.x矢量字體的數(shù)據(jù)格式,使用switch語句可以很方便的獲得字體筆劃,最后只需要使用GDI系統(tǒng)中的LineTo()函數(shù)建立坐標連線。
3.2 西文矢量字庫的編碼與顯示
系統(tǒng)提供了litt.chr、goth.chr、sans.chr、trip.chr4個西文矢量字庫,矢量字庫由說明、索引、數(shù)據(jù)三部分組成,首先我們依據(jù)(字符ASCII碼值-32)*2+144找到索引項首地址,根據(jù)索引項找到字符的相對偏移地址(即矢量數(shù)據(jù)的存儲位置)和字符數(shù)據(jù)結束標志,pos=索引項高字節(jié)+索引項低字節(jié)*256。矢量數(shù)據(jù)為各點的橫,縱坐標,頭兩個字節(jié)為起始點坐標,后依次為各點坐標。字庫中讀取的x坐標需減去128以獲得真實坐標,縱坐標則有5中情況:1)若坐標值小于32,為真實坐標,且為畫線的起點;2)若縱坐標值大于等于32小于128,取值空缺;3)若縱坐標值大于等于128小于160,為筆畫中間點,當下一Y小于32時,為某筆畫終點,需減去128獲得真實坐標;4)若縱坐標值大于等于160,減去256獲取真實縱坐標值;5)當Y=0,且X值等于結束標志符加128時,表示字符的數(shù)據(jù)結束[2]。同理,利用GDI系統(tǒng)中的LineTo()函數(shù)連接實際的坐標值,至此,完成了嵌入式設備下矢量字庫的建立和顯示。
本文以西文矢量字庫為例,講述了矢量字庫的顯示,見圖1,ucdos矢量字庫顯示與上類同,只是解碼算法不同,索引部分包含數(shù)據(jù)長度而不是結束標志,結合已知的編碼算法,可以很容易的完成顯示,這里不再贅述。
3.3 矢量字庫的縮放設計
由于矢量字庫存放是字體筆劃坐標,因此,我們只需要對解碼的坐標值進行平移、縮放和旋轉即可實現(xiàn)字體的變形,其換算公式如下:
x=x*xf; // xf為x方向縮放因子 (1)
y=y*yf; // yf為y方向縮放因子 (2)
x1=x0+x*cos(a)-ysin(a); // x0平移因子,a旋轉角度 (3)
y1=y0+x*sin(a)+y*cos(a);//y0平移因子,a旋轉角度 (4)
換算公式中涉及到了正弦和余弦計算,而作者所在的嵌入式環(huán)境不支持這類運算,因此需要作者自己編寫這類函數(shù),考慮到嵌入式設備不似PC機有專門的浮點運算器,為了提高顯示速度,作者采用了查表法設計這類函數(shù)。
3.4 點陣字庫的顯示
點陣字庫的顯示則比較簡單,我們首先也需要找到字體在字庫中的位置,pos=((qu-1)*94+(wei-1))*fontsize*fontsize/16,fontsize即為點陣字體的尺寸(16或24),找到字體的位置,我們只需要按位讀取像素,通過掩碼0x80判斷象素為 1的位,調用GDI系統(tǒng)中的SetPixel()函數(shù)在屏幕的對應位置設置像素值即可。
4 應用實例
建立的小型字庫已成功應用于LSI方案的有線電視接收機中,從PC機獲得的字庫文件直接下載到存放字庫文件的8MROM芯片中[3],矢量字庫文件不進行解碼,完成地址映射到邏輯地址的映射后,根據(jù)矢量字庫的編碼算法,將矢量字庫文件進行解碼顯示,由于解碼算法簡單,顯示速度很快也節(jié)省了內存,點陣字庫只需要直接讀取位圖信息進行顯示即可。字庫具備擴展功能,例如衛(wèi)星電視接收機接收港臺電視信號,需要支持繁體字,我們可以利用相同的方法建立繁體字庫文件。下載繁體字庫文件于ROM芯片,完成物理地址到的邏輯映射,由于BIG5碼與GB碼在漢字編碼存在共用位段,進行碼間識別轉換后才能解碼顯示。
5 結語
從上述字庫的建立過程可以看到,作者設計的字庫系統(tǒng)非常小,矢量字庫文件是以解碼前的文件存儲的,并且選用的小點陣字庫。矢量字庫的解碼算法中,為了提高顯示速度,作者避免了一些復雜的浮點運算。系統(tǒng)字體豐富,容易實現(xiàn)字體的各種變換,能滿足用戶界面的需求。不過由于本設計只是對傳統(tǒng)字庫的組合設計,字庫文件有不同的編碼方式,底層的字體顯示函數(shù)需要單獨的代碼,代碼需經過多次封裝,難免存在一些不足。
參考文獻:
[1] 畢曉君,韓仲年.漢字字形及漢字庫存儲技術研究[J].自動化技術與應用,2007,26(12):95-98.
[2] 黃健青,王平.Turbo C矢量字庫的分析和使用[J].海南大學學報:自然科學版,1995,13(2):148-154.
[3] LSI Logic.SC2005 Single- Chip Source Decoder[Z].2000.