Matrix Cairo FreeType字体-无效矩阵(不可逆)

Matrix Cairo FreeType字体-无效矩阵(不可逆),matrix,fonts,d,cairo,freetype,Matrix,Fonts,D,Cairo,Freetype,当我尝试在cairo中使用FT字体时,遇到以下cairo错误: 无效矩阵(不可逆) 不涉及绘图,因为如果我使用toy font API来完成通常使用严肃字体API所做的事情,那么它就会工作(cairo\u scaled\u font\u text\u to_glyphs和cairo\u show\u glyphs)。 因此,问题当然来自字体的初始化方式 这是我在画布获得cairo\t上下文时设置字体的方式: void fontToCairoData() { _fontOptions =

当我尝试在cairo中使用FT字体时,遇到以下cairo错误:

无效矩阵(不可逆)

不涉及绘图,因为如果我使用toy font API来完成通常使用严肃字体API所做的事情,那么它就会工作(cairo\u scaled\u font\u text\u to_glyphscairo\u show\u glyphs)。 因此,问题当然来自字体的初始化方式

这是我在画布获得cairo\t上下文时设置字体的方式:

void fontToCairoData()
{
    _fontOptions = cairo_font_options_create;
    cairo_get_font_options (_cr, _fontOptions);

    /*
        - Toy API w/o matrix init: seconds assert fails: invalid matrix (not invertible)
        - Toy API + matrix init: OK
        - FreeType loader w/o matrix init: second assert fails: invalid matrix (not invertible)
        - FreeType loader + matrix init: the two assert OK but internal cairo assert failure.
    */

    cairo_matrix_init(&_fontMat, _font.size, 0, 0, _font.size, 0, 0);
    cairo_matrix_init(&_fontCtm, _font.size, 0, 0, _font.size, 0, 0);

    cairo_font_face_t* ff;
    version(none) // toy API
    {
        cairo_select_font_face(_cr, "Sans", CairoFontSlant.Normal, CairoFontWeight.Normal);
        ff = cairo_get_font_face(_cr);
    }
    else ff = getCairoFont(_font.name);

    assert(cairo_font_face_status(ff) == CairoStatus.Success,
        cairo_font_face_status(ff).cairo_status_to_string.fromStringz);

    cairo_ft_font_face_set_synthesize(ff, _font.getStyles.container & 3);
    _sf = cairo_scaled_font_create(ff, &_fontMat, &_fontCtm, _fontOptions);

    assert(cairo_scaled_font_status(_sf) == CairoStatus.Success,
        cairo_scaled_font_status(_sf).cairo_status_to_string.fromStringz);

    cairo_set_scaled_font(_cr, _sf);
}
getCairoFont是对freetype加载程序的调用,它返回来自此函数的内容:

cairo_font_face_t* createFont(string name)
{
    import std.string: toStringz;

    FT_Face ftFace;
    FT_New_Face(ftHandle, cast(char*)name.toStringz, 0, &ftFace);
    return cairo_ft_font_face_create_for_ft_face(ftFace, 0);
}
当初始化矩阵的代码没有注释时,我在控制台中得到一些cairo断言失败,例如

默认对齐方式:cairo-ft-font.c:657:\u cairo\u-ft\u未缩放的\u-font\u-lock\u-face:Assertion`!未缩放->从“面”失败


FontoCairodata有什么问题?矩阵应如何初始化?

问题是由于错误使用了cairo\u save()cairo\u restore()而导致设置丢失(可能是默认的字体矩阵)

对于每个控件,上一次的翻译都是这样保存和恢复的:

void beginControl(CustomControl ctrl)
{
    cairo_save(_cr);
    cairo_translate(_cr, ctrl.left, ctrl.top);
    if (ctrl.clipChildren)
    {
        cairo_rectangle(_cr, -1, -1, ctrl.width+2, ctrl.height+2);
        cairo_clip(_cr);
    }
}

void endControl()
{
    cairo_restore(_cr);
}
基于错误的假设,即“保存/恢复”仅对平面几何图形产生影响。但这实际上破坏了一些环境

当飞机正确恢复时:

void endControl(CustomControl ctrl)
{
    cairo_translate(_cr, -ctrl.left, -ctrl.top);
    if (ctrl.clipChildren)
        cairo_reset_clip(_cr);
}

甚至不再需要与字体和矩阵相关的消息(cairo\u set\u font\u size完成此工作),因为如前所述,手动创建缩放字体是不必要的,它可以从当前字体中检索。

第一个业务点:更改
if(auto ff=getCairoFont(_字体名称))
到变量赋值,然后测试,看看getCairoFont是否做了一些奇怪的事情。如果你有抛出错误的代码,就没有捷径。我已经清理了代码,添加了更多断言。显然是两个矩阵被初始化导致了问题。好的,很好的信息。然后:是每种字体都会发生这种情况吗?还是只针对这一种?Eve我真的找不到任何有用的源代码(例如tuto)为此,大多数人似乎都在使用Pango+Gtk。我的东西只有x11+cairo。在等待解决方案时,我使用了toy API。你是否也问过那些实际维护/使用cairo的人,通过使用他们的邮件列表或进入他们的IRC频道?有完整的最佳位置列表可以问吗