我正在尝试创建一个转换库,用于将任何已安装的truetype字体转换为一系列多边形,这些多边形可用于在OpenGL中显示文本。我使用GetGlyphOutline函数将字形转换为一系列轮廓,然后使用glu库对这些轮廓进行三角化(镶嵌)。
它通常是有效的,但并不总是有效的,也有一些奇怪的例外。GetGlyphOutline应在CW缠绕顺序中首先返回外轮廓,并在逆时针缠绕顺序中返回内轮廓(孔)。不幸的是,根据字体和字形的不同,情况并非如此。有时外轮廓处于逆时针缠绕顺序,而孔处于CW,或者尽管缠绕顺序是正确的,但GetGlyphOutline返回的轮廓顺序是错误的(例如,我先得到‘孔’,然后得到外轮廓)。
我试着调整转换来检查这些奇怪的情况,如果必要的话,颠倒轮廓的顶点和缠绕顺序,但似乎没有规则,如果一个字符有1个或2个洞,几个字体就可以了,我总是发现一个例外。例如,使用名为MinionPro-BoldCn的字体,甚至数字'8‘的字形也被GetGlyphOutline错误地返回,我最终只有一个洞,而不是两个洞。
我还尝试使用另一种方法来代替GetGlyphOutline。我使用GDI将文本呈现到路径中,然后使用GetPath函数获取该路径的轮廓。结果是一样的。在某些字体中,GetPath以错误的轮廓顺序和/或错误的卷曲返回某些字符。
有谁有这方面的经验吗?有什么我能做的吗?
发布于 2012-09-06 01:25:47
也许不是一个完美的解决办法,但有一个想法(没有想到任何反例):
我的想法是,任何没有被字形覆盖的区域将具有模板值== 0,字形内的任何区域将具有模板值== 1,并且字形内的任何孔将具有模板值== 2(因为它们被原始字形和“洞”所覆盖)。然后,您可以按此进行筛选,以便仅绘制模板等于1的区域。
发布于 2017-10-31 10:37:15
我已经想出了一条规则来确定轮廓是界定字形的外部区域还是内部区域。对于内轮廓中的每条边,必须至少有一个点,使三角形按顺时针缠绕顺序。对于外轮廓中的边,不能存在三角形按顺时针缠绕顺序的点。请参阅TrueType fundamentals中的大纲部分。
https://stackoverflow.com/questions/12282349
复制相似问题