jz2440电子书(三)字体层
字体层由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电子书(三)字体层相关推荐
- 哪个读书app可以导入txt_QQ阅读iphone版怎么导入电子书 三种手机QQ阅读器导入本地图书图文教程...
QQ阅读iphone版是一款比较方便的移动终端阅读软件,除了从电子书城下载或者购买电子书外,我们也可以把自己电脑中的电子书上传到QQ阅读软件中,不过果粉们都知道苹果手机没有文件管理器,无法使用qq阅读 ...
- 有三AI发布360页11万字深度学习CV算法工程师成长指导手册,可下载收藏打印,未完待续...
文/编辑 | 言有三 字少事大,各位同学,今天有三AI平台发布<深度学习视觉算法工程师成长指导手册>,超过11万字,360页word文档,可下载收藏打印,且还有大约1/3内容并未完结,最终 ...
- mysql查询名字中第2个字为丽,数据库技术课程复习5---MySQL语言(2)(单表查询)
0.学习前言 单表查询理解起来是比较简单的,关键要注意格式化指令的使用方法,一起加油鸭! 1.语句格式 语句格式 SELECT [ALL|DISTINCT] [,] - FROM [, ] - [ W ...
- 第12节 三个败家子(12)——关于曹睿同志的出身问题
第12节 三个败家子(12)--关于曹睿同志的出身问题 曹睿,字元仲,甄夫人所出,曹丕嫡长子,后来的魏明帝.根据史书推断,他出生在建安十年(公元205年),死于景初三年(公元239年). 但是由于史料 ...
- c语言拼字,我们也不知道“味全每日C”拼字瓶是怎么被玩坏的。
原标题:我们也不知道"味全每日C"拼字瓶是怎么被玩坏的. 点击上方"App运营之家"关注 专注于移动互联网最新资讯.品牌曝光.干货分享... 故事要从这三个字说 ...
- Photoshop使用路径描边制作梦幻潮流光丝字
本教程文字制作重点是如何勾文字路径,可以选择一些连写字体打出所需文字,然后沿着文字中心勾出路径,后期只需要给路径描边,再复制移动.渲染颜色.添加装饰即可. 1.建立空白图层,我用的是1200×800, ...
- 编程爱好者学vb还是python-高手,这是高手!推荐几个我常看的顶级技术类公众号...
原标题:高手,这是高手!推荐几个我常看的顶级技术类公众号 算法.机器学习.AI等方向. 都是高手.真的! AI前线 面向 AI 爱好者.开发者和科学家,提供 AI 领域前沿技术资讯.一线业界实践案例, ...
- 转 詹宏志谈数字出版
纸本书变电子书是很小的事--詹宏志谈数字出版时代 收藏 出处需翻墙 http://www.facebook.com/note.php?note_id=434741171281&id=19480 ...
- 系统业务逻辑书籍_「樊登读书会强推:免费送10本绝密书」彻底改变你的逻辑思维能力...
哈喽~你好 我是JS-冰冰 今天在星巴克喝咖啡整理了一些巨大价值的绝密资料,从过往在樊登读书会整理的10本彻底改变<逻辑思维能力>的绝密电子书.非常实用,对我的改变和提升非常有帮助,所以想 ...
最新文章
- 内存分配器memblock【转】
- 从配置文件的角度去了解Yii2
- Android Studio自定义视图无法预览
- 应用程序性能分析利器 —— Visual Studio Profiler
- 【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置
- java执行更新sql_sql server执行更新需要更多时间
- java cookbook 3_CookBook/Java核心/3-Java反射.md at master · zhgdbut/CookBook · GitHub
- 数据结构-树3-红黑树
- c# 通用类扩展方法 备注
- Jenkins系列一Linux环境安装Jenkins
- “大雪无情,卡巴有情”,卡巴斯基赠送一年免费正版激活码
- DPDK 19.08 正式发布
- 计算机辅助设计 Photoshop 教案,计算机辅助设计①Photoshop学习领域课程标准.doc
- 64位windows在安装winsdk过程中遇到的问题及解决方案
- 2021 年的简单年终总结
- Linux的nc,局域网文件互传
- 应届生offer指南
- 一封来信,诉说了开源社区里的天涯若比邻
- 教程篇(7.0) 03. FortiGate基础架构 虚拟域(VDOM) ❀ Fortinet 网络安全专家 NSE 4
- 互联网面试知识点总结(三)- 计算机网络篇
热门文章
- 微信、支付宝二码合一扫码支付实现思路
- win10无法检验服务器出示的ssl证书,大师解决win10系统网站启用ssL安全证书的问题...
- 解决 rsync IO input / output error , failed verification — update discarded
- 怎么去除PDF中的水印
- 【计算机推免】川大计算机夏令营_华南理工软件预推免_华科计算机预推免(2020.10)
- 台达变频器485通讯接线图_台达变频器基本配线图
- UE4 关于远距离没有阴影的问题解决方案
- 神经网络算法原理图解,神经网络算法原理图集
- Python入门教程(2)
- NLP-D30-自注意力机制Transformer