我正在使用FreeType2库在OpenGL应用程序中实现字体渲染。
我的问题是初始化多个FT_Face
个对象会导致程序崩溃。我尝试使用FT_Library
的单个实例并为每个新字体调用FT_Init_FreeType()
。我还尝试了针对每种字体havind单独的FT_Library
实例。
这两个初始化都有效,但是当我下次使用malloc.c
运算符时,我会从new
得到断言,无论在哪里,都可以在下一行代码中使用。
这是Font对象创建方法,其中FreeType2 lib被初始化:
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来查看所需的字符并渲染它们。
答案 0 :(得分:3)
在致电FT_New_Face
之前,您确定font->_face
是新的吗?因此,如果FT_Face
为NULL,则需要新的font->_face
。
注意:没有必要为每个Font实例初始化FT_Library
。您可以将Font::_ft
设为静态。
最后,代码应为:
class Font
{
public:
static FT_Library _ft;
static Font* create(const char* path, unsigned int size)
{
Font* font = new Font();
if (Font::_ft == NULL)
if (FT_Init_FreeType(&Font::_ft))
return NULL;
if (font->_face == NULL)
font->_face = new FT_Face;
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);
return font;
}
private:
// Set the member - _face to NULL when call constructor
Font() : _face(NULL) {}
~Font() { /* release the memory */ }
FT_Face* _face;
};
// Set the static member - _ft to NULL
FT_Library Font::_ft = NULL;
最后,在调用析构函数时,需要取消初始化/释放有关FreeType2的所有内存。
注意:FT_Face
的第四个变量(FT_New_Face
)必须是实例。 FT_New_Face
不会为FT_Face
分配内存。