嵌入式linux字体库,嵌入式 初探freetype字体库
文字的顯示依賴于字體字庫,大致的字體字庫分為點(diǎn)陣字庫、筆畫字庫和輪廓字庫。
點(diǎn)陣字庫:缺點(diǎn)比較明顯,縮放存在鋸齒,渲染旋轉(zhuǎn)等操作相對復(fù)雜,且效果不理想,先大多用在嵌入式行業(yè)(基本拋棄),常見格式有bdf,pcf,fnt,hbf,hzf等。
筆畫字體:不討論。
輪廓字體:即矢量字體,利用字體輪廓及填充實(shí)現(xiàn)字體顯示,優(yōu)勢明顯,渲染縮放較容易,但效率相對低些(相對于嵌入式)
簡單來說,freetype為字體字庫提供了一套解決方案,支持文字字體渲染等操作,主要還是其為C語言編寫,跨平臺,為很多不支持矢量字體格式的嵌入式系統(tǒng)提供使用嵌入式字體的可能,且效率不低。
基本流程為:
加載字體字庫文件-> 查找待顯示的文字索引-> 渲染操作(若反走樣處理)->處理為位圖數(shù)據(jù)->顯示
freetype官網(wǎng)http://freetype.sourceforge.net/index2.html
下面為在XP下顯示中文字體的實(shí)例,在官方下載源碼,在..\freetype-2.4.2\builds\win32\vc2008\下打開工程,編譯為鏈接庫,新建VS2008的MFC程序,加載freetype242.lib庫。
簡單考慮,直接在MFC中的draw函數(shù)中畫出一個中文漢字。便于顯示,使用GDI+畫出漢字,因此首先對GDI+進(jìn)行初始化等操作(GDI+的相關(guān)知識不討論,不清楚可以留言或索取GDI+文檔,網(wǎng)上也可以搜搜)
在view.h中添加頭文件聲明
1
2
#include
#include FT_FREETYPE_H
在view.h中添加成員變量
1
2
3
public:
FT_Library
library;
FT_Face
face;
在view.cpp的構(gòu)造函數(shù)中添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//
初始化庫
bool bError =
FT_Init_FreeType(&library);
if (!bError)
{
//
是否初始化成功
}
//
加載一個字庫文件,這里為黑體中文字庫
bError = FT_New_Face(library,
"C:\\WINDOWS\\Fonts\\simhei.ttf",
0,
&face);
if (bError ==
FT_Err_Unknown_File_Format)
{
// 表示可以打開和讀此文件,但不支持此字體格式
}
else if (bError)
{
// 其他錯誤
}
// 設(shè)定為UNICODE,默認(rèn)也是
FT_Select_Charmap(face,FT_ENCODING_UNICODE);
//
設(shè)定字體字符寬高和分辨率
bError = FT_Set_Char_Size(face, 0, 16*64, 300,
300);
在::OnDraw(CDC* pDC)中添加代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool bError;
wchar_t wChar=
_T('博');
//
查找‘好’的字符索引
FT_UInt glyph_index = FT_Get_Char_Index(face,
wChar);
//
裝載字型圖像到字形槽
bError = FT_Load_Glyph(face, glyph_index,
FT_LOAD_DEFAULT);
//
轉(zhuǎn)換為位圖數(shù)據(jù)
if (face->glyph->format !=
FT_GLYPH_FORMAT_BITMAP)
{
//
第二個參數(shù)為渲染模式,這里渲染為1位位圖(黑白位圖),若為FT_RENDER_MODE_NORMAL則渲染為256級灰度圖
bError = FT_Render_Glyph(face->glyph,
FT_RENDER_MODE_MONO);
}
這里便可以通過face->glyph->bitmap獲得字體“博”的位圖數(shù)據(jù)了,bitmap中存放了如位圖的寬高、色深,調(diào)色板等信息,便可以通過GDI+繪制該圖像了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//創(chuàng)建位位圖
BITMAPINFO bmpinfo = {0};
//
初始化位圖結(jié)構(gòu)體
bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpinfo.bmiHeader.biWidth =
face->glyph->bitmap.width;
bmpinfo.bmiHeader.biHeight =
face->glyph->bitmap.rows;
bmpinfo.bmiHeader.biBitCount = 1;// 與渲染模式有關(guān),詳見FreeType
API手冊的FT_Bitmap部分說明
bmpinfo.bmiHeader.biClrImportant = 0;
bmpinfo.bmiHeader.biClrUsed = 0;
bmpinfo.bmiHeader.biCompression = BI_RGB;
bmpinfo.bmiHeader.biPlanes = 1;
bmpinfo.bmiHeader.biSizeImage = 0;
// 創(chuàng)建內(nèi)存位圖
unsigned char *pvBits
= new unsigned char[10000];
HBITMAP hBitmap
=CreateDIBSection(NULL, &bmpinfo, DIB_RGB_COLORS,
(void ** )&pvBits, NULL, 0 );
int iLineBytes =
(bmpinfo.bmiHeader.biWidth + 7) / 8;
for (int
i = 0; i != bmpinfo.bmiHeader.biHeight;
++i)
{
memcpy(pvBits +
i * iLineBytes, face->glyph->bitmap.buffer + i * iLineBytes,
iLineBytes);
}
Bitmap *pBitmap = Bitmap::FromHBITMAP(hBitmap,
NULL);
Graphics graphic(pDC->m_hDC);
graphic.DrawImage(pBitmap, Point(20,
150));
這部分代碼不多解釋,只是顯示位圖數(shù)據(jù),這里face->glyph->bitmap是沒有調(diào)色板的1位位圖,源于使用FT_RENDER_MODE_MONO渲染模式
顯示預(yù)覽
總結(jié)
以上是生活随笔為你收集整理的嵌入式linux字体库,嵌入式 初探freetype字体库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css两栏式布局示例
- 下一篇: 小鱼的数字游戏递归解