freetype2(2.3.9) を使用して tff to D3D テクスチャ関数を作成し、フォントからグレースケール マップを生成しました。ネイティブのwin32ではうまく機能しますが、WoW64では爆発します(まあ、FT_Done
そうFT_Load_Glyph
です)。一部のデバッグから、fromHeapFree
によって呼び出される問題のようです。free
FT_Free
私の知る限り freetype2 を使用する WCIII のようなゲームは問題なく動作するはずです。
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
。
二次的な質問として、ピクセルサイズを使用してフォントをレンダリングしたいのですがFT_Set_Pixel_Sizes
、これがフォントをサイズに合わせて拡大するのか、サイズに制限するのかはわかりません。私がやりたいのは、すべてのグリフを 24px (ここでは MS Word サイズ) でレンダリングし、それを 32px 領域の符号付き距離フィールドに変換することです。
アップデート
いろいろいじった後、テストアプリが動作するようになりました。これにより、コードがセカンダリスレッドで実行されているため、問題はスレッド化に起因すると考えられます。マルチスレッド DLL を使用して freetype を静的ライブラリにコンパイルしました。アプリはマルチスレッド ライブラリを使用します。マルチスレッドテストをセットアップできるかどうかを確認します。
また、2.4.4 に更新して、問題が既知のバグであるかどうかを確認しましたが、解決しませんでした。
更新 2
さらにいじった後、2.4.4の正しいライブラリを使用していなかったことが判明しましたFT_Done_Face
. Windows のメモリ ヒープ管理で。freetype2 にバグがあり、ユーザー スレッドで爆発する可能性はありますか?