[TTF字体]提取TTF字体的轮廓(一)
来源:互联网 发布:上海数据交易中心offer 编辑:程序博客网 时间:2024/04/28 11:07
一. 相关结构
TrueType Font ,由Apple和微软公司合作推出的文字文件格式. 一个TTF字符由许多轮廓组成,每一个轮廓由一个名叫TTPOLYGONHEADER的数据结构开始,跟在TTPOLYGONHEADER后面的是一系列的TTPOLYCURVE数据结构体。轮廓的顶点是POINTFX类型的数据结构点.
TTPOLYGONHEADER的结构如下:
typedef struct _TTPOLYGONHEADER { DWORD cb;// 描述字符要求的字节数(1个TTPOLYGONHEADER 和所有TTPOLYCURVE字节和) DWORD dwType;// 指定返回的字符轮廓类型, 固定为TT_POLYGON_TYPE POINTFX pfxStart;// 指定字符轮廓的起点 } TTPOLYGONHEADER, *LPTTPOLYGONHEADER;
TTPOLYCURVE的结构如下:
typedef struct tagTTPOLYCURVE { WORD wType; // 指定描述字符轮廓的线类型: TT_PRIM_LINE, TT_PRIM_QSPLINE, TT_PRIM_CSPLINE WORD cpfx; // 指定结构中含有POINTFX的个数 POINTFX apfx[1]; // 指定字体中保留的polyline和Bzier spline } TTPOLYCURVE, *LPTTPOLYCURVE;
TT_PRIM_LINE(直线), TT_PRIM_QSPLINE(二次贝塞尔曲线), TT_PRIM_CSPLINE(三次贝塞尔曲线)
POINTFX的结构如下:
typedef struct tagPOINTFX { FIXED x; // x-component of a point on the outline of a TrueType character FIXED y; // y-component of a point on the outline of a TrueType character } POINTFX, *LPPOINTFX; typedef struct _FIXED { WORD fract; // Specifies the fractional part of the number. short value; // Specifies the integer part of the number.} FIXED; The FIXED structure is used to describe the elements of the MAT2 structure.
GLYPHMETRICS的结构如下:
typedef struct _GLYPHMETRICS { UINT gmBlackBoxX; // 指定完全包围字体结构的最小矩阵的宽度 UINT gmBlackBoxY; // 指定完全包围字体结构的最小矩阵的高度 POINT gmptGlyphOrigin; // 指定完全包围字体结构的最小矩阵左上角的点坐标 short gmCellIncX; // 指定当前的起点到下一个字符的起点的水平距离 short gmCellIncY; // 指定当前的起点到下一个字符的起点的垂直距离 } GLYPHMETRICS, *LPGLYPHMETRICS;
通过下图,可以很明确的理解GLYPHMETRICS结构:
结构GLYPHMETRICS的使用主要在API函数GetGlyphOutline()来保存字符单元在字形的位置.
DWORD GetGlyphOutline(UINT nChar, // 需要获取字符UINT nFormat, // 获取字符的格式LPGLYPHMETRICS lpgm,// 获取字符的相关信息DWORD cbBuffer,// 保存字符数据缓冲区的大小LPVOID lpBuffer,// 保存字符数据的缓冲区const MAT2* lpmat2 // 变换矩阵)const;
参考:
http://blog.csdn.net/kingstar158/article/details/7191416
http://blog.csdn.net/kingstar158/article/details/7193097
http://blog.csdn.net/kingstar158/article/details/7257347
二. 内存结构说明
2.1 一个字符的轮廓是由n个轮廓数据组成的(我这里叫轮廓为Outline)
|-----------------------------------|
| 1. Outline |
|-----------------------------------|
| 2. Outline |
|-----------------------------------|
| ... |
|-----------------------------------|
| n. Outline |
|-----------------------------------|
大小是 GetGlyphOutlineW的返回值.
2.2 其中一个Outline的内存结构是这样的
|-------------------------------------------|
| 1. TTPOLYGONHEADER |
|-------------------------------------------|
| 2. TTPOLYCURVE |
|-------------------------------------------|
| ... |
|-------------------------------------------|
| n. TTPOLYCURVE |
|-------------------------------------------|
大小是TTPOLYGONHEADER.cb指定
typedef struct _TTPOLYGONHEADER { DWORD cb;// 指定该Outline轮廓的字节数(1个TTPOLYGONHEADER 和所有TTPOLYCURVE字节和) DWORD dwType; // 指定该Outline轮廓类型, 固定为TT_POLYGON_TYPE POINTFX pfxStart; // 指定该Outline轮廓的起点 } TTPOLYGONHEADER, *LPTTPOLYGONHEADER;typedef struct tagTTPOLYCURVE { WORD wType; // 指定描述字符轮廓的线类型: TT_PRIM_LINE, TT_PRIM_QSPLINE, TT_PRIM_CSPLINE WORD cpfx; // 指定结构中含有POINTFX的个数 POINTFX apfx[1]; // 指定字体中保留的polyline和Bzier spline } TTPOLYCURVE, *LPTTPOLYCURVE;
2.3 其中一个TTPOLYCURVE的内存结构是这样的
|----------------------------------------|
| WORD wType; |
|----------------------------------------|
| WORD cpfx; |
|----------------------------------------|
| 1. POINTFX |
|----------------------------------------|
| 2. POINTFX |
|----------------------------------------|
| ... |
|----------------------------------------|
| n. POINTFX |
|----------------------------------------|
其中这里的n就是cpfx指定
其中 POINTFX:
typedef struct tagPOINTFX{ FIXED x; FIXED y;} POINTFX, FAR* LPPOINTFX;
x, y就是点的坐标, 需要这样转换为int
int CHYTTFCharacter::FIXEDToInt(FIXED& fixed){ if (fixed.fract >= 0x8000)return(fixed.value + 1); elsereturn(fixed.value);}
- [TTF字体]提取TTF字体的轮廓(一)
- [TTF字体]提取TTF字体的轮廓(二)
- 【TTF字体】获取TTF字符轮廓
- TTF字体
- 【TTF字体】TTF字体结构
- [TTF字体]获取TTF字体的点阵信息
- 提取TTF字体中字符的字模信息
- 制作TTF格式的字体
- Android ttf字体的使用
- 在TTF字体中提取指定文字
- ttf字体包瘦身,ttf字体包提取字体——杨小辉
- MiniGUI 使用TTF字体
- TTF字体文件结构
- TTF字体文件结构
- Ubuntu安装TTF字体
- 【TTF字体】GLYPHMETRICS结构
- Android—TTF字体
- ttf字体编辑
- 【巧设代理服务器 让IP地址藏起来】
- Django 中form的用法
- LRU(最近最少使用页面置换算法)淘汰算法
- 十一、结构模式之享元(Flyweight)模式
- 【MongoDB for Java】Java操作MongoDB
- [TTF字体]提取TTF字体的轮廓(一)
- 转:进制转换
- phpcms v9内容页调用标签
- 移动信息中心号码,移动短信中心号码速查
- linux与windows下读取项目文件的区别
- 二进制中1的个数
- 在cocos2dx里访问/互调android里的activity方法/变量
- Ldom 详细安装配置
- 【带着满怀翘首的期盼,寻着有你的方向醉眼迷离】