天天看點

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政策,自動選擇預設字型。