• <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>

            HUUYUU

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

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

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

            更新時間:2006-12-19

             

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

             

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

             

            字體的outline(輪廓):這是用來描述字體的基本手段,它一般由直線和貝塞爾(Bézier)曲線組成。貝塞爾(Bézier)曲線是一條由三個點確定的曲線,假設(shè)這三點的坐標(biāo)是(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

             

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

             

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

            l         支持循環(huán)。

            l         支持條件分支。

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

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

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

            l         其它一些方法。

             

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

             

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

             

            文件頭的格式為:

            類型

            名稱

            描述

            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)為:

            類型

            名稱

            描述

            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ù)庫、glyf表存放的是outline數(shù)據(jù)、而EBDT表存放的是嵌入式位圖。

             

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

             

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

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

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

             

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

             

            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.         設(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.         把字符顯示出來(與具體實現(xiàn)有關(guān))

            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 閱讀(1347) 評論(1)  編輯 收藏 引用

            Feedback

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

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



            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            综合久久国产九一剧情麻豆| 欧美成a人片免费看久久| 久久久无码精品亚洲日韩软件| 人妻丰满AV无码久久不卡| 思思久久99热只有频精品66| 久久涩综合| 国产精品成人久久久| 无码八A片人妻少妇久久| 久久夜色精品国产噜噜亚洲a | 久久99国内精品自在现线| 无码久久精品国产亚洲Av影片| 国产成人精品三上悠亚久久| 久久人人爽人人爽人人av东京热 | 青青热久久国产久精品 | 久久免费视频6| 色综合久久中文字幕综合网| 合区精品久久久中文字幕一区| 中文字幕无码av激情不卡久久| 久久精品日日躁夜夜躁欧美| 亚洲国产精品无码久久| 国产精品久久久久久久久免费| 久久se这里只有精品| 亚洲精品无码久久久久AV麻豆| 久久久久久精品无码人妻| 国产A三级久久精品| 久久99热只有频精品8| 久久99久久无码毛片一区二区| 久久中文字幕人妻丝袜| 91精品国产色综合久久| 久久综合视频网站| 99久久精品日本一区二区免费| 狠狠色丁香婷婷综合久久来来去| 久久91精品国产91| 久久久青草青青亚洲国产免观| 亚洲日韩欧美一区久久久久我| MM131亚洲国产美女久久| 久久久久亚洲精品天堂久久久久久| 亚洲精品无码专区久久久| 久久精品国产亚洲av瑜伽| 久久精品99久久香蕉国产色戒| 中文字幕精品无码久久久久久3D日动漫 |