一. 相关结构

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字体的轮廓(一)相关推荐

  1. linux提取ttf字体轮廓,[TTF字体]提取TTF字体的轮廓(二)

    一. TTF字体轮廓解析与绘制 1.1 数据提取 void CHYTTFCharacter::InitTTPOLY() { if(0 == m_pTTPOLYData)// GetGlyphOutli ...

  2. pythonttf字体提取_[TTF字体]提取TTF字体的轮廓(二) | 学步园

    一. TTF字体轮廓解析与绘制 1.1 数据提取 void CHYTTFCharacter::InitTTPOLY() { if(0 == m_pTTPOLYData)// GetGlyphOutli ...

  3. 怎么把需要的字从TTF里面提取出来\字体压缩

    一.使用font-spider 1.1.下载 官网:http://font-spider.org 项目地址:https://github.com/aui/font-spider 用法打开官网就有,和f ...

  4. 苹果ttc转ttf_字体 – 将TTC字体转换或提取为TTF – 如何?

    假设Windows并不知道如何处理TTC文件(我真的很奇怪),如果使用 fontforge,您可以通过简单的方式"分割"组合的字体. 步骤是: >下载文件. 解压缩(例如解压 ...

  5. ttf字体包瘦身,ttf字体包提取指定字体,缩小ttf文件体积。

    ttf字体包瘦身 注:此方法只试用于只需要少数字体的情况. 需求 做APP时出现了一个需求,应用登录页面和主页面的系统名称需要根据用户所属行政区划进行动态调节. 为了突出系统名和样式的美观,系统名在显 ...

  6. [TTF字体]获取TTF字体的点阵信息

    获取TTF字体的点阵信息还是使用GetGlyphOutline 看代码 CClientDC dc(this); HDC hDC = dc.GetSafeHdc(); //创建字体 CFont font ...

  7. 【Flutter】Flutter 自定义字体 ( 下载 TTF 字体 | pubspec.yaml 配置字体资源 | 同步资源 | 全局应用字体 | 局部应用字体 )

    文章目录 一.Flutter 自定义字体 1.ttf 字体文件 2.ttf 字体资源配置 3.获取字体 4.全局使用字体 5.局部使用字体 二.完整代码示例 三.相关资源 一.Flutter 自定义字 ...

  8. Android UI 字体库(.ttf文件)的使用 -- xml方式

    Android 8.0(API 级别 26)引入了"XML 中的字体"这项新功能, 可以在 res/font/ 文件夹中添加 font 文件. 要访问字体资源,请使用 @font/ ...

  9. C++解析IconFont矢量字体文件ttf,以及无锯齿显示矢量字体

    一.下载矢量字体文件TTF 1.可以使用集成好的矢量字体,如FontAwesome.openwebicons.IcoMoon-Free.typicons-- 只要去搜索关键字,找到对应的官网即可下载到 ...

最新文章

  1. 早上起来收到两个消息
  2. 20种处理照片的PS技术
  3. css = display: none, visibility: hidden, opacity: 0 的区别
  4. CTF——MISC——zip伪加密总结
  5. php是范例,php基础范例
  6. python 修改字符串 循环_python – 模式匹配并用if else循环替换字符串
  7. [Usaco2007 Demo][BZOJ1628] City skyline
  8. Jenkins二 安装gitlab及其使用
  9. neo4jcypher基本语句
  10. oracle 安装ora 27102,Oracle ora-27102 错误
  11. SpringMvc之参数绑定注解详解之一
  12. 拓端tecdat|R语言中进行Spearman等级相关分析
  13. webstorm怎么汉化
  14. R计算偏相关性示例教程
  15. nssl-1336 膜拜神牛
  16. 那些年我们一起错过赚钱时光 10年机会逐个数
  17. 《大数据时代》读后感(一)
  18. 客户端dmesg_查看dmesg,会打出很多的日志“TCP: too many of orphaned sockets”
  19. word里贴代码神器(不需要下载)
  20. python中的序列封包和序列解包

热门文章

  1. ireport报表中插入图片
  2. 使用Golang搭建gRPC服务提供给.NetCore调用
  3. 动态网站开发讲课笔记04:Servlet基础
  4. 大白 移远BC95/BC35-G NBIOT模组简介
  5. FMC板卡学习资料:FMC141-4路 250Msps/16bits ADC, FMC板卡
  6. 产品经理舔狗话术指南
  7. 非常不错的主板时钟讲解(转载)
  8. GIS WKB/EWKB 结构
  9. psutil详细使用
  10. linux加电脑白名单命令,Linux的EMOS邮件系统的白名单操作的一些命令