青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

HUUYUU

Freetype學習筆記

轉載時請注明出處和作者聯系方式:http://blog.csdn.net/absurd

作者聯系方式:Li XianJing <xianjimli at hotmail dot com>

更新時間:2006-12-19

 

GTK+(基于DirectFB)的字體繪制是通過pango+freetype+fontconfig三者協作來完成的,其中,fontconfig負責字體的管理和配置,freetype負責單個字符的繪制,pango則完成對文字的排版布局。而我對這一部分的了解,基本上是空白的。這兩天為了解決一個關于字體的BUG,花了一些時間閱讀相關資料,這里記錄一些freetype的學習筆記。

 

盡管點陣字體在時間和空間性能上都有較佳的表現,但是由于缺乏靈活性,無法改變字體的大小和風格,除了在一些嵌入式設備中仍然在使用外,大多數系統都使用矢量字體了。矢量字體不像點陣字體那樣直接記錄字符的字模數據,而是記錄字體描述信息,其中最重要的兩部分是outlinehint。

 

字體的outline(輪廓):這是用來描述字體的基本手段,它一般由直線和貝塞爾(Bézier)曲線組成。貝塞爾(Bézier)曲線是一條由三個點確定的曲線,假設這三點的坐標是(Ax, Ay)、(Bx, By) (Cx, Cy),那么曲線方程為:

    px = (1-t)2.Ax + 2t(1-t).Bx + t2.Cx
    py = (1-t)2.Ay + 2t(1-t).By + t2.Cy

 

字體精調提示(hint)。Outline已經描述字體的表現形式,但是數學上的正確對人眼來說并不見得合適,特別是縮放到特定的大小和分辨率的時候,字體可能變得不好看,或者不清析。Hint指的是一系列的技術,用來精調字體,讓字體變得更美觀,更清析。

 

truetype字體中,hint是用一種編程語言來表述的,這種語言有點像匯編語言,每個語句完成一個單一的功能,通常用一個虛擬機來解釋執行。它具有下列特點:

l         支持循環。

l         支持條件分支。

l         支持用戶定義的函數。

l         支持以不同方式操作數據的指令集。

l         支持數學和邏輯指令集。

l         其它一些方法。

 

字符影射表(charmap)。字符對應的字體數據稱為glyph,字體文件中通常帶有一個字符映射表,用來把字符映射到對應glyph的索引值。因為字符集的編碼方式有多種,所以可以存在多個子映射表,以支持從不同編碼的字符到glyph索引的映射。如果某個字符沒有對應的glyph,返回索引0,glyph 0通常顯示一個方塊或者空格。

 

矢量字體有多種不同的格式,其中TrueType用得最為廣泛。它的擴展名通常為OTF或者TTF,它的文件內容由幾部分組成,文件頭、表目錄和表。文件頭描述了版本號和表的數目等信息,表目錄記錄了表的偏移量和大小,表則是表的實際數據。

 

文件頭的格式為:

類型

名稱

描述

Fixed

sfnt version

0x00010000 for version 1.0.

USHORT

numTables

Number of tables.

USHORT

searchRange

(Maximum power of 2 <= numTables) x 16.

USHORT

entrySelector

Log2(maximum power of 2 <= numTables).

USHORT

rangeShift

NumTables x 16-searchRange.

 

而表目錄的結構為:

類型

名稱

描述

ULONG

tag

4 -byte identifier.

ULONG

checkSum

CheckSum for this table.

ULONG

offset

Offset from beginning of TrueType font file.

ULONG

length

Length of this table.

 

而表的內容則與具體的表有關,比如cmap表存放是的字符映射關系、fpgm表存放的是outline的函數庫、glyf表存放的是outline數據、而EBDT表存放的是嵌入式位圖。

 

EBDT(嵌入式位圖)有什么用呢,原來是這樣的,矢量字體盡管可以任何縮放,但縮得太小時,仍然存在問題,字體會變得不好好看或者不清析,即使采用hint精調,效果也不一定好,或者那樣處理太麻煩了,這時可以采用點陣字體來彌補矢量字體的不足,EBDT就是用來存放點陣字體的字模數據的。

 

矢量字體的處理比較麻煩,即要進行矢量計算,又進行精調處理,相對于點陣字體來說慢多了,會不會存在性能問題呢?可能會的,不過可以通過下列兩種方式緩解性能問題:

l         cache法。把剛計算出來的glyph放到cache中,下次再用到這個字符時,直接從cache中取,而不用重新計算。

l         預先計算法。把常用值預先計算出來,放在hdmx等表中,這可以節省不少計算時間。

 

Freetype是一個操作字體的函數庫,它不但可以處理點陣字體,也可以處理多種矢量字體,包括truetype字體,為上層應用程序提供了一個統一的調用接口。Freetype具有良好的可移植性,特別考慮了嵌入式應用環境,字體文件可以在文件系統中,也可以在ROM中,甚至可以用自定義IO函數來訪問字體數據。Freetype采用模塊化設計,很容易進行擴充和裁減,據說如果只支持truetype,裁減后的二進制文件大小只有25KFreetype是開放源代碼的,它采用FreeTypeGPL兩種開源協議,可以用于任何商業用途。

 

Freetype的使用相對比較簡單:

 

1.         包含freetype的頭文件。

#include <ft2build.h>

#include FT_FREETYPE_H

 

 

2.         初始化freetype

FT_Library  library;

error = FT_Init_FreeType( &library );

 

 

3.         加載字體

error = FT_New_Face( library,

                       "/usr/share/fonts/truetype/arial.ttf",

                       0,

&face );

 

或者

error = FT_New_Memory_Face( library,

                              buffer,    /* first byte in memory */

                              size,      /* size in bytes        */

                              0,         /* face_index           */

                              &face );

 

 

4.         設置字體的大小

  error = FT_Set_Char_Size(

            face,    /* handle to face object           */

            0,       /* char_width in 1/64th of points  */

            16*64,   /* char_height in 1/64th of points */

            300,     /* horizontal device resolution    */

            300 );   /* vertical device resolution      */

  error = FT_Set_Pixel_Sizes(

            face,   /* handle to face object */

            0,      /* pixel_width           */

            16 );   /* pixel_height          */

 

 

5.         加載字符的glyph

glyph_index = FT_Get_Char_Index( face, charcode );

  error = FT_Load_Glyph(

            face,          /* handle to face object */

            glyph_index,   /* glyph index           */

            load_flags );  /* load flags, see below */

  error = FT_Render_Glyph( face->glyph,   /* glyph slot  */

                           render_mode ); /* render mode */

 

 

6.         字體變換(旋轉和縮放)

  error = FT_Set_Transform(

            face,       /* target face object    */

            &matrix,    /* pointer to 2x2 matrix */

&delta );   /* pointer to 2d vector  */

 

 

7.         把字符顯示出來(與具體實現有關)

draw_bitmap( &slot->bitmap,

                    pen_x + slot->bitmap_left,

pen_y - slot->bitmap_top );

 

 

對于字體處理,我才了解一點皮毛,希望大家不吝賜教。

 

參考資源:

http://freetype.sourceforge.net

http://www.truetype-typography.com/

 

~~end~~

posted on 2008-07-10 22:22 HUYU 閱讀(1388) 評論(1)  編輯 收藏 引用

Feedback

# re: Freetype學習筆記 2008-07-12 08:22 mAGICfLYER

FreeType 的HINT是一種專利技術,需要經過APPLE的授權。  回復  更多評論   



只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久激情网站| 免费成人黄色片| 亚洲乱码国产乱码精品精天堂| 一本色道久久综合狠狠躁篇怎么玩| 韩国精品在线观看| 亚洲一区二区三区精品视频 | 激情亚洲网站| 亚洲午夜电影网| 一区二区三区欧美亚洲| 欧美高潮视频| 欧美成人情趣视频| 一区在线视频观看| 欧美一区国产一区| 久久精品国产久精国产一老狼| 国产精品地址| 一区二区日韩精品| 一区二区三区四区精品| 欧美精品在线免费播放| 亚洲高清不卡在线| 亚洲激情自拍| 欧美成人综合| 91久久久久久| 一本久道久久综合狠狠爱| 欧美激情一区二区三区高清视频 | 国产欧美日本一区视频| 亚洲一二三区精品| 午夜视频一区二区| 国产日韩欧美夫妻视频在线观看| 亚洲自拍啪啪| 久久精品99久久香蕉国产色戒| 国产亚洲欧美另类一区二区三区| 午夜在线视频一区二区区别| 久久久人成影片一区二区三区| 国产专区综合网| 老司机精品视频一区二区三区| 欧美mv日韩mv国产网站| 亚洲日本激情| 欧美日韩精品一二三区| 亚洲一区二区免费看| 久久国产精品一区二区三区四区 | 欧美高清hd18日本| 亚洲精品一区在线| 欧美亚州一区二区三区 | 99国产精品久久久久久久| 亚洲小说区图片区| 国产目拍亚洲精品99久久精品| 欧美在线视频观看免费网站| 免费成人av资源网| 一本大道久久a久久精二百| 国产精品av免费在线观看| 亚洲免费一在线| 欧美黑人国产人伦爽爽爽| 亚洲深夜激情| 激情综合网激情| 欧美成人亚洲| 午夜精品免费| 亚洲国产精品久久久久婷婷老年| 亚洲一区国产一区| 黄色小说综合网站| 欧美日韩亚洲一区三区| 欧美一区二区三区视频免费播放| 欧美成人三级在线| 亚洲欧美成人| 亚洲黄网站黄| 国产偷自视频区视频一区二区| 免费在线观看精品| 亚洲欧美激情一区二区| 亚洲精品123区| 久久久噜噜噜久久人人看| 99riav1国产精品视频| 国产在线视频欧美| 欧美日韩一区二区精品| 久久综合久久综合这里只有精品| 中文精品99久久国产香蕉| 欧美成人午夜| 久久久久久九九九九| 亚洲一区www| 亚洲国产高清aⅴ视频| 国产日韩一区二区三区| 欧美日韩精品一区二区| 农村妇女精品| 久久精品国产亚洲一区二区三区 | 激情视频一区| 国产精品亚发布| 欧美日韩免费观看一区| 狂野欧美性猛交xxxx巴西| 欧美一级日韩一级| 国产精品99久久久久久人 | 欧美国产综合一区二区| 欧美在线一区二区| 在线亚洲一区观看| 激情综合五月天| 国产网站欧美日韩免费精品在线观看| 欧美日韩亚洲成人| 欧美成人免费全部观看天天性色| 久久亚洲免费| 久久久噜噜噜久久中文字免| 欧美一区视频| 欧美亚洲一区二区在线| 亚洲欧美在线一区| 亚洲一区视频| 亚洲综合色噜噜狠狠| 中国成人亚色综合网站| 一区二区国产日产| 一本久久知道综合久久| 一本久道久久综合狠狠爱| 亚洲精品欧美极品| 日韩午夜电影在线观看| 一本色道久久综合精品竹菊| 一区二区精品在线观看| 亚洲视频1区2区| 亚洲一区在线播放| 欧美一区二区三区在线观看视频| 午夜天堂精品久久久久 | 午夜久久一区| 欧美亚洲色图校园春色| 久久精品国产欧美激情| 久久久久九九九| 欧美1区2区3区| 欧美伦理91i| 国产精品yjizz| 国产亚洲午夜高清国产拍精品| 国产主播精品在线| 亚洲第一在线综合网站| 日韩午夜av在线| 午夜精品福利电影| 久久永久免费| 亚洲欧洲另类| 中文一区字幕| 久久精品国产第一区二区三区最新章节| 久久av一区二区| 欧美成人一区二区在线| 国产精品久久久久久久免费软件| 国产日韩欧美不卡| 亚洲国产精品一区二区www在线| 日韩视频在线观看一区二区| 亚洲欧美日韩在线高清直播| 久久午夜视频| 99re热精品| 久久黄色级2电影| 欧美日本在线一区| 国产区亚洲区欧美区| 91久久精品美女高潮| 新67194成人永久网站| 免费精品视频| 亚洲一区二区日本| 欧美高清在线一区| 国产一级揄自揄精品视频| 亚洲卡通欧美制服中文| 久久9热精品视频| 亚洲精品久久嫩草网站秘色 | 久久久精品国产免大香伊| 欧美激情一区二区三区| 国产亚洲欧美日韩日本| 一本色道久久综合亚洲精品不| 久久精品国产77777蜜臀| 亚洲乱码国产乱码精品精98午夜 | 久久中文字幕一区| 国产精品女主播在线观看| 91久久中文字幕| 久久精品国产亚洲精品| 一本大道久久a久久综合婷婷| 久久亚洲春色中文字幕久久久| 国产精品免费区二区三区观看| 亚洲欧洲综合另类在线| 久久视频在线视频| 亚洲天堂av图片| 欧美另类极品videosbest最新版本| 国产综合网站| 欧美一区二区三区视频在线| 亚洲免费观看在线观看| 欧美大片va欧美在线播放| 韩国av一区二区三区| 欧美一区日韩一区| 宅男噜噜噜66一区二区66| 欧美日本一区二区三区| 亚洲日韩欧美视频| 裸体一区二区三区| 久久成人这里只有精品| 国产欧美日本| 欧美一区二区福利在线| 亚洲无线一线二线三线区别av| 欧美日韩精品欧美日韩精品| 亚洲精品视频一区| 亚洲国产小视频| 欧美成人免费在线视频| 亚洲精品字幕| 欧美激情中文字幕在线| 蜜臀99久久精品久久久久久软件| 影音先锋一区| 欧美成人嫩草网站| 欧美阿v一级看视频| 亚洲日本免费电影| 亚洲国产日韩一区二区| 欧美日韩ab| 亚洲欧美国产日韩中文字幕| 亚洲在线黄色| 狠狠久久五月精品中文字幕| 久久躁狠狠躁夜夜爽| 久久―日本道色综合久久|