我使用freetype2(2.3.9)为D3D纹理函数构建了一个tff,以从字体生成灰度图。它在原生win32下工作得很好,然而,在WoW64上它只会爆炸(好吧,FT_Done
和FT_Load_Glyph
)。从某些调试来看,来自HeapFree
的{{1}}调用的free
似乎存在问题。
我知道它应该可行,就像WCIII这样的游戏,据我所知使用freetype2,运行正常,这是我的代码,剥离了D3D代码(它本身没有问题):
FT_Free
FT_Face pFace = NULL;
FT_Error nError = 0;
FT_Byte* pFont = static_cast<FT_Byte*>(ARCHIVE_LoadFile(pBuffer,&nSize));
if((nError = FT_New_Memory_Face(pLibrary,pFont,nSize,0,&pFace)) == 0)
{
FT_Set_Char_Size(pFace,nSize << 6,nSize << 6,96,96);
for(unsigned char c = 0; c < 95; c++)
{
if(!FT_Load_Glyph(pFace,FT_Get_Char_Index(pFace,c + 32),FT_LOAD_RENDER))
{
FT_Glyph pGlyph;
if(!FT_Get_Glyph(pFace->glyph,&pGlyph))
{
LOG("GET: %c",c + 32);
FT_Glyph_To_Bitmap(&pGlyph,FT_RENDER_MODE_NORMAL,0,1);
FT_BitmapGlyph pGlyphMap = reinterpret_cast<FT_BitmapGlyph>(pGlyph);
FT_Bitmap* pBitmap = &pGlyphMap->bitmap;
const size_t nWidth = pBitmap->width;
const size_t nHeight = pBitmap->rows;
//add to texture atlas
}
}
}
}
else
{
FT_Done_Face(pFace);
delete pFont;
return FALSE;
}
FT_Done_Face(pFace);
delete pFont;
return TRUE;
}
返回使用ARCHIVE_LoadFile
分配的块。
作为第二个问题,我想使用像素大小渲染字体,我遇到new
,但我不确定这是否会拉伸字体以适应大小,或将其限制为尺寸。我想要做的是渲染所有字形,例如24px(这里是MS字大小),然后将其转换为32px区域中的带符号距离字段。
更新
经过多次摆弄后,我得到了一个测试应用程序,这使我认为问题是由线程引起的,因为我的代码在辅助线程中运行。我已经使用多线程DLL将freetype编译成静态lib,我的应用程序使用多线程libs。我会看看我是否可以进行多线程测试。
同样更新到2.4.4,看看问题是否是一个已知但已修复的错误,但是没有帮助。
更新2
经过一些更多的摆弄后,事实证明我没有使用正确的lib for 2.4.4 -.-修复后,测试应用程序100%工作,但主FT_Set_Pixel_Sizes
时主应用程序仍然崩溃调用,似乎仍然是windows内存堆管理崩溃。是否有可能在freetype2中存在一个错误,使其在用户线程下爆炸?