请选择 进入手机版 | 继续访问电脑版

12360技术网 - 专业IT技术发表平台

 立即注册  找回密码
查看: 6460|回复: 5

图文使用freetype渲染字体+字体颜色+字体大小

[复制链接]

21

主题

32

帖子

304

积分

中级会员

Rank: 3Rank: 3

积分
304
发表于 2020-1-25 06:26:17 | 显示全部楼层 |阅读模式
freetype的介绍各种博客都有,可以搜索看看。
我这边就直接写demo,本demo可以生成带颜色的bitmap;
使用freetype显示一个字符简单,网上示例也很多,但是将整屏的数据都一起传递给freetype,让其生成整屏完整的bitmap,网上几乎没有找到,再加上字体的渲染,就更少之有少,本问应用是24行40列的电视图文显示使用,也会提供本范例编译出来的freetype库文件及头文件的连接。
本范例实现整屏数据整体转换,整体渲染字色,大小和间距需要按需调整,可以NewFTString中调整;
FT_Set_Char_Size设置大小及分辨率;
#include "ftglyph.h"
#include "freetype.h"
#include

static S32 indexLength = 0;
#define WIDTH_TTX   1280
#define HEIGHT_TTX  720
#define MAX_GLYPHS      1024
/* origin is the upper left corner */
#define dataLength (24 * 40)
static U32 dataIndexBuf[dataLength];
unsigned char* imageBuffer;
static FT_Face pFTFace;
static FT_Library library;
typedef struct FTCode_ {
    FT_ULong code;
    char utf8str[8];
}FTCode;
typedef struct FTStrImage {
    unsigned int width;
    unsigned int height;
    unsigned char* imageBuffer;
}FTStrImage;

typedef struct TGlyph_
{
    FT_UInt index;
    FT_Vector pos;
    FT_BBox drawBox;
    FT_Glyph glyph;
} TGlyph, *PGlyph;
typedef struct {
    unsigned char* image;
    unsigned int width;
    unsigned int height;
    unsigned int strLen;
}FTString;

struct color_ttx
{
    U8 blue;
    U8 green;
    U8 red;
};
color_ttx color_BITMAP[6]
{
    {0x00,0x00,0xff},/**red*/
    {0x00,0xFF,0x00},/**green**/
    {0xFF,0x00,0x00},/**blue**/
    {0x00,0x00,0x00},/**black**/
    {0xFF,0xFF,0xFF},/**white**/
    {0x00,0xFF,0xFF}/**yellow**/
};
static FTStrImage strim;
S32 initFontLib()
{
    FT_Error error = FT_Init_FreeType(&library);
    if (error)
    {
        LOGE("error = %d\n", error);
        return 0;
    }
    error = FT_New_Face(library, "/factory/atv/font/文件名.ttf", 0, &pFTFace);
    if (error == FT_Err_Unknown_File_Format )
    {
        LOGE(" ERROR: fonts not support format!\n");
        return 0;
    }
    else if (error)
    {
        LOGE("ERROR: fonts file cannot open!\n");
        return 0;
    }
    return 0;
}
 
