字体图形例程

时间:2008-09-27 14:50:45

标签: c fonts embedded rendering

你如何做自己的字体?我不想要重量级算法(freetype,truetype,adobe等),并且可以使用预渲染的位图字体。

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

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

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

℃。必要时使用C ++,但首选C语言。任何语言的算法和想法/概念都很好......

- 亚当

4 个答案:

答案 0 :(得分:4)

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

渲染文本然后变成将一个字母一次复制到目标位置的问题。那时候,我通常会将一种颜色保留为“透明”颜色,但今天你绝对可以使用alpha通道。

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

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

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

答案 1 :(得分:1)

预呈现的位图字体可能是要走的路。使用任何内容渲染字体,在网格中排列字符,并以PPM,BMP或TGA等简单的非压缩格式保存图像。如果你想要抗锯齿,请确保使用支持透明度的格式(BMP和TGA; PPM不支持)。

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

最后,为了渲染一个字符串,你可以查找每个字符并将其矩形从字体位图中bitblit到你的帧缓冲区,然后按照字符的宽度推进栅格位置。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

这非常实用,因为它具有XML输出,可以很容易地转换为您需要的任何数据格式。

Angel Code的bmfont还为MudFont的旧替代品添加了字距调整和更好的打包。