Matrix 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上下文时设置字体的方式: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 =
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频道?有完整的最佳位置列表可以问吗