Возникли проблемы с реализацией FreeType2 для плагина X-Plane. Я использую реализацию freetype, которую я не писал, но хорошая новость в том, что она работает … в режиме релиза. Я не могу преодолеть эту точку в режиме отладки, что означает, что я не могу отлаживать любые другие части моей программы. Если у кого-то есть идеи о том, что может пойти не так или как я могу предотвратить возникновение проблемы при отладке, это было бы здорово. Вот код:
// We iterate through every letter that we care about
// and record the tallest letter and the width of all
// letters combined as well as the widest letter.
for(int n = FM_BASE_ASCII_RANGE; n <= FM_PEAK_ASCII_RANGE; ++n)
{
if(FT_Load_Char(*inFace, n, FT_LOAD_RENDER))
continue;
// If the bitmap doesn't exist, we have nothing to do
//access violation happens when executing the next line in debug
if(!(*inFace)->glyph->bitmap.rows || !(*inFace)->glyph->bitmap.width)
continue;
int width = (*inFace)->glyph->metrics.width / 64.0;
int height = (*inFace)->glyph->metrics.height / 64.0;
// If any of the sizes are 0, we have nothing to do
if(!(*inFace)->glyph->metrics.width || !(*inFace)->glyph->metrics.height)
continue;
if(height > maxHeight)
maxHeight = height;
// Add this to our sum with some room for padding as well
curRowWidth += width + FM_PIX_PADDING;
// If it doesn't fit, we add a new row and put it there
if(curRowWidth > FM_DEFAULT_TEX_WIDTH)
{
nRows++;
curRowWidth = width + FM_PIX_PADDING;
}
}
Код выше вызывается для каждого шрифта и перебирает буквы, чтобы вычислить размер, который я считаю. Ошибка происходит впервые с первым загруженным шрифтом. Рендеринг шрифтов прекрасно работает и отлично выглядит в режиме релиза.
Я не уверен, имеет ли это значение, но если я нарушу перед этим нарушением доступа и оцениваю (* inFace) -> glyph-> bitmap, я вижу, что строки и ширина равны 0 … но bitmap.buffer указан как 0x0000 ~ ,
Также n равно 32 на первой итерации цикла. FT_Load_Char возвращается без ошибок.
Я использую Visual Studio 2010 с Windows 7.1 SDK в 64-разрядной версии Win 7, и это 64-разрядный проект. Я только что перешел на freetype 2.5.3, но у меня была та же проблема с моей предыдущей версией 2.4.12.
Если кто-то может помочь, это очень поможет мне, спасибо!
Изменить: Вот раздел разборки вокруг ошибки во время работы:
for(int n = FM_BASE_ASCII_RANGE; n <= FM_PEAK_ASCII_RANGE; ++n)
000007FEE531F29A mov dword ptr [n],20h
000007FEE531F2A2 jmp FontMgr::CalcTexSize+6Eh (7FEE531F2AEh)
000007FEE531F2A4 mov eax,dword ptr [n]
000007FEE531F2A8 inc eax
000007FEE531F2AA mov dword ptr [n],eax
000007FEE531F2AE cmp dword ptr [n],0FEh
000007FEE531F2B6 jg FontMgr::CalcTexSize+178h (7FEE531F3B8h)
{
if(FT_Load_Char(*inFace, n, FT_LOAD_RENDER))
000007FEE531F2BC mov r8d,4
000007FEE531F2C2 mov edx,dword ptr [n]
000007FEE531F2C6 mov rax,qword ptr [inFace]
000007FEE531F2CB mov rcx,qword ptr [rax]
000007FEE531F2CE call FT_Load_Char (7FEE5360790h)
000007FEE531F2D3 test eax,eax
000007FEE531F2D5 je FontMgr::CalcTexSize+99h (7FEE531F2D9h)
continue;
000007FEE531F2D7 jmp FontMgr::CalcTexSize+64h (7FEE531F2A4h)
// If the bitmap doesn't exist, we have nothing to do
if(!(*inFace)->glyph->bitmap.rows ||!(*inFace)->glyph->bitmap.width)
000007FEE531F2D9 mov rax,qword ptr [inFace]
000007FEE531F2DE mov rax,qword ptr [rax]
000007FEE531F2E1 mov rax,qword ptr [rax+6Ch]
->000007FEE531F2E5 cmp dword ptr [rax+60h],0
000007FEE531F2E9 je FontMgr::CalcTexSize+0BDh (7FEE531F2FDh)
000007FEE531F2EB mov rax,qword ptr [inFace]
000007FEE531F2F0 mov rax,qword ptr [rax]
000007FEE531F2F3 mov rax,qword ptr [rax+6Ch]
000007FEE531F2F7 cmp dword ptr [rax+64h],0
000007FEE531F2FB jne FontMgr::CalcTexSize+0BFh (7FEE531F2FFh)
continue;
000007FEE531F2FD jmp FontMgr::CalcTexSize+64h (7FEE531F2A4h)
Задача ещё не решена.