TTF字體基本知識及其在QT中的應用


字體類型

以Windows為例,有4種字體技術:
Raster:光柵型,就是用位圖來繪制字形(glyph),每個字都以位圖形式保存
Vector:矢量型,就是用一系列直線的結束點來表示字形
TrueType:使用一系列直線、曲線和一些提示(hint)命令來繪制字形
Microsoft OpenType:與TrueType一致
因為TrueType等字體的hint能夠調節只想的長度和曲線的形狀,所以,它能夠在不同大小的字體中表現良好。而Raster字體則是跟設備具體分辨率相關,而Vector字體則好一些,但是它的繪制效率較低,要比其他字體慢很多。
對於Raster和Vector字體,一般其資源文件的文件名以.fon結尾,內部分成表述字體度量信息的header和實際的glyph數據這兩部分,而對於TrueType和OpenType,則分成兩個文件,第一個以.fot結尾,描述了相關的header,另一個則以.ttf命名,包含真正的內容。
 
字體和字符集

字符集就是Character Sets。字符集中的每個字符都有一個數字與之對應。在Windows中有以下幾種字符集在使用。
Windows Character Set:本質上與US ASCII character set一樣,第一個字符的數字是0x20,最有一個是0xFF。對於字符集上不存在的字符,會用默認字型顯示,如Raster和Vector字體會用.來顯示,而TTF則會用方框表示。
Unicode Character Set:用2個字節的數字來表示多達2^16個字符(好像后來增加到4個字節),每個字符有獨立的數字表示。注意這里是字符集,而不是編碼。
另外還有OEM Character Set、Symbol Character Set和Vendor-Specific Characters Sets等
 
TTF文件結構

TTF字體就是TrueType Font的意思,一般文件后綴是ttf,TTF還允許不同的字體組合在一個文件中,這時候后綴為ttc,就是TrueType collect的意思。
TTF文件是由一系列的表組成的。第一張表就是font directory,它很特殊,專門用來指示其他的表;進階着就是包含font數據的其他表。每個表有一個四字符定義的表名,其中有些表是要求每個font文件必備的。如:
cmap 定義了字符到字形索引的對應關系,就是通過字內碼得到表loca中使用的index。包含了多個子表,用於支持不同的平台和編碼集
glyf 包含了字形數據,就是字形的輪廓定義和調整指令
head 定義了font header,字體全局信息
hhea 定義了水平header
hmtx 定義了水平metric
loca 定義了各字形在glyf表中偏移,根據cmap中得到的字形索引,在這里能夠得到對應的字型在glyf表中的偏移
maxp 定義了最大值profile,用於為字體分配內存
name 定義字體名稱、風格名以及版權說明等
post PostScript
有一個問題,字符如何在TTF文件中找到自己的字形呢,見下面的說明:
詳細說明一下cmap表,因為這個表是最重要的。由於存在不同的系統和編碼集,cmap表內涵多個子表,每個子表包含的基本信息有系統ID、編碼集以及在表的偏移量。一般系統ID有3和1,前者是Windows,后者是Macintosh。一般而言,TTF文件至少包含兩張子表,即Macintosh的Roman體系(PlatformID=1, Encoding=0)和Windows的UGI體系(PlatformID=3, Encoding=1),其中Encoding=1就是Unicode編碼。這些子表中保存了字符內碼到glyph index的對應。拿到glyph index的值可以到表loca中查到對應glyph表glyf中的偏移。
 
在Windows中,可以用下面的WIN32 API獲得字體信息。
DWORD GetFontData(HDC hDC, DWORD dwTable, DWORD dwOffset, LPVOID lpbBuffer, DWORD cbData)

具體可見http://bbs.chinaunix.net/thread-2041402-1-1.html

 
FontForge:字體的開發工具

用於開發和編輯字體的開源工具,詳見http://fontforge.sourceforge.net/
 
QT中的字體

QTE(Qt for Embedded)使用FreeType 2字體引擎來支持字體顯示。比如TrueType(ttf),Postscript Type(PFA/PFB),Bitmap Distrubution Format fonts(BDF)等。同時QTE自己還支持Qt Prerendered Font(QPF)字體,是一種位圖字體,不可縮放,作為QTE的本地字體。
 
TrueType是由蘋果和微軟為主開發的矢量字體技術(與之對應的是點陣字體),可以不變形的放大和縮小,文件名一般是*.fon、*.ttf和*.ttc,ttc是ttf的新標准,而fon是以前的老標准。目前有FreeType的字體引擎,作為一個軟件庫,能夠幫助處理TrueType字體的顯示。
 
BDF字體是X窗口系統的位圖字體格式,其文件分成兩部分,第一部分是描述整體屬性的header,第二部分則是每個字型的屬性和位圖數據。
 
QPF字體格式僅用於QT/Embedded的不可縮放字體,屬於QTE的官方字體,可用工具makeqpf,將ttf文件生成qpf字體文件。
 
在Qt中直接使用TTF字體或者PFA/PFB這些矢量字體,應用程序會在顯示的時候需要將矢量信息計算成點陣形式,會占用大量的計算能力和RAM。如果選用BDF字體,則速度非常慢,而且也需要占用較多資源。QPF是位圖字體,不需要再顯示時計算點陣,且由於不可縮放,位圖直接拿去顯示即可,速度和資源占用是最好的。
 
當QTE應用啟動時,會到$QT/lib/fonts目錄下去尋找對應的字體文件,包括QBF和TTF字體文件,為兼容期間也會繼續讀取該目錄下的fontdir文件。在代碼中使用QFont來應用字體,如果選定字體不存在,QFont有內在的match策略,自動選擇默認字體。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM