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

HUUYUU

Freetype學(xué)習(xí)筆記

轉(zhuǎn)載時(shí)請(qǐng)注明出處和作者聯(lián)系方式:http://blog.csdn.net/absurd

作者聯(lián)系方式:Li XianJing <xianjimli at hotmail dot com>

更新時(shí)間:2006-12-19

 

GTK+(基于DirectFB)的字體繪制是通過(guò)pango+freetype+fontconfig三者協(xié)作來(lái)完成的,其中,fontconfig負(fù)責(zé)字體的管理和配置,freetype負(fù)責(zé)單個(gè)字符的繪制,pango則完成對(duì)文字的排版布局。而我對(duì)這一部分的了解,基本上是空白的。這兩天為了解決一個(gè)關(guān)于字體的BUG,花了一些時(shí)間閱讀相關(guān)資料,這里記錄一些freetype的學(xué)習(xí)筆記。

 

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

 

字體的outline(輪廓):這是用來(lái)描述字體的基本手段,它一般由直線(xiàn)和貝塞爾(Bézier)曲線(xiàn)組成。貝塞爾(Bézier)曲線(xiàn)是一條由三個(gè)點(diǎn)確定的曲線(xiàn),假設(shè)這三點(diǎn)的坐標(biāo)是(Ax, Ay)(Bx, By) (Cx, Cy),那么曲線(xiàn)方程為:

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

 

字體精調(diào)提示(hint)Outline已經(jīng)描述字體的表現(xiàn)形式,但是數(shù)學(xué)上的正確對(duì)人眼來(lái)說(shuō)并不見(jiàn)得合適,特別是縮放到特定的大小和分辨率的時(shí)候,字體可能變得不好看,或者不清析。Hint指的是一系列的技術(shù),用來(lái)精調(diào)字體,讓字體變得更美觀(guān),更清析。

 

truetype字體中,hint是用一種編程語(yǔ)言來(lái)表述的,這種語(yǔ)言有點(diǎn)像匯編語(yǔ)言,每個(gè)語(yǔ)句完成一個(gè)單一的功能,通常用一個(gè)虛擬機(jī)來(lái)解釋執(zhí)行。它具有下列特點(diǎn):

l         支持循環(huán)。

l         支持條件分支。

l         支持用戶(hù)定義的函數(shù)。

l         支持以不同方式操作數(shù)據(jù)的指令集。

l         支持?jǐn)?shù)學(xué)和邏輯指令集。

l         其它一些方法。

 

字符影射表(charmap)。字符對(duì)應(yīng)的字體數(shù)據(jù)稱(chēng)為glyph,字體文件中通常帶有一個(gè)字符映射表,用來(lái)把字符映射到對(duì)應(yīng)glyph的索引值。因?yàn)樽址木幋a方式有多種,所以可以存在多個(gè)子映射表,以支持從不同編碼的字符到glyph索引的映射。如果某個(gè)字符沒(méi)有對(duì)應(yīng)的glyph,返回索引0glyph 0通常顯示一個(gè)方塊或者空格。

 

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

 

文件頭的格式為:

類(lèi)型

名稱(chēng)

描述

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.

 

而表目錄的結(jié)構(gòu)為:

類(lèi)型

名稱(chēng)

描述

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.

 

而表的內(nèi)容則與具體的表有關(guān),比如cmap表存放是的字符映射關(guān)系、fpgm表存放的是outline的函數(shù)庫(kù)、glyf表存放的是outline數(shù)據(jù)、而EBDT表存放的是嵌入式位圖。

 

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

 

矢量字體的處理比較麻煩,即要進(jìn)行矢量計(jì)算,又進(jìn)行精調(diào)處理,相對(duì)于點(diǎn)陣字體來(lái)說(shuō)慢多了,會(huì)不會(huì)存在性能問(wèn)題呢?可能會(huì)的,不過(guò)可以通過(guò)下列兩種方式緩解性能問(wèn)題:

l         cache法。把剛計(jì)算出來(lái)的glyph放到cache中,下次再用到這個(gè)字符時(shí),直接從cache中取,而不用重新計(jì)算。

l         預(yù)先計(jì)算法。把常用值預(yù)先計(jì)算出來(lái),放在hdmx等表中,這可以節(jié)省不少計(jì)算時(shí)間。

 

Freetype是一個(gè)操作字體的函數(shù)庫(kù),它不但可以處理點(diǎn)陣字體,也可以處理多種矢量字體,包括truetype字體,為上層應(yīng)用程序提供了一個(gè)統(tǒng)一的調(diào)用接口。Freetype具有良好的可移植性,特別考慮了嵌入式應(yīng)用環(huán)境,字體文件可以在文件系統(tǒng)中,也可以在ROM中,甚至可以用自定義IO函數(shù)來(lái)訪(fǎng)問(wèn)字體數(shù)據(jù)。Freetype采用模塊化設(shè)計(jì),很容易進(jìn)行擴(kuò)充和裁減,據(jù)說(shuō)如果只支持truetype,裁減后的二進(jìn)制文件大小只有25KFreetype是開(kāi)放源代碼的,它采用FreeTypeGPL兩種開(kāi)源協(xié)議,可以用于任何商業(yè)用途。

 

Freetype的使用相對(duì)比較簡(jiǎn)單:

 

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.         設(shè)置字體的大小

  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.         字體變換(旋轉(zhuǎn)和縮放)

  error = FT_Set_Transform(

            face,       /* target face object    */

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

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

 

 

7.         把字符顯示出來(lái)(與具體實(shí)現(xiàn)有關(guān))

draw_bitmap( &slot->bitmap,

                    pen_x + slot->bitmap_left,

pen_y - slot->bitmap_top );

 

 

對(duì)于字體處理,我才了解一點(diǎn)皮毛,希望大家不吝賜教。

 

參考資源:

http://freetype.sourceforge.net

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

 

~~end~~

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

Feedback

# re: Freetype學(xué)習(xí)筆記 2008-07-12 08:22 mAGICfLYER

FreeType 的HINT是一種專(zhuān)利技術(shù),需要經(jīng)過(guò)APPLE的授權(quán)。  回復(fù)  更多評(píng)論   



只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            最新亚洲一区| 欧美日本乱大交xxxxx| 老司机精品视频网站| 欧美插天视频在线播放| 亚洲欧美日韩精品久久| 六月婷婷一区| 亚洲看片免费| 久久av免费一区| 日韩五码在线| 亚洲免费观看视频| 国产日韩精品一区观看| 美女精品一区| 久久精品国产99精品国产亚洲性色| 欧美黄色免费| 欧美成人午夜剧场免费观看| 亚洲福利视频一区| 欧美福利专区| 久久躁狠狠躁夜夜爽| 国产在线不卡视频| 欧美在线观看视频在线| 欧美在线看片| 午夜精品视频在线观看| 国产午夜精品视频| 国产精品国产a级| 国产精品九九久久久久久久| 欧美激情一区二区三区在线视频观看| 亚洲精品一二三| 亚洲综合视频一区| 亚洲欧洲精品一区| 国产精品高潮呻吟视频| 国产精品红桃| 欧美日韩三级在线| 欧美在线中文字幕| 久久久久久穴| 亚洲人成人一区二区三区| 亚洲国产婷婷| 欧美三级在线视频| 久久黄金**| 欧美一级黄色网| 午夜精品久久一牛影视| 久久精品一区中文字幕| 男女视频一区二区| 亚洲女人天堂av| 国产精品jizz在线观看美国| 蜜桃av一区二区| 欧美激情视频给我| 欧美一区二区三区视频在线观看 | 欧美亚洲视频在线观看| 亚洲作爱视频| 亚洲精品欧美精品| 亚洲福利电影| 久久网站免费| 国产精品久久久久久久午夜片| 国产一区激情| 久久久在线视频| 一本一本a久久| 小黄鸭精品密入口导航| 久久精品国产欧美亚洲人人爽| 亚洲美女在线国产| 女人色偷偷aa久久天堂| 免费日韩成人| 亚洲一区二区四区| 欧美精品系列| 亚洲精品久久久久久久久久久久| 国内精品美女av在线播放| 欧美一区二区三区喷汁尤物| 日韩亚洲精品视频| 亚洲日本aⅴ片在线观看香蕉| 欧美日韩中文在线| 夜夜夜久久久| 亚洲欧美日本精品| 国产精品亚洲欧美| 欧美一区二区视频在线| 亚洲精品人人| 激情亚洲网站| 亚洲国产精品久久人人爱蜜臀 | 一区二区三区成人精品| 亚洲美女黄色| 欧美人与性动交cc0o| 99视频在线观看一区三区| 欧美一区亚洲| 亚洲精品欧美一区二区三区| 欧美亚洲综合久久| 欧美一区二区视频免费观看| 亚洲黄色影片| 欧美好骚综合网| 欧美亚洲一级| 亚洲午夜电影网| 国产欧美一区二区三区沐欲| 亚洲国产欧美日韩精品| 久久天天躁狠狠躁夜夜av| 9i看片成人免费高清| 亚洲伦理在线| 久久综合九色综合欧美就去吻| 91久久精品一区二区三区| 欧美先锋影音| 欧美日精品一区视频| 奶水喷射视频一区| 麻豆91精品| 久久精品国产91精品亚洲| 国产精品超碰97尤物18| 欧美成人一区二区三区| 国产精品人人做人人爽人人添| 久久女同互慰一区二区三区| 免费欧美高清视频| 麻豆91精品91久久久的内涵| 黑人中文字幕一区二区三区| 亚洲一区影音先锋| 久久精品一本| 久久人人爽人人| 夜夜嗨av一区二区三区中文字幕| 欧美激情aaaa| 最新中文字幕一区二区三区| 欧美大片在线看免费观看| 亚洲国产精品成人综合| 最新国产の精品合集bt伙计| 亚洲精品一区二区三区av| 亚洲国产日韩一区| 久久精品国产亚洲5555| 久久综合色一综合色88| 久久久久久久精| 亚洲影视在线播放| 久久久久久综合| 在线欧美一区| 欧美日韩午夜剧场| 另类专区欧美制服同性| 亚洲精品1区| 性久久久久久久久久久久| 最近中文字幕mv在线一区二区三区四区 | 久久精品成人一区二区三区蜜臀| 亚洲国产精品一区二区第一页 | 亚洲欧美自拍偷拍| 一本色道久久88综合亚洲精品ⅰ | 一区二区久久久久久| 久久婷婷久久一区二区三区| 亚洲欧美视频在线观看| 国产精品色在线| 久久人人97超碰精品888| 久久一二三国产| 久久性色av| 日韩视频精品在线观看| 一本大道久久a久久综合婷婷| 欧美午夜精品一区| 午夜日韩视频| 欧美影片第一页| 亚洲精品中文字幕女同| 中国av一区| 韩国福利一区| 亚洲高清自拍| 国产精品热久久久久夜色精品三区| 午夜精品久久久久久久| 久久国产成人| 亚洲最新视频在线| 欧美一区二区三区免费观看视频| 国产综合精品| 一区二区三区 在线观看视| 国产一级久久| a4yy欧美一区二区三区| 国产综合亚洲精品一区二| 亚洲人成小说网站色在线| 国产久一道中文一区| 亚洲精品久久久久久久久久久久久 | 久久综合婷婷| 亚洲欧美999| 伊人久久婷婷| 日韩性生活视频| 好吊视频一区二区三区四区| 亚洲区欧美区| 一区二区三区在线观看国产| 亚洲精品女人| 国产欧美一区二区三区久久| 亚洲精品国产视频| 狠狠色综合日日| 9久re热视频在线精品| 亚洲福利电影| 欧美一区二区精品久久911| 欧美理论电影在线观看| 久久九九电影| 国产精品女人网站| 亚洲日本中文| 亚洲级视频在线观看免费1级| 香蕉成人伊视频在线观看 | 久久久久久久网| aa级大片欧美三级| 亚洲成色777777在线观看影院| 亚洲性感美女99在线| 夜夜嗨一区二区三区| 美女网站在线免费欧美精品| 午夜精品国产精品大乳美女| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久成人一区二区| 国产精品日韩欧美一区二区三区| 91久久精品国产91性色tv| 亚洲国产成人午夜在线一区| 久久aⅴ乱码一区二区三区| 久久国产精品黑丝| 国产视频久久| 欧美在线免费看| 老色鬼精品视频在线观看播放| 午夜性色一区二区三区免费视频|