我该如何使用freetype渲染"Segoe UI Emoji"字体中的彩色字符?

11
我正在尝试使用最新的freetype 2.8.1(我从源代码编译了x64调试版本,没有单线程或多线程)和OpenGL来呈现Windows“Segoe UI Emoji”字体的彩色字形。因此,我使用来自“Windows\Fonts”目录的“seguiemj.ttf”文件(SHA256 =“d67717a6fe84e21bc580443add16ec920e6988ca067041d0461c641f75074a8c”),但FT_HAS_COLOR始终返回false。我还尝试了eosrei from github提供的EmojiOneColor-SVGinOT.ttf文件,结果行为相同。
当在Android上使用this文件时,FT_HAS_COLOR返回true,但位图插槽仍未填充。
FT_Library library;
FT_Face face;

FT_Init_FreeType(&library);
FT_New_Face(library, "resources/fonts/seguiemj.ttf", 0, &face);

bool has_color = FT_HAS_COLOR(face);
debug(LOG_INFO, 0, "font has colors: %s", has_color ? "yes" : "no");

std::u32string s = U"       ";

FT_GlyphSlot slot = face->glyph;
for (auto c : s)
{
   int glyph_index = FT_Get_Char_Index(face, c);

   FT_Error error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT|FT_LOAD_COLOR);
   if (error)
       continue;

   error = FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL);
   if (error)
       continue;

   if (slot->bitmap.pixel_mode == FT_PIXEL_MODE_BGRA)
       debug(LOG_INFO, 0, "glyph is colored");

   ...
}

基本上我使用上面的代码,只能接收那些字体文件的单色位图,并且像素模式总是FT_PIXEL_MODE_GRAY。
Word/Firefox中的表情符号

Emojis in Word/Firefox

我的应用程序中的表情符号

Emojis in my applicaton

有什么方法可以修复这个问题,还是我做错了什么?


在 [mcve] 中进行编辑。此外,将Github字体链接化并在尝试的Microsoft字体的md5sum / sha256中进行编辑。 - genpfault
在调用FT_Load_Glyph()后,face->glyph->format是否设置为FT_GLYPH_FORMAT_BITMAP - genpfault
它在两种字体中都设置为FT_GLYPH_FORMAT_OUTLINE - code_hunter
嘿,你还有生成彩色表情符号的所有代码吗? - Elad Hazan
1个回答

3

使用FT_LOAD_COLOR参数调用FT_Load_Glyph函数,可以将字体的位图版本加载到字形插槽中。之后,您的代码调用FT_Render_Glyph函数并从轮廓渲染字形,有效地替换先前加载的位图。

如果跳过FT_Render_Glyph函数,也应该没有问题。


你说得对。但只有当我在FT_Load_Glyph函数中添加FT_LOAD_RENDER时,我才能跳过FT_Render_Glyph调用并填充位图缓冲区。可能是因为没有可用的颜色。 - code_hunter
@code_hunter 稍等,当运行FT_Load_Glyph(..., FT_LOAD_COLOR)时位图并未填充?在此加上FT_LOAD_RENDER等同于在加载后运行FT_Render_Glyph,而这恰恰不是你想要做的。这是我的猜测。如果我错了,我会撤回答案。 - Andreas
你是绝对正确的。只有当你想要不同的渲染模式时,才需要使用FT_Render_Glyph。仅使用FT_LOAD_COLOR应该就可以了。 - code_hunter

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