字体图形例程

时间:2020-03-06 14:49:29  来源:igfitidea点击:

我们如何制作自己的字体?我不想使用重量级算法(freetype,truetype,adobe等),并且可以与预渲染的位图字体一起使用。

我确实要使用抗锯齿功能,并且如果可能的话还希望使用比例字体。

我听说我可以使用Gimp进行渲染(需要一些后期处理吗?)

我正在为带有LCD的嵌入式设备开发。它有一个32位处理器,但是我不想运行Linux(过多使用过多的代码/数据空间,以致于我使用的功能太少了)

C.必要时使用C ++,但首选C。算法和想法/概念在任何语言中都可以使用...

-亚当

解决方案

在过去的演示场景中,我经常在一个大的位图图像中绘制字体中的所有字符。在代码中,我存储了字体中每个字符的(X,Y)坐标以及每个字符的宽度。在整个字体中,高度通常是恒定的。如果空间不是问题,则可以将所有字符放在一个网格中,即每个字符左上角之间的距离是恒定的。

然后,渲染文本就变成了一次将一个字母复制到目标位置的问题。那时,我通常保留一种颜色作为"透明"颜色,但是我们今天绝对可以使用Alpha通道。

可用于小型黑白字体的一种更简单的方法是直接在代码中定义字符:

LetterA  db 01111100b
         db 11000110b
         db 11000110b
         db 11111110b
         db 11000110b
         db 11000110b

XPM文件格式实际上是具有C语法的文件格式,可以用作存储字符的混合解决方案。

预先渲染的位图字体可能是解决方法。使用任何字体渲染字体,将字符排列在网格中,然后以简单的未压缩格式(例如PPM,BMP或者TGA)保存图像。如果要使用抗锯齿功能,请确保使用支持透明性的格式(BMP和TGA可以使用; PPM不需要)。

为了支持比例宽度,我们需要从网格中提取每个字符的宽度。没有简单的方法可以做到这一点,这取决于生成网格的方式。我们可能可以编写一些简短的小程序来分析每个字符并找到最小边界框。获得宽度数据后,将其放入包含每个字符的坐标和大小的辅助文件中。

最后,要渲染一个字符串,我们需要查找每个字符,并将其矩形从字体位图中位化到帧缓冲区中,使光栅位置按字符的宽度前进。

我们已经成功地将SRGP软件包用于字体。我们确实使用了固定间距字体,所以我不确定它是否可以按比例显示字体。

我们正在使用由anglecode#s位图字体生成器生成的位图字体:

http://www.angelcode.com/products/bmfont/

这非常有用,因为它具有XML输出,可以轻松转换为所需的任何数据格式。

Angel Code的bmfont还在MudFont的旧版本中增加了字距调整和更好的包装。