Freetype的使用
为了在公司的游戏引擎中添加truetype支持,捣鼓了一段时间freetype库.
1. 基本用法
freetype的编译使用就不细说了,非常的简单,网上的说明教程很多.
基本代码基本如下:
初始化ft库,载入字体并设置字体大小
传入字符对应的unicode值.渲染字体,获得字符对应的位图
接下来按照你喜欢的方式将bitmap中的像素信息(256透明度)画到屏幕上,freetype字体就搞定啦.
需要注意的是,绘制字符到屏幕时,还需要加上x轴和y轴的偏移量,这个值保存在ft2_face->glyph中,如下所示
int left =ft2_face->glyph->bitmap_left;
int top =ft2_face->glyph->bitmap_top;
2. 字体特效
阴影: 带上偏移量多绘制一次.ok
描边: 这个就比较麻烦了,当时我弄了好久,用像素字方式绘制出的轮廓效果并不好.网上查了很多资料,也语焉不详.
最快捷的方式就是在调用FT_Render_Glyph之前调用
FT_Outline_Embolden( ft2_face->glyph->outline, 2*iBW<<6 );
先渲染一个加粗的字符,绘制到屏幕上,然后重新生成一个正常形状的字符并绘制,两者叠加,就有了描边效果.
FT_Outline_Embolden就是freetype加粗字形的函数,其中第二个参数指定了增粗的像素大小,
由于第二个参数使用的格式是26.6 pixel format,所以要在实际像素值上再乘以64.
还有一种方式,是freetype提供的example2中使用的方式,
网络上的能搜到的也大都是这种,不过说明的也太简洁了,让我这种菜鸟看的蛋疼.
不过这种方式的好处是能给描边加上一些特殊的处理,比如说圆角描边
代码如下
主体
回调函数(这里才是真主体,通过这个回调获得渲染信息)
void
RasterCallback(int y0,
int count,
const FT_Span * spans,
void * user)
{
CCanvas * canvas = (CCanvas *)user;
unsigned short * iptr = canvas->Ptr16();
for (int i = 0; i < count; ++i)
{
short x = spans[i].x;
int y = y0;
unsigned short l = spans[i].len;
unsigned char a = spans[i].coverage;
//这里就取得了绘制轮廓时的每一笔的信息
//x,y:一笔的起始位置
//l:一笔的长度
//a:这一笔的透明度
//这里每一笔都是按行绘制
//说到这里,我只能说,又搞定了
}
}
Freetype的使用
为了在公司的游戏引擎中添加truetype支持,捣鼓了一段时间freetype库.
1. 基本用法
freetype的编译使用就不细说了,非常的简单,网上的说明教程很多.
基本代码基本如下:
初始化ft库,载入字体并设置字体大小
传入字符对应的unicode值.渲染字体,获得字符对应的位图
接下来按照你喜欢的方式将bitmap中的像素信息(256透明度)画到屏幕上,freetype字体就搞定啦.
需要注意的是,绘制字符到屏幕时,还需要加上x轴和y轴的偏移量,这个值保存在ft2_face->glyph中,如下所示
int left =ft2_face->glyph->bitmap_left;
int top =ft2_face->glyph->bitmap_top;
2. 字体特效
阴影: 带上偏移量多绘制一次.ok
描边: 这个就比较麻烦了,当时我弄了好久,用像素字方式绘制出的轮廓效果并不好.网上查了很多资料,也语焉不详.
最快捷的方式就是在调用FT_Render_Glyph之前调用
FT_Outline_Embolden( ft2_face->glyph->outline, 2*iBW<<6 );
先渲染一个加粗的字符,绘制到屏幕上,然后重新生成一个正常形状的字符并绘制,两者叠加,就有了描边效果.
FT_Outline_Embolden就是freetype加粗字形的函数,其中第二个参数指定了增粗的像素大小,
由于第二个参数使用的格式是26.6 pixel format,所以要在实际像素值上再乘以64.
还有一种方式,是freetype提供的example2中使用的方式,
网络上的能搜到的也大都是这种,不过说明的也太简洁了,让我这种菜鸟看的蛋疼.
不过这种方式的好处是能给描边加上一些特殊的处理,比如说圆角描边
代码如下
主体
回调函数(这里才是真主体,通过这个回调获得渲染信息)
void
RasterCallback(int y0,
int count,
const FT_Span * spans,
void * user)
{
CCanvas * canvas = (CCanvas *)user;
unsigned short * iptr = canvas->Ptr16();
for (int i = 0; i < count; ++i)
{
short x = spans[i].x;
int y = y0;
unsigned short l = spans[i].len;
unsigned char a = spans[i].coverage;
//这里就取得了绘制轮廓时的每一笔的信息
//x,y:一笔的起始位置
//l:一笔的长度
//a:这一笔的透明度
//这里每一笔都是按行绘制
//说到这里,我只能说,又搞定了
}
}