最近學(xué)習(xí)狀態(tài)不佳,感覺(jué)什么都想做卻什么也做不下去,浮躁之極。大的庫(kù)一下子研究不下來(lái),索性找一下小庫(kù)來(lái)看看。
游戲里面一般都涉及到文本、壓縮、圖像、腳本的概念,為了將來(lái)有機(jī)會(huì)研究游戲所以先下手這些小庫(kù),不求甚解只求用好。
先從字體著手,F(xiàn)reeType字體作為一種字體文件編程開(kāi)發(fā)包,廣泛易用在游戲里面。網(wǎng)上漢語(yǔ)資料比較少,只能看它的faq。翻譯了部分如下:
FreeType 2 Library
FAQ
(當(dāng)前下載地址:
http://sourceforge.net/project/showfiles.php?group_id=3157
版本
2.2.1
)
1、?
FreeType2
是什么?
它是一個(gè)為各種應(yīng)用程序提供通用的字體文件訪問(wèn)的軟件包。尤其值得注意的以下特性:
l????????
提供統(tǒng)一的字體文件訪問(wèn)接口。支持位圖和向量格式,包括
TrueType
、
OpenType
、
Typel
、
CID
、
CFF
、
Windows FON/FNT
、
X11 PCF
。
l????????
提供高效反走樣的基于
256
灰度級(jí)的位圖字形的生產(chǎn)。
l????????
模塊清晰,每種字體格式對(duì)于一個(gè)模塊。類庫(kù)的構(gòu)建可以按照你需要支持的格式進(jìn)行裁減以減小代碼尺寸。(最小的反走樣
FreeType
庫(kù)
<30Kb
)
2、?
FreeType2
能做什么?
FT2
已經(jīng)易用于許多領(lǐng)域。例如:
l????????
圖形子系統(tǒng)和文本顯示庫(kù)
l????????
文本排版(布局、分頁(yè)、渲染)
l????????
字體識(shí)別和轉(zhuǎn)換工具
一般來(lái)說(shuō),該庫(kù)使得你能輕松的操縱字體文件。
3、?
FreeType2
不能做什么?
FT2
并不包含大量豐富的高級(jí)特性,它只定位于出色的字體服務(wù)。也就是說(shuō)下面的一些特性
FT2
類庫(kù)并不直接提供支持,然而你可以以它為基礎(chǔ)在上層進(jìn)行實(shí)現(xiàn):
l????????
任意表面的文字渲染
FT2
不是圖形庫(kù)所以它僅支持兩種象素格式的文本渲染:
1-bit
的單色位圖和
8-bit
的灰度象素。
如果你需要繪制其它格式的表面(例如
24-bit RGB
象素),你就得選擇其它你喜愛(ài)的圖形庫(kù)來(lái)做。
注意:為了渲染向量輪廓文本而不是放走樣的象素,應(yīng)用程序可以提供自己的渲染回調(diào)以繪制或者直接組合反走樣文本到任意目標(biāo)表面。
l????????
文本緩存
每次從字體中請(qǐng)求文本圖象,
FT2
都要解析字體文件
/
流相關(guān)部分,通過(guò)它的字體格式進(jìn)行解釋。對(duì)于某些特殊格式可能會(huì)很慢包括像
TrueType
(或者
Type1
)這樣的向量字體。
注意:自從
2.0.1
版本開(kāi)始
FT2
提供了一個(gè)
beta
版本的緩存子系統(tǒng)。當(dāng)然你還是可以寫自己的緩存來(lái)滿足某種特殊需求。
l????????
文本布局
不支持文本布局操作。高級(jí)操作例如文本替換、字距調(diào)整、兩端調(diào)整等都不屬于字體服務(wù)本身職責(zé)。
4、?
FreeType2
可移植性?
FT2
源碼可移植性很好由于以下原因:
l????????
代碼書寫遵循
ANSI C
標(biāo)準(zhǔn)
l????????
對(duì)于各種編譯警告我們都謹(jǐn)慎的避免。當(dāng)前代碼在很多編譯器上編譯通過(guò)且沒(méi)有產(chǎn)生一條警告。
l????????
庫(kù)沒(méi)有使用任何硬編碼,是嵌入式系統(tǒng)開(kāi)發(fā)的一個(gè)好的選擇。(例如它能夠直接在
ROM
中運(yùn)行)
同時(shí),我們盡最大努力確保庫(kù)的高效、緊湊和友好性。
5、?
FreeType2
與
FreeType1.x
的區(qū)別?
最大的區(qū)別就是:
l????????
FT1
僅支持
TrueType
格式,而
FT2
支持很多格式。
l????????
FT2 APIs
比
FT1 APIs
簡(jiǎn)單且強(qiáng)大。
l????????
FT1
包括
OpenType
文本布局處理擴(kuò)展,而
FT2
中則不包括而是移到獨(dú)立的工程里面――
FreeType Layout
。(
FT
布局目前無(wú)法獲取)
6、?
FreeType2
是否兼容
FreeType 1.x
?
FreeType2
不直接兼容
FreeType 1.x
,但是我們可以提供一個(gè)二進(jìn)制兼容層使得應(yīng)用程序重鏈接到新版本。我們最終放棄了這種想法因?yàn)閮蓚€(gè)版本可以共存在一個(gè)系統(tǒng)中。(沒(méi)有命名沖突)
FT2 API
比
1.x
簡(jiǎn)單且強(qiáng)大,所以我們鼓勵(lì)你采用新版本,這樣可以使你減少很多不必要的工作。
7、?
是否可以使用
FreeType2
編輯字體或者創(chuàng)建新字體?
答案是明確的:不可以。因?yàn)樵搸?kù)設(shè)計(jì)明確,用較少代碼和內(nèi)存讀取字體文件。所以我們不打算以任何方式在字體引擎里面支持編輯或者創(chuàng)建功能,因?yàn)檫@樣將導(dǎo)致整個(gè)代碼重寫。這并不意味我們將來(lái)不會(huì)引入字體編輯
/
創(chuàng)建功能庫(kù),這取決于需求(或者說(shuō)有多少人愿意為此買單)。
在我們正式發(fā)布前不要在這方面進(jìn)行揣測(cè),對(duì)我們而言這個(gè)項(xiàng)目存在其他一些更重要的部分需要解決(像文字布局、文本緩存)。
編譯
&
配置
1、?
如何編譯
FreeType2
庫(kù)?
可以采取多種編譯方式,在
freetype2/docs/build
下有詳細(xì)說(shuō)明文檔。
這里介紹最簡(jiǎn)單的基于
VS IDE
的編譯方式。
freetype\builds\win32\visualc
下有
VC6
和
VC7.1
的工作區(qū)文件。
VC6
打開(kāi)后直接編譯,有幾個(gè)警告。
光看或許無(wú)法到感性認(rèn)識(shí),于是來(lái)兩個(gè)demo。網(wǎng)上比較少,我是參考nehe教程寫的。總體來(lái)說(shuō)會(huì)簡(jiǎn)單使用了,如果想深入了解怕是非看他的document不可。
簡(jiǎn)單使用示例
FT_Library????pFTLib????????
=
?NULL;
????FT_Face????????pFTFace????????
=
?NULL;
????FT_Error????error????????
=
?
0
;
????
//
?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
;
????}
????
//
?create?font?face?from?font?file
????error?
=
?FT_New_Face(pFTLib,?
"
C:\\WINDOWS\\Fonts\\arial.ttf
"
,?
0
,?
&
pFTFace);
????
if
(
!
error)

