自由类型:如何栅格化未填充的轮廓

FreeType: how to rasterize non-filled outline

本文关键字:填充 轮廓 何栅格 类型 自由      更新时间:2023-10-16

我目前正在尝试创建仅包含字形外边框的字形位图,内部没有任何填充。为此使用 FreeType 库。这是我的代码,类似于 FreeType 参考中的示例 2 代码:

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 的文档/示例。

在解决方案下面分享如何使用大纲字体来做到这一点,因为我只使用它,这可能会对您有所帮助.

        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