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:这一笔的透明度

         //这里每一笔都是按行绘制

         //说到这里,我只能说,又搞定了

    }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值