使用FreeType加载彩色字体

4
我正在尝试呈现默认已经着色的表情符号文件。我正在使用'Segoe UI Emoji' 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

我需要帮助,已经卡在这个问题上很长时间,并尝试了不同版本的字体/其他字体。

注意:我看到了这篇文章,但似乎没有得到答案。

谢谢。


1
如果您正在寻找一种使用彩色位图的表情符号字体,则可以使用emojione-android。 - PeterT
我已经尝试过使用FT_Set_Char_Size,但每次都会出现FT_Err_Invalid_Pixel_Size错误,并且位图从未被填充。 - user8474852
1
使用位图时,您需要使用 FT_Select_Size(face, 0); 设置其中一个公布的尺寸。例如,第二个参数是可用尺寸在数组 available_sizes 中列出的索引。 - PeterT
你有没有一个使用Freetype/pango渲染彩色表情符号的示例,而不仅仅是一小段代码片段? - Elad Hazan
两年后,我又来到这里,因为我遇到了完全相同的字体文件问题。虽然Noto Color Emoji可以正常工作(因为它使用了嵌入位图),但我也想支持使用COLR/CPAL表的Segoe UI Emoji。你成功了吗?你有什么公开可分享的东西吗? :) - christianparpart
2个回答

2
从FreeType文档中得知:加载嵌入式彩色位图图像 [自2.5版本起]。如果可用,则生成的彩色位图将具有FT_PIXEL_MODE_BGRA格式。如果未设置标志并且发现了彩色位图,则它们会透明地转换为256级灰度位图,使用FT_PIXEL_MODE_GRAY格式。显然,FreeType仅支持彩色位图图像。Segoe使用COLR/CPAL矢量格式,也许这就是为什么它返回负数并呈现常规的“黑白”字形的原因?

1
这部分是正确的,从freetype 2.10开始,实际上有CPAL支持,它应该以同样的方式工作。 - PeterT
看起来2.10版本尚未被标记,因此现在似乎需要检出开发分支。请点击这里 - PeterT
那么它在2.10版本中受支持,只是我正在使用的2.9.1版本不支持? - user8474852
2
@Mike 是的,2.10版本支持渲染 Segoe UI Emoji 使用的彩色字体格式,我已经测试过了,可以正常工作。 - PeterT

1

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

谢谢!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接