【发布时间】:2014-02-02 23:00:15
【问题描述】:
我正在使用 FreeType2 库在 OpenGL 应用程序中实现字体渲染。
我的问题是初始化多个 FT_Face 对象会使程序崩溃。我尝试使用FT_Library 的单个实例并为每种新字体调用FT_Init_FreeType()。我还尝试为每种字体设置单独的 FT_Library 实例。
两种初始化都有效,但是当我下次使用new 运算符时,无论在哪里,我都会从malloc.c 得到断言,字面上是下一行代码。
这里是 FreeType2 lib 初始化的 Font 对象创建方法:
Font::Font* create(const char* path, unsigned int size) {
Font* font = new Font();
FT_Init_FreeType(&(font->_ft));
if(FT_New_Face(font->_ft, path, 0, font->_face)) {
std::cerr << "Font: Could not load font from file " << path << "." << std::endl;
return NULL;
}
FT_Set_Pixel_Sizes(*(font->_face), 0, size);
}
如果我调用一次,这种和平的代码就可以正常工作。如果我第二次调用它,然后稍后在程序的另一部分调用它,我通过new 创建对象,应用程序崩溃。
这里有什么问题?应该有一些加载几种字体的好方法......
断言消息:malloc.c:2365: sysmalloc: Assertion (old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
更新:
字体类声明,每个类带有 ft 库实例的版本:
class Font
{
public:
static Font* create(const char* font, unsigned int size);
void renderText(const wchar_t* text, float x, float y, float sx, float sy);
private:
Font();
~Font();
FT_Library _ft;
FT_Face* _face;
};
renderText() 方法基本上使用 _face 来查看所需的字符并渲染它们。
【问题讨论】:
-
程序中有多个线程吗?你能告诉我们更多关于你的字体类的信息吗?
-
只有一个线程。字体类描述会在一分钟内作为帖子的更新提供。
-
字体构造函数和析构函数是什么?你为什么写
FT_Face* _face和FT_New_Face(font->_ft, path, 0, font->_face)而不是FT_Face _face和FT_New_Face(font->_ft, path, 0, &font->_face)?