字体层由fonts_manager.c来管理,
下面有3个文件:ascii.c , gbk.c ,freetype .c


ascii字体opriation

static T_FontOpr g_tASCIIFontOpr = {.name          = "ascii",.FontInit      = ASCIIFontInit,.GetFontBitmap = ASCIIGetFontBitmap,
};

ascii字体初始化函数

static int ASCIIFontInit(char *pcFontFile, unsigned int dwFontSize)
{if (dwFontSize != 16){//DBG_PRINTF("ASCII can't support %d font size\n", dwFontSize);return -1;}return 0;
}

ascii获得字体的位图

static int ASCIIGetFontBitmap(unsigned int dwCode, PT_FontBitMap ptFontBitMap)
{int iPenX = ptFontBitMap->iCurOriginX;int iPenY = ptFontBitMap->iCurOriginY;if (dwCode > (unsigned int)0x80){//DBG_PRINTF("don't support this code : 0x%x\n", dwCode);return -1;}ptFontBitMap->iXLeft    = iPenX;ptFontBitMap->iYTop     = iPenY - 16;ptFontBitMap->iXMax     = iPenX + 8;ptFontBitMap->iYMax     = iPenY;ptFontBitMap->iBpp      = 1;ptFontBitMap->iPitch    = 1;ptFontBitMap->pucBuffer = (unsigned char *)&fontdata_8x16[dwCode * 16];;  ptFontBitMap->iNextOriginX = iPenX + 8;ptFontBitMap->iNextOriginY = iPenY;return 0;
}

向上层注册结构体

int ASCIIInit(void)
{return RegisterFontOpr(&g_tASCIIFontOpr);
}

gbk.c文件

定义一个gbk字体结构体

static T_FontOpr g_tGBKFontOpr = {.name          = "gbk",.FontInit      = GBKFontInit,.GetFontBitmap = GBKGetFontBitmap,
};
static int GBKFontInit(char *pcFontFile, unsigned int dwFontSize)
{struct stat tStat;if (16 != dwFontSize){DBG_PRINTF("GBK can't support %d fontsize\n", dwFontSize);return -1;}g_iFdHZK = open(pcFontFile, O_RDONLY);if (g_iFdHZK < 0){DBG_PRINTF("can't open %s\n", pcFontFile);return -1;}if(fstat(g_iFdHZK, &tStat)){DBG_PRINTF("can't get fstat\n");return -1;}g_pucHZKMem = (unsigned char *)mmap(NULL , tStat.st_size, PROT_READ, MAP_SHARED, g_iFdHZK, 0);if (g_pucHZKMem == (unsigned char *)-1){DBG_PRINTF("can't mmap for hzk16\n");return -1;}g_pucHZKMemEnd = g_pucHZKMem + tStat.st_size;return 0;
}

获取GBK字体位图

static int GBKGetFontBitmap(unsigned int dwCode, PT_FontBitMap ptFontBitMap)
{int iArea;int iWhere;int iPenX = ptFontBitMap->iCurOriginX;int iPenY = ptFontBitMap->iCurOriginY;DBG_PRINTF("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);if (dwCode & 0xffff0000){DBG_PRINTF("don't support this code : 0x%x\n", dwCode);return -1;}   iArea  = (int)(dwCode & 0xff) - 0xA1;iWhere = (int)((dwCode >> 8) & 0xff) - 0xA1;if ((iArea < 0) || (iWhere < 0)){DBG_PRINTF("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);return -1;}ptFontBitMap->iXLeft    = iPenX;ptFontBitMap->iYTop     = iPenY - 16;ptFontBitMap->iXMax     = iPenX + 16;ptFontBitMap->iYMax     = iPenY;ptFontBitMap->iBpp      = 1;ptFontBitMap->iPitch    = 2; //gbk字体两行间的像素跨度为2ptFontBitMap->pucBuffer = g_pucHZKMem + (iArea * 94 + iWhere)*32;;   if (ptFontBitMap->pucBuffer >= g_pucHZKMemEnd){return -1;}ptFontBitMap->iNextOriginX = iPenX + 16;ptFontBitMap->iNextOriginY = iPenY;DBG_PRINTF("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);return 0;
}

向上层注册bgk结构体

int GBKInit(void)
{return RegisterFontOpr(&g_tGBKFontOpr);
}

freetype.c字体文件

首先定义freetype字体结构体

static T_FontOpr g_tFreeTypeFontOpr = {.name          = "freetype",.FontInit      = FreeTypeFontInit,.GetFontBitmap = FreeTypeGetFontBitmap,
};

freet字体初始化

static int FreeTypeFontInit(char *pcFontFile, unsigned int dwFontSize)//传入的是字体文件 还有字体大小
{int iError;/* 显示矢量字体 */iError = FT_Init_FreeType(&g_tLibrary );              /* initialize library *//* error handling omitted */if (iError){DBG_PRINTF("FT_Init_FreeType failed\n");return -1;}iError = FT_New_Face(g_tLibrary, pcFontFile, 0, &g_tFace); /* create face object *//* error handling omitted */if (iError){DBG_PRINTF("FT_Init_FreeType failed\n");      return -1;}g_tSlot = g_tFace->glyph;iError = FT_Set_Pixel_Sizes(g_tFace, dwFontSize, 0);if (iError){DBG_PRINTF("FT_Set_Pixel_Sizes failed : %d\n", dwFontSize);return -1;}return 0;
}

获得freetype字体位图

static int FreeTypeGetFontBitmap(unsigned int dwCode, PT_FontBitMap ptFontBitMap)
{int iError;int iPenX = ptFontBitMap->iCurOriginX;int iPenY = ptFontBitMap->iCurOriginY;/* load glyph image into the slot (erase previous one) *///iError = FT_Load_Char(g_tFace, dwCode, FT_LOAD_RENDER );iError = FT_Load_Char(g_tFace, dwCode, FT_LOAD_RENDER | FT_LOAD_MONOCHROME);if (iError){DBG_PRINTF("FT_Load_Char error for code : 0x%x\n", dwCode);return -1;}//DBG_PRINTF("iPenX = %d, iPenY = %d, bitmap_left = %d, bitmap_top = %d, width = %d, rows = %d\n", iPenX, iPenY, g_tSlot->bitmap_left, g_tSlot->bitmap_top, g_tSlot->bitmap.width, g_tSlot->bitmap.rows);ptFontBitMap->iXLeft    = iPenX + g_tSlot->bitmap_left;ptFontBitMap->iYTop     = iPenY - g_tSlot->bitmap_top;ptFontBitMap->iXMax     = ptFontBitMap->iXLeft + g_tSlot->bitmap.width;ptFontBitMap->iYMax     = ptFontBitMap->iYTop  + g_tSlot->bitmap.rows;ptFontBitMap->iBpp      = 1;ptFontBitMap->iPitch    = g_tSlot->bitmap.pitch; //矢量字体不是固定的ptFontBitMap->pucBuffer = g_tSlot->bitmap.buffer;ptFontBitMap->iNextOriginX = iPenX + g_tSlot->advance.x / 64;ptFontBitMap->iNextOriginY = iPenY;//DBG_PRINTF("iXLeft = %d, iYTop = %d, iXMax = %d, iYMax = %d, iNextOriginX = %d, iNextOriginY = %d\n", ptFontBitMap->iXLeft, ptFontBitMap->iYTop, ptFontBitMap->iXMax, ptFontBitMap->iYMax, ptFontBitMap->iNextOriginX, ptFontBitMap->iNextOriginY);return 0;
}

最后向上注册结构体

int FreeTypeInit(void)
{return RegisterFontOpr(&g_tFreeTypeFontOpr);
}

三个字体文件都向上层fonts_manager.c注册了结构体,并放在链表中

int RegisterFontOpr(PT_FontOpr ptFontOpr)
{PT_FontOpr ptTmp;if (!g_ptFontOprHead) //如果链表头为空{g_ptFontOprHead   = ptFontOpr; //链表头等于传入的结构体ptFontOpr->ptNext = NULL;      //结构体的下一项为空}else{ptTmp = g_ptFontOprHead;    //如果不为空,把链表头赋给结构体,while (ptTmp->ptNext)        //判断结构体是否有下一项{ptTmp = ptTmp->ptNext;    //变成下一个结构体}ptTmp->ptNext     = ptFontOpr;//直到结构体没有下一项,结构体的下一项为传入的结构体ptFontOpr->ptNext = NULL;    //把结构体的下一项为空}return 0;
}

在字体管理文件fonts-manager.c中,
有fontsinit函数,供上次调用,用来初始化

int FontsInit(void)
{int iError;iError = ASCIIInit();if (iError){DBG_PRINTF("ASCIIInit error!\n");return -1;}iError = GBKInit();if (iError){DBG_PRINTF("GBKInit error!\n");return -1;}iError = FreeTypeInit();if (iError){DBG_PRINTF("FreeTypeInit error!\n");return -1;}return 0;
}

jz2440电子书(三)字体层相关推荐

  1. 哪个读书app可以导入txt_QQ阅读iphone版怎么导入电子书 三种手机QQ阅读器导入本地图书图文教程...

    QQ阅读iphone版是一款比较方便的移动终端阅读软件,除了从电子书城下载或者购买电子书外,我们也可以把自己电脑中的电子书上传到QQ阅读软件中,不过果粉们都知道苹果手机没有文件管理器,无法使用qq阅读 ...

  2. 有三AI发布360页11万字深度学习CV算法工程师成长指导手册,可下载收藏打印,未完待续...

    文/编辑 | 言有三 字少事大,各位同学,今天有三AI平台发布<深度学习视觉算法工程师成长指导手册>,超过11万字,360页word文档,可下载收藏打印,且还有大约1/3内容并未完结,最终 ...

  3. mysql查询名字中第2个字为丽,数据库技术课程复习5---MySQL语言(2)(单表查询)

    0.学习前言 单表查询理解起来是比较简单的,关键要注意格式化指令的使用方法,一起加油鸭! 1.语句格式 语句格式 SELECT [ALL|DISTINCT] [,] - FROM [, ] - [ W ...

  4. 第12节 三个败家子(12)——关于曹睿同志的出身问题

    第12节 三个败家子(12)--关于曹睿同志的出身问题 曹睿,字元仲,甄夫人所出,曹丕嫡长子,后来的魏明帝.根据史书推断,他出生在建安十年(公元205年),死于景初三年(公元239年). 但是由于史料 ...

  5. c语言拼字,我们也不知道“味全每日C”拼字瓶是怎么被玩坏的。

    原标题:我们也不知道"味全每日C"拼字瓶是怎么被玩坏的. 点击上方"App运营之家"关注 专注于移动互联网最新资讯.品牌曝光.干货分享... 故事要从这三个字说 ...

  6. Photoshop使用路径描边制作梦幻潮流光丝字

    本教程文字制作重点是如何勾文字路径,可以选择一些连写字体打出所需文字,然后沿着文字中心勾出路径,后期只需要给路径描边,再复制移动.渲染颜色.添加装饰即可. 1.建立空白图层,我用的是1200×800, ...

  7. 编程爱好者学vb还是python-高手,这是高手!推荐几个我常看的顶级技术类公众号...

    原标题:高手,这是高手!推荐几个我常看的顶级技术类公众号 算法.机器学习.AI等方向. 都是高手.真的! AI前线 面向 AI 爱好者.开发者和科学家,提供 AI 领域前沿技术资讯.一线业界实践案例, ...

  8. 转 詹宏志谈数字出版

    纸本书变电子书是很小的事--詹宏志谈数字出版时代 收藏 出处需翻墙 http://www.facebook.com/note.php?note_id=434741171281&id=19480 ...

  9. 系统业务逻辑书籍_「樊登读书会强推:免费送10本绝密书」彻底改变你的逻辑思维能力...

    哈喽~你好 我是JS-冰冰 今天在星巴克喝咖啡整理了一些巨大价值的绝密资料,从过往在樊登读书会整理的10本彻底改变<逻辑思维能力>的绝密电子书.非常实用,对我的改变和提升非常有帮助,所以想 ...

最新文章

  1. 内存分配器memblock【转】
  2. 从配置文件的角度去了解Yii2
  3. Android Studio自定义视图无法预览
  4. 应用程序性能分析利器 —— Visual Studio Profiler
  5. 【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置
  6. java执行更新sql_sql server执行更新需要更多时间
  7. java cookbook 3_CookBook/Java核心/3-Java反射.md at master · zhgdbut/CookBook · GitHub
  8. 数据结构-树3-红黑树
  9. c# 通用类扩展方法 备注
  10. Jenkins系列一Linux环境安装Jenkins
  11. “大雪无情,卡巴有情”,卡巴斯基赠送一年免费正版激活码
  12. DPDK 19.08 正式发布
  13. 计算机辅助设计 Photoshop 教案,计算机辅助设计①Photoshop学习领域课程标准.doc
  14. 64位windows在安装winsdk过程中遇到的问题及解决方案
  15. 2021 年的简单年终总结
  16. Linux的nc,局域网文件互传
  17. 应届生offer指南
  18. 一封来信,诉说了开源社区里的天涯若比邻
  19. 教程篇(7.0) 03. FortiGate基础架构 虚拟域(VDOM) ❀ Fortinet 网络安全专家 NSE 4
  20. 互联网面试知识点总结(三)- 计算机网络篇

热门文章

  1. 微信、支付宝二码合一扫码支付实现思路
  2. win10无法检验服务器出示的ssl证书,大师解决win10系统网站启用ssL安全证书的问题...
  3. 解决 rsync IO input / output error , failed verification — update discarded
  4. 怎么去除PDF中的水印
  5. 【计算机推免】川大计算机夏令营_华南理工软件预推免_华科计算机预推免(2020.10)
  6. 台达变频器485通讯接线图_台达变频器基本配线图
  7. UE4 关于远距离没有阴影的问题解决方案
  8. 神经网络算法原理图解,神经网络算法原理图集
  9. Python入门教程(2)
  10. NLP-D30-自注意力机制Transformer