S32 deInitFontLib()
{
    //free face?
    FT_Done_Face(pFTFace);
    pFTFace = NULL;
    free(pFTFace);
    //free FreeType Lib
    FT_Done_FreeType(library);
    library = NULL;
    return 0;
}
FTStrImage NewFTString()
{
    FT_Error error;
    FT_Set_Char_Size(pFTFace,16 index = FT_Get_Char_Index(pFTFace, dataIndexBuf[dataLength    - (24 - line)*40 + n %40]);
        if ( use_kerning && previous && glyph->index)
        {
            FT_Vector delta;
            FT_Get_Kerning(pFTFace, previous, glyph->index,
            FT_KERNING_DEFAULT, &delta );
            pen_x += delta.x >> 6;
            LOGE("pen_x = %d delta.x = %d\n",pen_x,delta.x);
        }
        glyph->pos.x = pen_x;
        glyph->pos.y = pen_y;
        error = FT_Load_Glyph(pFTFace, glyph->index, FT_LOAD_DEFAULT);
        if ( error )
        {
            LOGE("ERROR: FT_Load_Glyph\n");
        }
        error = FT_Get_Glyph(pFTFace->glyph, &glyph->glyph);//装载一个新的字形图像到字形槽,前面装载的将会从字形槽中抹去
        if ( error )
        {
            LOGE("ERROR: FT_Get_Glyph!\n");
        }

        pen_x += slot->advance.x >> 6;
        previous = glyph->index;
        FT_Glyph_Get_CBox(glyph->glyph, FT_GLYPH_BBOX_TRUNCATE, &glyph_bbox);
        //LOGE("pos.x = %d,pos.y = %d,,previous = %d",glyph->pos.x,glyph->pos.y,previous);
        glyph_bbox.xMin += glyph->pos.x;
        glyph_bbox.xMax += glyph->pos.x;
        glyph_bbox.yMin += glyph->pos.y;
        glyph_bbox.yMax += glyph->pos.y;
        if(n == 0)
        {
            spacing = glyph_bbox.yMax;//用于保存字符的行高
        }
        if (glyph_bbox.xMin < bbox.xMin)
        {
            bbox.xMin = glyph_bbox.xMin;
        }
        if (glyph_bbox.yMin < bbox.yMin)
        {
            bbox.yMin = glyph_bbox.yMin;
        }
        if (glyph_bbox.xMax > bbox.xMax)
        {
            bbox.xMax = glyph_bbox.xMax;
        }
        if (glyph_bbox.yMax > bbox.yMax)
        {
            bbox.yMax = glyph_bbox.yMax;
        }
        //LOGE("[%d %d %d %d]\n", glyph_bbox.xMin, glyph_bbox.yMin, glyph_bbox.xMax, glyph_bbox.yMax);
        glyph->drawBox = glyph_bbox;
        glyph++;
    }
    num_glyphs = glyph - glyphs;
    if ( bbox.xMin > bbox.xMax )
    {
        bbox.xMin = 0;
        bbox.yMin = 0;
        bbox.xMax = 0;
        bbox.yMax = 0;
    }
    unsigned int width = bbox.xMax+1;
    unsigned int height = bbox.yMax-bbox.yMin+1;
    unsigned int start_x = 0;
    unsigned int start_y = 0;
    LOGE("width = %d height = %d \n", width, height);
    for ( unsigned int n = 0; n < indexLength; n++)
    {
        PGlyph pplyph = glyphs+n;
        FT_Vector pen = glyph->pos;
        error = FT_Glyph_To_Bitmap(&pplyph->glyph, FT_RENDER_MODE_NORMAL, &pen, 0);
        if ( !error )
        {
            FT_BitmapGlyph bit = (FT_BitmapGlyph)pplyph->glyph;
            start_x = pplyph->drawBox.xMin;
            start_y = height - (pplyph->drawBox.yMin-bbox.yMin+bit->bitmap.rows);
            for (unsigned int y = 0; y < bit->bitmap.rows; y++)
            {
                for (unsigned int x = 0; x < bit->bitmap.width; x++)
                {
                    unsigned int iy = start_y + y;
                    unsigned int ix = start_x + x;
                    unsigned int index = (iy*width + ix)*4;
                    imageBuffer[index] = color_BITMAP[4].blue;
                    imageBuffer[index+1] = color_BITMAP[4].green;
                    imageBuffer[index+2] = color_BITMAP[4].red;
                    imageBuffer[index+3] = bit->bitmap.buffer[y * bit->bitmap.width + x];
                }
            }
            FT_Done_Glyph(pplyph->glyph);
        }
    }
    //free codes
    free(codes);
    strim.width = width;
    strim.height = height;
    strim.imageBuffer = imageBuffer;//release after
    return strim;
}
 
void test()
{
        initFontLib();
        memset(&strim,0x00,sizeof(strim));
        imageBuffer = (unsigned char*)malloc(WIDTH_TTX*HEIGHT_TTX*4);
        memset(imageBuffer,0x00,WIDTH_TTX*HEIGHT_TTX*4);
        for(U32 loop = 0,value = 0;loop < dataLength;loop ++)
        {
              dataIndexBuf[indexLength] = value + 57360;
              indexLength++;
              if(loop%9 == 0 && loop != 0)
              {
                  value = 0;
              }
              else
              {
                  value++;
              }
        }
       memset(imageBuffer,0x00,WIDTH_TTX*HEIGHT_TTX*4);
       strim = NewFTString();
        Draw_Bitmap_Argb8888(0, 0, strim.width, strim.height, strim.imageBuffer);
        GFX_Flip_Window();
        deInitFontLib();
        free(strim.imageBuffer);
        free(imageBuffer);
}
                                                                                                                        
                                                    
  • 点赞                        
  • 收藏                        
  • 分享                                                                                                                        
  •                                                         
                                      
    • 文章举报                           
                                                
                                                                        
                                            
                                                        joinhandtowardsdusk                                                                发布了7 篇原创文章 · 获赞 0 · 访问量 1万+                                                                                            私信                                                            关注
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x




上一篇:31_剑指offer_java_栈的压入、弹出序列
下一篇:c++11 std::ref,std::cref
回复

使用道具 举报

0

主题

7

帖子

157

积分

注册会员

Rank: 2

积分
157
发表于 2020-2-1 08:15:13 | 显示全部楼层
楼主,我太崇拜你了![www.12360.co]
社区不能没有像楼主这样的人才啊!
回复

使用道具 举报

11

主题

24

帖子

316

积分

中级会员

Rank: 3Rank: 3

积分
316
发表于 2020-2-9 03:20:48 | 显示全部楼层
这个帖子不回对不起自己![www.12360.co]
回复

使用道具 举报

0

主题

22

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
发表于 2020-2-12 16:24:53 | 显示全部楼层
我看不错噢 谢谢楼主![www.12360.co]
回复

使用道具 举报

0

主题

10

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2020-2-14 16:59:26 | 显示全部楼层
其实我一直觉得楼主的品味不错!呵呵![www.12360.co]
回复

使用道具 举报

0

主题

15

帖子

325

积分

中级会员

Rank: 3Rank: 3

积分
325
发表于 6 天前 | 显示全部楼层
楼主发贴辛苦了,谢谢楼主分享![www.12360.co]
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

12360技术网

GMT+8, 2020-2-29 14:11 , Processed in 0.222216 second(s), 33 queries .

本网站内容收集于互联网,Www.12360.Co不承担任何由于内容的合法性及健康性所引起的争议和法律责任。 欢迎大家对网站内容侵犯版权等不合法和不健康行为进行监督和举报。

© 2019-2020 Www.12360.Co

快速回复 返回顶部 返回列表