设计矢量字体引擎

Designing a vectored font engine

本文关键字:字体 引擎      更新时间:2023-10-16

我正在尝试设计一个矢量字体引擎,就像Atari 1979中的引擎一样。我在保存预定义的字符集及其坐标时遇到了问题,我不知道保存这些多边形的最佳数据结构是什么,也不知道为此设计类的最佳方法是什么。这是我的审判,我对此感到非常不舒服。

class Character
{
public:
Character();
public:
int ascii;
int strokes;
std::vector<ci::Vec2i> points;
};
void VectorFont::Init_Chars()
{
for (int i=0; i<1;i++)
{
Character char_A;
char_A.ascii = 65;
char_A.strokes = 6;
ci::Vec2i point_1 = ci::Vec2i(-6,-4);
ci::Vec2i point_2 = ci::Vec2i(0,8);
ci::Vec2i point_3 = ci::Vec2i(0,8);
ci::Vec2i point_4 = ci::Vec2i(6,-4);
ci::Vec2i point_5 = ci::Vec2i(4,0);
ci::Vec2i point_6 = ci::Vec2i(-4,0);
char_A.points.push_back(point_1);
char_A.points.push_back(point_2);
char_A.points.push_back(point_3);
char_A.points.push_back(point_4);
char_A.points.push_back(point_5);
char_A.points.push_back(point_6);
chars.push_back(char_A);
}
}

由于这些字符有洞,您需要定义一个Path类:

class Path
{
public: 
std::vector<ci::Vec2i> points;
int orientation; // 1 for fill, 0 for hole.
}

Path是点和方向的集合。你的路径应该是封闭的,也就是说,第一点和最后一点是相同的。如果方向为1,则表示填充黑色。如果是0,就切一个洞。

然后,Character类将有一个Paths集合,这些Paths将是填充或洞。

上面只是描述了填充和孔上的点的数据结构。必须编写一个引擎来将该数据结构转换为像素。这是另一个话题。