概述
對于嵌入式系統應用中,盡管點陣字體在時間和空間性能上都有較佳的表現,但是由于缺乏靈活性,無法改變字體的大小、字形和風格,為解決這些問題,引入freetype2.5.3,FreeType庫是一個開源的、可移植的字體引擎,它功能強大,簡單說就是支持字體的花樣顯示。 組件支持以下功能:
支持多種字體格式文件,并提供了統一的訪問接口;
支持單色位圖、反走樣位圖渲染;
采用面向對象思想設計,用戶可以靈活的根據需要裁剪。
版權信息
FTL 一個類似BSD風格的license
目錄結構
.
├── FTL.TXT # license描述文件
├── devel # DEBUG級別配置文件
├── src # freetype實現文件
├── include # freetype頭文件
├── package.yaml # ymal編譯環境配置文件
├── README.md # 說明文檔
依賴組件
vfs
常用配置
系統中相關配置已有默認值,如需修改配置,統一在YAML中def_config節點修改,具體如下:
編譯時允許引用內部頭文件:必須允許, 如果不允許會導致編譯不過,在YAML中修改FT2_BUILD_LIBRARY配置
def_config:
FT2_BUILD_LIBRARY: y
API說明
freetype API用法與開源版本一致,最重要最常用的API如下,其他API可以在網上搜索其用法。
FT_Init_FreeType初始化
FT_Library pFTLib;
// Init FreeType Lib to manage memory
error = FT_Init_FreeType(&pFTLib);
if (error)
{
pFTLib = 0;
printf("There is some error when Init Library");
return -1;
}
FT_New_Face裝載一個字體
FT_Face pFTFace;
// create font face from font file
error = FT_New_Face(pFTLib, "arialuni.ttf", 0, &pFTFace);
FT_Set_Char_Size和FT_Set_Pixel_Sizes設置當前字體大小跟像素尺寸
當一個新的face對象建立時,所有成員都在初始化階段設為0。調用FT_Set_Char_Size和FT_Set_Pixel_Sizes對這個結構進行賦值。
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 */
FT_Set_Pixel_Sizes(face, /* handle to face object */
0, /* pixel_width */
16 ); /* pixel_height */
FT_Load_Glyph加載字符的glyph
glyph_index = FT_Get_Char_Index(face, charcode);
FT_Load_Glyph(face, /* handle to face object */
glyph_index, /* glyph index */
load_flags ); /* load flags, see below */
FT_Set_Transform字體變換(旋轉跟縮放)
FT_Set_Transform(face, /* target face object */
&matrix, /* pointer to 2x2 matrix */
&delta); /* pointer to 2d vector */
使用示例
用freetype顯示一個字符的主要步驟: 0.初始化FT_Init_Freetype() 1.給定一個文字的ASCII碼(例如‘A’是0x41) 2.提供一個字體文件 3.根據編碼值到字體文件加載對應的glyph(glyph含有關鍵點,相對位置。實際上是根據字符的編碼類型和編碼值找到glyph,不同的編碼類型的字符,要用不同的charmap來尋找其glyph,一個charmap支持一種編碼,即有多個charmap以支持多種編碼)可理解為字體文件含有charmap和字的對應glyph 4.設置字體大小 5.用某些函數把glyph里的關鍵點縮放為這個字體大小 6.轉換為位圖點陣(最終還是點陣) 7.在LCD上顯示出來
由于freetype是對矢量字體做顯示,需要顯示設備的配合,目前已經在SDL2中調用了freetype的接口去鏈接ttf字庫,然后在屏幕上顯示中英文字符,具體使用情況可以查看components/SDL2/src/ttf/SDL_TTF.c
FAQ
Q1: 什么是charmap?
答:字符影射表(charmap)。字符對應的字體數據稱為glyph,字體文件中通常帶有一個字符映射表,用來把字符映射到對應glyph的索引值。因為字符集的編碼方式有多種,所以可以存在多個子映射表,以支持從不同編碼的字符到glyph索引的映射。如果某個字符沒有對應的glyph,返回索引 0 ,glyph 0 通常顯示一個方塊或者空格。
Q2: freetype支持哪些字體格式?
答:freetype提供統一的接口來訪問多種字體格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。