带有notosan字体的奇怪的freetype渲染

时间:2018-07-20 07:34:16

标签: freetype2

我遇到了一个用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

Sample Image

[结果-异常]-字母V

Sample Image

我认为这是自由类型库或NotosanCJK字体的问题,因为当我使用其他字体时没有问题,但我不确定这是真正的原因。

有人猜到这个问题的原因吗?

谢谢

0 个答案:

没有答案