使用FreeType加载彩色字体

时间:2019-02-20 08:07:16

标签: c++ fonts emoji freetype

我正在尝试渲染默认情况下已在文件中着色的图释。 我正在使用“ Segoe UI表情符号” SHA-256: 9e5a8c7e6c1e9096918a490798f4177107f0522870c8ad0227d5f02be407e0ed

问题在于FT_HAS_COLOR()始终返回false,因此我无法使用FT_LOAD_COLOR将位图加载到纹理中。

我已经在Universal Character Map中打开了文件,并看到了- Segoe UI Emoji

在其中对字形进行栅格化的代码片段

FT_Int32 flags = FT_LOAD_FORCE_AUTOHINT | ( m_bAntiAliasing ? FT_LOAD_TARGET_NORMAL : FT_LOAD_TARGET_MONO );
if ( FT_HAS_COLOR( m_face ) )
    flags |= FT_LOAD_COLOR;
else
    flags |= FT_LOAD_RENDER;         

if ( FT_Load_Char( m_face, glyphit->first, flags ) )
    continue;

结果 result

我将不胜感激,我已经坚持了一段时间,并尝试了该字体/其他字体的不同版本。

注意:我见过this,但似乎并没有得到回答

谢谢。

2 个答案:

答案 0 :(得分:1)

从FreeType文档中:

  

[自2.5开始]加载嵌入的彩色位图图像。生成的颜色位图(如果可用)将具有FT_PIXEL_MODE_BGRA格式。如果未设置该标志并且找到了颜色位图,则使用FT_PIXEL_MODE_GRAY格式将它们透明转换为256级灰度位图。

显然,FreeType仅支持彩色位图图像。 Segoe使用COLR / CPAL矢量格式,也许这就是为什么它返回负数并呈现常规的“黑白”字形的原因?

答案 1 :(得分:1)

已解决,@ PeterT提到FreeType 2.10支持Segoe UI Emoji和使用CPAL的类似字体,而2.9.1不支持。

谢谢!