万星星@豌豆荚 欢迎加入我们
一个吃软饭的男人!!!!!我只想写程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  trackbacks - 0

最近学习状态不佳,感觉什么都想做却什么也做不下去,浮躁之极。大的库一下子研究不下来,索性找一下小库来看看。
游戏里面一般都涉及到文本、压缩、图像、脚本的概念,为了将来有机会研究游戏所以先下手这些小库,不求甚解只求用好。

先从字体着手,FreeType字体作为一种字体文件编程开发包,广泛易用在游戏里面。网上汉语资料比较少,只能看它的faq。翻译了部分如下:

FreeType 2 Library

FAQ

(当前下载地址: http://sourceforge.net/project/showfiles.php?group_id=3157 版本 2.2.1

1、  FreeType2 是什么?

它是一个为各种应用程序提供通用的字体文件访问的软件包。尤其值得注意的以下特性:

l         提供统一的字体文件访问接口。支持位图和向量格式,包括 TrueType OpenType Typel CID CFF Windows FON/FNT X11 PCF

l         提供高效反走样的基于 256 灰度级的位图字形的生产。

l         模块清晰,每种字体格式对于一个模块。类库的构建可以按照你需要支持的格式进行裁减以减小代码尺寸。(最小的反走样 FreeType <30Kb

2、  FreeType2 能做什么?

FT2 已经易用于许多领域。例如:

l         图形子系统和文本显示库

l         文本排版(布局、分页、渲染)

l         字体识别和转换工具

一般来说,该库使得你能轻松的操纵字体文件。

3、  FreeType2 不能做什么?

FT2 并不包含大量丰富的高级特性,它只定位于出色的字体服务。也就是说下面的一些特性 FT2 类库并不直接提供支持,然而你可以以它为基础在上层进行实现:

l         任意表面的文字渲染

FT2 不是图形库所以它仅支持两种象素格式的文本渲染: 1-bit 的单色位图和 8-bit 的灰度象素。

如果你需要绘制其它格式的表面(例如 24-bit RGB 象素),你就得选择其它你喜爱的图形库来做。

注意:为了渲染向量轮廓文本而不是放走样的象素,应用程序可以提供自己的渲染回调以绘制或者直接组合反走样文本到任意目标表面。

l         文本缓存

每次从字体中请求文本图象, FT2 都要解析字体文件 / 流相关部分,通过它的字体格式进行解释。对于某些特殊格式可能会很慢包括像 TrueType (或者 Type1 )这样的向量字体。

注意:自从 2.0.1 版本开始 FT2 提供了一个 beta 版本的缓存子系统。当然你还是可以写自己的缓存来满足某种特殊需求。

l         文本布局

不支持文本布局操作。高级操作例如文本替换、字距调整、两端调整等都不属于字体服务本身职责。

4、  FreeType2 可移植性?

FT2 源码可移植性很好由于以下原因:

l         代码书写遵循 ANSI C 标准

l         对于各种编译警告我们都谨慎的避免。当前代码在很多编译器上编译通过且没有产生一条警告。

l         库没有使用任何硬编码,是嵌入式系统开发的一个好的选择。(例如它能够直接在 ROM 中运行)

同时,我们尽最大努力确保库的高效、紧凑和友好性。

5、  FreeType2 FreeType1.x 的区别?

最大的区别就是:

l         FT1 仅支持 TrueType 格式,而 FT2 支持很多格式。

l         FT2 APIs FT1 APIs 简单且强大。

l         FT1 包括 OpenType 文本布局处理扩展,而 FT2 中则不包括而是移到独立的工程里面―― FreeType Layout 。( FT 布局目前无法获取)

6、  FreeType2 是否兼容 FreeType 1.x

FreeType2 不直接兼容 FreeType 1.x ,但是我们可以提供一个二进制兼容层使得应用程序重链接到新版本。我们最终放弃了这种想法因为两个版本可以共存在一个系统中。(没有命名冲突)

FT2 API 1.x 简单且强大,所以我们鼓励你采用新版本,这样可以使你减少很多不必要的工作。

7、  是否可以使用 FreeType2 编辑字体或者创建新字体?

答案是明确的:不可以。因为该库设计明确,用较少代码和内存读取字体文件。所以我们不打算以任何方式在字体引擎里面支持编辑或者创建功能,因为这样将导致整个代码重写。这并不意味我们将来不会引入字体编辑 / 创建功能库,这取决于需求(或者说有多少人愿意为此买单)。

在我们正式发布前不要在这方面进行揣测,对我们而言这个项目存在其他一些更重要的部分需要解决(像文字布局、文本缓存)。

编译 & 配置

1、  如何编译 FreeType2 库?

可以采取多种编译方式,在 freetype2/docs/build 下有详细说明文档。

这里介绍最简单的基于 VS IDE 的编译方式。 freetype\builds\win32\visualc 下有 VC6 VC7.1 的工作区文件。 VC6 打开后直接编译,有几个警告。



光看或许无法到感性认识,于是来两个demo。网上比较少,我是参考nehe教程写的。总体来说会简单使用了,如果想深入了解怕是非看他的document不可。
简单使用示例

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;


截图:

导出的文字C


示例下载

目前还不知道如何显示汉字。

posted on 2006-11-08 14:05 万连文 阅读(16078) 评论(27)  编辑 收藏 引用 所属分类: 乱七八糟

FeedBack:
# re: FreeType2研究
2006-11-08 16:43 | LOGOS
要跑到游戏领域上去?  回复  更多评论
  
# re: FreeType2研究
2006-11-08 17:38 | 万连文
以前学习ogl很长时间,苦赖没有机会,永远是个业余爱好者。  回复  更多评论
  
# re: FreeType2研究
2006-11-08 23:48 | 沐枫
以前有用过ft2,但是发现,在简体中文windowsxp下面,显示繁体中文时,显示位置会不对。  回复  更多评论
  
# re: FreeType2研究
2006-11-08 23:53 | 万连文
@沐枫
希望能教下我如何显示汉字,谢谢  回复  更多评论
  
# re: FreeType2研究
2006-11-11 12:08 | 沐枫
汉字码是Unicode。用相应汉字的Unicode编码,就可以取到了。  回复  更多评论
  
# re: FreeType2研究
2006-12-26 09:44 | loky
有关于freetype库编译的文档吗?有的话发我一份,有点急xusky1985@163.com  回复  更多评论
  
# re: FreeType2研究
2007-05-08 11:20 | hanyh
@沐枫
我用了汉字的Unicode编码,但显示的都一样,都像一个“口”
不知道这是为什么?  回复  更多评论
  
# re: FreeType2研究
2007-05-08 15:15 | 绝对零度
Freetype初始化时,需要设定字体的编码。你没有设置编码,所以显示汉字有问题。  回复  更多评论
  
# re: FreeType2研究
2007-05-09 09:36 | hanyh
@绝对零度
能具体解释一下怎么做吗?
当新建一个face对象时,它不是默认选择Unicode字符表吗?我加了FT_Select_Charmap(pFTFace,FT_ENCODING_UNICODE)以后,还是老样子——输入汉字unicode编码时,显示的都是缺失字形  回复  更多评论
  
# re: FreeType2研究
2007-05-09 09:40 | hanyh
哦,对了,我用的是上面的那个例子  回复  更多评论
  
# re: FreeType2研究
2007-05-09 10:24 | hanyh
好了,只要字体文件包含unicode编码就行了,把上面的arial.ttf改成arialuni.ttf就可以了  回复  更多评论
  
# re: FreeType2研究
2007-05-17 10:25 | hanyh
除了描点,还有其它好的显示方法吗?
字体一大,就会出现很明显的锯齿  回复  更多评论
  
# re: FreeType2研究
2007-05-22 15:51 | 沐枫
你得到一个“口”,估计是字体文件没有对应的字符。
你可以用 simsun.ttf试试。  回复  更多评论
  
# re: FreeType2研究
# re: FreeType2研究
2007-08-17 15:34 | 万连文
FT_Error error = 0;
error = FT_Init_FreeType(&m_pFTLib);
if(error)
{
m_pFTLib = NULL;
TRACE(_T("There is some error when Init Library..."));
return;
}

error = FT_New_Face(m_pFTLib, "C:\\WINDOWS\\Fonts\\SIMSUN.TTC", 0, &m_pFTFace);
if(error)
{
m_pFTFace = NULL;
TRACE(_T("There is some error when New Face..."));
return;
}
FT_Set_Char_Size(m_pFTFace, 12<<6, 12<<6, 500, 500);




FT_Glyph glyph = NULL;
FT_Error error = 0;
FT_Select_Charmap(m_pFTFace, FT_ENCODING_UNICODE);
error = FT_Load_Glyph(m_pFTFace, FT_Get_Char_Index(m_pFTFace, L'啊'), FT_LOAD_DEFAULT);
if(!error)
{
error = FT_Get_Glyph(m_pFTFace->glyph, &glyph);
if(!error)
{
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)
{
for(int k=0; k<m_iZoom; ++k)
{
for(int l=0; l<m_iZoom; ++l)
{
pDC->SetPixel(CPoint(100+j*m_iZoom+l, 100+i*m_iZoom+k), bitmap.buffer[i*bitmap.width+j]);
}
}
}
}
FT_Done_Glyph(glyph);
glyph = NULL;
}
}
  回复  更多评论
  
