[TTF字体]提取TTF字体的轮廓(一)

一. 相关结构

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);
    else
		return(fixed.value);
}


你可能感兴趣的:(VC,C/C++)