freetype 字形解析
title: freetype 字形解析
date: 2019/3/7 20:17:46
toc: true
freetype 字形解析
字体管理
管理字形,这里可以拆分为两个部分,一部分为管理字距,一部分为有效数据(位图信息).
比如字母g,蓝色框里的是有效的位图信息,但是排版的时候,是需要考虑字距的,否则虽然不重叠,但是不太好看.
数据结构
这里记住一个点
我们一般都是先转换到字符到字形槽,然后从字形槽提取位图,提取边界bbox
https://www.freetype.org/freetype2/docs/reference/ft2-index.html
这里有两个结构去描述
位图描述
typedef struct FT_Bitmap_
{
unsigned int rows;
unsigned int width;
int pitch;
unsigned char* buffer;
unsigned short num_grays;
unsigned char pixel_mode;
unsigned char palette_mode;
void* palette;
} FT_Bitmap;
位图的定位点描述在字形槽里
//字形槽
typedef struct FT_GlyphSlotRec_
{
FT_Library library;
FT_Face face;
FT_GlyphSlot next;
FT_UInt reserved; /* retained for binary compatibility */
FT_Generic generic;
FT_Glyph_Metrics metrics;
FT_Fixed linearHoriAdvance;
FT_Fixed linearVertAdvance;
FT_Vector advance; //下个边界的原点
FT_Glyph_Format format;
FT_Bitmap bitmap; //位图的描述
FT_Int bitmap_left; //位图的左上角点
FT_Int bitmap_top; //位图的左上角点
FT_Outline outline;
FT_UInt num_subglyphs;
FT_SubGlyph subglyphs;
void* control_data;
long control_len;
FT_Pos lsb_delta;
FT_Pos rsb_delta;
void* other;
FT_Slot_Internal internal;
} FT_GlyphSlotRec;
位置的边界需要去手动获取
这里的参数是FT_Glyph glyph
,可以由face
中的槽来转换
//从face的字形槽中取得字形
//FT_EXPORT( FT_Error )FT_Get_Glyph( FT_GlyphSlot slot,FT_Glyph *aglyph );
//字形描述
typedef struct FT_GlyphRec_
{
FT_Library library;
const FT_Glyph_Class* clazz;
FT_Glyph_Format format;
FT_Vector advance;
} FT_GlyphRec;
error = FT_Get_Glyph( face->glyph, &glyph );
//从字形中取得bbox边界
FT_Glyph_Get_CBox( glyph, FT_GLYPH_BBOX_TRUNCATE, &bbox );
FT_EXPORT( void )
FT_Glyph_Get_CBox( FT_Glyph glyph,
FT_UInt bbox_mode,
FT_BBox *acbox );
//传入参数
typedef struct FT_GlyphRec_
{
FT_Library library;
const FT_Glyph_Class* clazz;
FT_Glyph_Format format;
FT_Vector advance;
} FT_GlyphRec;
// 传出参数
typedef struct FT_BBox_
{
FT_Pos xMin, yMin;
FT_Pos xMax, yMax;
} FT_BBox;
字体抽象
刚开始我想抽象出位图信息
长
宽
每个像素的bpp
换行像素位置
位图数据地址
那么除非我自己去控制字距,同时需要统计这一行的高度,来确定下一行文字的位置,但是这可能会排版成拥挤的上对齐,或者手动计算位图的大小,去布局,比如先设计一个32*32的边界,然后根据这个位图的大小居中摆放…想想就麻烦,而且这样的话设计字体旋转就没辙了
再仔细看下freetype的布局,其实是创建了一个布局,接着再看下旋转,我们实际刷新数据的时候,一般还是从左到右,从上到下刷新点,没有颜色的数据应该不去刷新,我们看下之前的字体旋转,可以发现是遮挡了的,所以遇到没有颜色的数据,应该去跳过这些点,而不是去绘图.
蓝色框是点阵图,我们刷新像素的位置
红色框是边界,用来描述布局的
我们之前的绘图是这样的
void draw_bitmap( FT_Bitmap* bitmap,
FT_Int x,
FT_Int y)
{
FT_Int i, j, p, q;
FT_Int x_max = x + bitmap->width;
FT_Int y_max = y + bitmap->rows;
for ( i = x, p = 0; i < x_max; i++, p++ )
{
for ( j = y, q = 0; j < y_max; j++, q++ )
{
if ( i < 0 || j < 0 ||
i >= var.xres || j >= var.yres )
continue;
// 添加下面这句话即可
// if(bitmap->buffer[q * bitmap->width + p])
lcd_put_pixel(i,j,bitmap->buffer[q * bitmap->width + p]);
}
}
}
这里对所有点都进行重绘,所以理论上应该会有字符的遮盖,上一节的实验也确实如此,可以看到h会把a遮挡了
修改下代码,判断如果没有颜色,则不需要描点即可,这里可以设置freetype的bpp是1即可,具体字体的颜色另外绘图指定即可.
freetype 字形解析的更多相关文章
- 我所理解的Cocos2d-x
我所理解的Cocos2d-x(完全基于Cocos2d-x3.0,深度剖析计算机图形学,OpenGL ES及游戏引擎架构,全面提升游戏开发相关知识) 秦春林 著 ISBN 978-7-121-246 ...
- freetypeLCD显示
目录 freetypeLCD显示 安装交叉编译环境 配置 头文件和库的位置 编译安装 复制到PC编译工具链 复制到文件系统 运行测试 LCD显示 编码转换问题 简单显示 角度旋转 换行显示 居中显示 ...
- C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图
C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图 +BIT祝威+悄悄在此留下版了个权的信息说: 最近需要用OpenGL绘制文字,这是个很费时费力的事.一般的思路就是 ...
- 基于Qt的FreeType字体轮廓解析
一.本文目的 以前的文档中.详细的介绍了FreeType开源字体引擎库的基础知识.基本用法.但并未详细的阐明在TurboCG中.是如何解析出一个文字的轮廓的,本文集中阐述.怎么样使用FreeType开 ...
- FreeType 管理字形
转自:http://blog.csdn.net/hgl868/article/details/7254687 1.字形度量 顾名思义,字形度量是对应每一个字形的特定距离,以此描述如何对文本排版. ...
- 解析 Qt 字库移植并能显示中文 (上篇)
原文http://mobile.51cto.com/symbian-272552.htm 本文介绍的是Qt 字库移植并能显示中文,需要的字体库文件,一般是多个.具体移植那一个,看你使用的字库是什么了, ...
- CSharpGL(28)得到高精度可定制字形贴图的极简方法
CSharpGL(28)得到高精度可定制字形贴图的极简方法 回顾 以前我用SharpFont实现了解析TTF文件从而获取字形贴图的功能,并最终实现了用OpenGL渲染文字. 使用SharpFont,美 ...
- C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字
C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字 上一篇实现了把文字绘制到OpenGL窗口,但实质上只是把含有文字的贴图贴到矩形模型上.本篇我们介绍用Poi ...
- C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字
C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字 +BIT祝威+悄悄在此留下版了个权的信息说: 上一篇得到了字形贴图及其位置字典(可导出为XML).本篇就利用此贴 ...
随机推荐
- Android Studio 3.0+ Annotation processors must be explicitly declared now
把Android Studio 升级到3.0+ 版本的时候出现该问题: 可以看到 给了我们两种解决办法: 1. 即 给出现问题的三方 加上 annotationProcessor配置 ...
- Android 报错:error: too many padding sections on bottom border
一.发生错误 [我以为我做了一张完美的.9图片,没想到.9图片还需要画左边和上边,尴尬···] 二.解决方法 .9图片造成错误 [具体内容] 最后修改.9图为
- ext前后台数据传输的标准化
一.标准化的数据传输是什么 这里所说的标准化主要是指,使用代理提交数据时,格式必须统一化.标准化,而服务器返回的数据格式也必须是标准化的数据. 简言之,使用代理提交数据时,前台--->后台,后台 ...
- 【RL-TCPnet网络教程】第2章 嵌入式网络协议栈基础知识
第2章 嵌入式网络协议栈基础知识 本章教程为大家介绍嵌入式网络协议栈基础知识,本章先让大家有一个全面的认识,后面章节中会为大家逐一讲解用到的协议. 基础知识整理自百度百科,wiki百科等 ...
- js饼状图(带百分比)功能实现,新人必懂
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 开发环境---->服务器(数据库迁移Migration)
1.查找服务器环境迁移记录表的最近一次迁移名称 SELECT * FROM __efmigrationshistory; 最后一次:20190225075007_UpdateSocialApplyCo ...
- python 提取pdf文字
安装pdfminer 库 windows 下安装pdfminer3k pip install pdfminer3k Liunx 下安装pdfminer pip install pdfminer 代码 ...
- 【Java】+SOFA
https://www.jianshu.com/p/e3dca8d5e9ee sofa脑图
- UML在代码中的展现
依赖:一个类使用了另外一个类,这种关系是临时的.脆弱的. 如人需要过河,需要船,这时人.过河(船) 中船被当做参数传入,船的实现变化会影响过河方法. 聚合:体现是整体与部分.has-a的关系 ...
- F2 - Spanning Tree with One Fixed Degree - 并查集+DFS
这道题还是非常有意思的,题意很简单,就是给定一个图,和图上的双向边,要求1号节点的度(连接边的条数)等于K,求这棵树的生成树. 我们首先要解决,如何让1号节点的度时为k的呢???而且求的是生成树,意思 ...