# re: FreeType2研究 c#如何使用
2007-10-25 17:52 | JJJJ
在C#中如何度取truetype中数据.
1 .直接分析文件,从开始做起
2.采用API函数
3.采用freetype
但是第2,和第3
不知道怎么用!
第二是,参数不知道怎么定义.
第3 是:不知道如何使用
请高手帮忙???
给点代码  回复  更多评论
  
# re: FreeType2研究
2008-09-22 17:56 | Condor
好像现在官方有FOR C#版的。  回复  更多评论
  
# re: FreeType2研究
2008-10-29 19:41 | 小不点
freetype有oblique, italic, bold, underline,等的style么?  回复  更多评论
  
# re: FreeType2研究[未登录]
2008-10-29 23:35 | 万连文
按照我的理解,这个应该属于字体类型。 FF作为字体管理库应该不会实现。  回复  更多评论
  
# re: FreeType2研究
2008-11-21 16:31 | 陈卫
很好很强大 谢谢了 找了4天了 终于找到一个完整的demo   回复  更多评论
  
# re: FreeType2研究
2008-11-21 18:07 | test
楼上的,我也在弄FreeType2的东西,能给个邮件吗,遇到问题大家一起讨论一下。
目前我的问题是,为什么我用2.3.7/build/win32/下2005的工程编译的lib不能用,链接时候报错.
而我下载的FreeType2 Win32的工程里面的lib就可以?  回复  更多评论
  
# re: FreeType2研究
2009-10-09 17:04 | null
@小不点
freetype有oblique, italic, bold, underline,等的style么?

都有,还有anti-aliasing  回复  更多评论
  
# re: FreeType2研究
2010-06-04 17:16 | 路过
@hanyh
你应该使用一个中文字体  回复  更多评论
  
# re: FreeType2研究
2011-05-08 20:30 | 毕达哥拉斯半圆
正好要做这方面的工作,谢谢楼主,先收藏下,回头交流  回复  更多评论
  
# re: FreeType2研究
2013-04-06 15:17 | sgf
博主不行啊。。。。。这简直都算不上研究。。。。。
有没有兴趣分析分析freetype的源代码啊。。。  回复  更多评论
  
# re: FreeType2研究
2013-04-24 10:30 | hquu
请问有谁能在WINXP里面安装ming呢
有劳酬谢  回复  更多评论
  
# re: FreeType2研究
2013-04-24 10:31 | hquu
请问有谁能在WINXP里面安装ming呢
有劳酬谢

ming 好像要装freetype
我不会装

我的QQ :369772066  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


简历下载
联系我

<2009年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(66)

随笔分类

随笔档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