Freetype2在WoW64下失败

时间:2010-12-13 06:56:48

标签: visual-c++ wow64 freetype2

我使用freetype2(2.3.9)为D3D纹理函数构建了一个tff,以从字体生成灰度图。它在原生win32下工作得很好,然而,在WoW64上它只会爆炸(好吧,FT_DoneFT_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中存在一个错误,使其在用户线程下爆炸?

0 个答案:

没有答案