????
{
????????FT_Set_Char_Size(pFTFace,?
16
<<
6
,?
16
<<
6
,?
300
,?
300
);
????????FT_Glyph????glyph;
????????
//
?load?glyph?'C'
????????FT_Load_Glyph(pFTFace,?FT_Get_Char_Index(pFTFace,?
67
),?FT_LOAD_DEFAULT);
????????error?
=
?FT_Get_Glyph(pFTFace
->
glyph,?
&
glyph);
????????
if
(
!
error)

????????
{
????????????
//
?convert?glyph?to?bitmap?with?256?gray
????????????FT_Glyph_To_Bitmap(
&
glyph,?ft_render_mode_normal,?
0
,?
1
);
????????????FT_BitmapGlyph????bitmap_glyph?
=
?(FT_BitmapGlyph)glyph;
????????????FT_Bitmap
&
????bitmap?
=
?bitmap_glyph
->
bitmap;
????????????
for
(
int
?i
=
0
;?i
<
bitmap.rows;?
++
i)

????????????
{
????????????????
for
(
int
?j
=
0
;?j
<
bitmap.width;?
++
j)

????????????????
{
????????????????????
//
?if?it?has?gray>0?we?set?show?it?as?1,?o?otherwise
????????????????????printf(
"
%d
"
,?bitmap.buffer[i
*
bitmap.width
+
j]
?
1
:
0
);
????????????????}
????????????????printf(
"
\n
"
);
????????????}
????????????
//
?free?glyph
????????????FT_Done_Glyph(glyph);
????????????glyph?
=
?NULL;
????????}
????????
//
?free?face
????????FT_Done_Face(pFTFace);
????????pFTFace?
=
?NULL;
????}
????
//
?free?FreeType?Lib
????FT_Done_FreeType(pFTLib);
????pFTLib?
=
?NULL;
截圖:

導(dǎo)出的文字C

示例下載
目前還不知道如何顯示漢字。
posted on 2006-11-08 14:05
萬(wàn)連文 閱讀(16106)
評(píng)論(27) 編輯 收藏 引用 所屬分類:
亂七八糟