我遇到了一个用NotosansCJK(Google Opensource字体)和freetype 2进行字体渲染的问题。 我的自由字体版本是2.8.1,当我从Ft制作位图以创建opengl纹理时,这是我代码的一部分。
[使用Freetype库渲染字母]
bool bRender = false;
FT_Error fError;
uint uCharIndex;
if(m_tFTFace == KD_NULL)
{
return bRender;
}
if( m_nCharFontSize != nCharFontSize )
{
if(SetCharSize(nCharFontSize) == KD_FALSE)
{
return bRender;
}
}
uCharIndex = FT_Get_Char_Index(m_tFTFace,(FT_ULong)uCharUnicode);
if(uCharIndex == 0)
{
return bRender;
}
fError = FT_Load_Glyph(m_tFTFace,uCharIndex, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP );
if(fError)
{
return bRender;
}
if(m_nExtraBoldthick > 0)
{
FT_Outline_Embolden(&m_tFTFace->glyph->outline, (m_tFTFace->size->metrics.x_ppem*m_nExtraBoldthick/100)*64);
}
fError = FT_Render_Glyph(m_tFTFace->glyph,FT_RENDER_MODE_NORMAL);
if(fError)
{
return bRender;
}
else
{
bRender = KD_TRUE;
}
if( bRender == KD_TRUE )
{
m_uRenderedUnicode = uCharUnicode;
}
return bRender;
[制作Alpha位图]
FT_Face pFace = m_oTtfFont.GetFontFace();
int nBitmapWidth,nBitmapHeight;
nBitmapWidth = pFace->glyph->bitmap.width;
nBitmapHeight = pFace->glyph->bitmap.rows;
kdMemset( pBitmap->m_aBitmap, 0, sizeof(KDubyte)*32*32);
int nTX = pFace->glyph->bitmap_left + 32/2 - (pFace->glyph->advance.x>>6) ;
int nTY = 0;
int y = nBitmapHeight;
while( y-- > 0 )
{
nTX = pFace->glyph->bitmap_left;
if(nTX < 0)
{
nBitmapWidth = pFace->glyph->bitmap.width + nTX;
nTX = 0;
}
else
{
nBitmapWidth = pFace->glyph->bitmap.width;
}
for (int x = 0; x < nBitmapWidth; x++)
{
pBitmap->m_aBitmap[nTY][nTX] = pFace->glyph->bitmap.buffer[(y*nBitmapWidth)+x];
nTX++;
}
nTY++;
}
几乎所有字母都可以正确呈现,但是如果我使用的字符大小大于15,则某些结果会异常,尤其是英语。 测试时所有的notosancjk字体都有类似的问题
这是使用NotoSansCJKkr-Bold.otf的结果,字符大小为20
[结果-正常]-字母O
[结果-异常]-字母V
我认为这是自由类型库或NotosanCJK字体的问题,因为当我使用其他字体时没有问题,但我不确定这是真正的原因。
有人猜到这个问题的原因吗?
谢谢