FreeType: как растеризовать незаполненный контур

В настоящее время я пытаюсь создать растровое изображение глифа, которое содержит только внешнюю границу глифа, без заливки внутри. Использование библиотеки FreeType для этого. Вот мой код, который похож на пример 2 кода из ссылки FreeType:

Spans outlineSpans;
FT_Stroker stroker;
FT_Stroker_New(ft, &stroker);
FT_Stroker_Set(stroker, outlineWidth, round ? FT_STROKER_LINECAP_ROUND : FT_STROKER_LINECAP_SQUARE, round ? FT_STROKER_LINEJOIN_ROUND : FT_STROKER_LINEJOIN_BEVEL, 0);

FT_Glyph g;
FT_Get_Glyph(currentFace->glyph, &g);
FT_Glyph_StrokeBorder(&g, stroker, 0, 1);

FT_Raster_Params params;
memset(&params, 0, sizeof(params));
params.flags = FT_RASTER_FLAG_AA | FT_RASTER_FLAG_DIRECT;
params.gray_spans = RasterCallback;
params.user = &outlineSpans;
outlineSpans.clear();
FT_Outline *o = &reinterpret_cast<FT_OutlineGlyph>(g)->outline;
int err = FT_Outline_Render(ft, o, &params);

FT_Stroker_Done(stroker);
FT_Done_Glyph(g);

В результате я получаю outlineSpans вектор, заполненный интервалами для всего изображения глифа, но мне нужно только растянуть границу.
CurrentFace->glyph содержит глиф, который я загрузил с помощью FT_Load_Char(currentFace, *ch, FT_LOAD_NO_BITMAP))
Что я делаю неправильно? Спасибо за любую помощь, в сети не так много документации / примеров о FreeType.

1

Решение

Ниже приведено решение о том, как вы можете сделать это с помощью контурных шрифтов, поскольку я работал только с этим, это может помочь вам.

        FT_OutlineGlyph _oGlyph;
struct Point{
int x;
int y;
};

vector<std::pair<int, int>> pointsPairVector;

pointCount = _oGlyph->outline.n_points;

for(int i = 0; i < pointCount; i++)
{
point.first = _oGlyph->outline.points[i].x;
point.second = _oGlyph->outline.points[i].y;
pointsPairVector.push_back(point)
}
//use Cairo to connect points in pointsPairVector
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]