为什么get_linesize()错误地为.fon字体返回1?

时间:2014-06-22 07:59:40

标签: python-2.7 fonts pygame

我在Pygame1.9.1的字体模块中发生了这个奇怪的事情,其中​​.get_linesize()为字形高度(更不用说每行高度)渲染大于1的字体返回1.它只发生在.fon字体。

为了控制,以下是两个示例,以及 工作的第三种字体。我从IDLE的shell运行这些,但同样的事情发生在适当的模块上。 无论如何,Pygame已经初始化了。

>>> testfont = pygame.font.Font("C:/Windows/Fonts/vga850.fon", 12)
>>> testfont.get_linesize()  # This one returns 1. For 'Terminal Regular'
1
>>> otherfont = pygame.font.Font("C:/Windows/Fonts/vgafix.fon", 18)
>>> otherfont.get_linesize() # This also returns 1. For 'Fixedsys Regular'
1
>>> lastfont = pygame.font.Font("C:/Windows/Fonts/OCRAStd.otf", 24)
>>> lastfont.get_linesize()  # This returns the correct value. For 'OCR A Std Regular'
29
>>> textsurf = testfont.render("This is a nightmare!", True, (0,0,0))
>>> textsurf.get_size()[1]   # Let's get the height of this surface...
12
>>> othersurf = otherfont.render("An inescapable nightmare!", False, (0,0,0))
>>> othersurf.get_size()[1]  # This one, too. Antialiasing makes no difference.
15
>>> lastsurf = lastfont.render("You're okay, OCRA.", True, (0,0,0))
>>> lastsurf.get_size()[1]   # And finally, the control...
25

控件渲染的高度稍微短一些,因为get_linesize()包含线之间的间隙,这是出于美学原因。 <Font>.size("sample string")[1]正常工作,因此这是我对行高的权宜之计。

所有三种字体都能正确呈现。

<Font>.get_linesize()无法正确回复的字体的共同主题是,它们都共享扩展程序.fon,因此简单的“解决方案”就是“不要使用{{1}使用 .fon 字体;请改用.get_linesize()。“ 然而,这有点不优雅,(更糟糕的是!)非常无聊,我更感兴趣知道导致这个问题的原因,如果有一种制作这些字体的方法尽可能与.size('sample')[1] + some_adjustment合作。

我查看了Pygame的文档,无法找到与此问题有关的内容,并且许多网络搜索也没有结果。

1 个答案:

答案 0 :(得分:0)

Pygame的Font支持取决于SDL_ttffreetype2依赖于pygame.freetype.Font。我怀疑在计算行高的值时存在一些问题,因为字体经过这些层(特别是SDL_ttf层,因为freetype2只读取字体数据)。

考虑使用a much richer而不是pygame.Font。 freetype模块跳过SDL_ttf层并直接使用freetype。那里有一组get_sized_height()字体选项。我会尝试{{3}}作为get_linesize()的替代。

如果仍然不起作用,很可能是在读取FON文件时出现freetype错误,或者可能FON文件本身没有正确设置值。