2014-10-02 50 views
0

我使用freetype2渲染字体Consolas渲染字体看起来比它应该更大胆

我呈现使用

FT_Load_Glyph(face, glyphIndex, FT_LOAD_DEFAULT); 
FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL); 

字形,然后用一个简单的循环转换的位图的ARGB地图:

uint32_t* content = ... // ARGB bitmap 

for (int py = 0; py < bitmap->rows; py++) { 
    for (int px = 0; px < bitmap->width; px++) { 
     uint8_t intensity = bitmap->buffer[py * bitmap->pitch + px]; 
     content[py * bitmap->width + px] = (intensity << 24); 
    } 
} 

的结果是,我的渲染文字看起来,当它呈现比更大胆从例如记事本:

Upper font rendered by freetype2, lower one by Notepad.

这个问题的原因是什么?

回答

2

我不是Freetype专家(根本就不是),但是如果你用放大镜看你的示例位图,你会发现Notpad渲染的周围有淡蓝色和粉红色的阴影。你的渲染是反锯齿的,但都是灰色的。

所以我假设记事本在LCD模式下呈现每个像素really renders three subpixels(对应于阴极射线显示的RBG光线),然后用相邻像素对它们进行涂抹。

这也意味着沿着这些子像素发生垂直提示,并且例如记事本渲染中垂直茎的宽度是四个或五个子像素,而在渲染中是在全像素边界处的alwys ,即六个子像素。与记事本相比,这使得您的渲染看起来更加大胆。 (也许你可以找到反转效果的字体大小:你的渲染看起来比记事本更轻。)

你也可以在LCD模式下进行渲染(FT_RENDER_MODE_LCD)。您将呈现三倍宽的位图,并且在将文本位图复制到ARGB位图时,应该取三个相邻像素的平均值。 (这不会给你真正的LCD渲染,而是一个更浅的灰度渲染。)

+0

谢谢,我认为这是原因,子像素渲染页面真的帮助我! – maxdev 2014-10-03 16:27:50