如何使用freetype从“Segoe UI Emoji”渲染彩色字形?

我试图从Windows“Segoe UI Emoji”字体 – 最新的freetype 2.8.1(我从源代码编译X64debugging版本没有单或multithreading)和OpenGL字体。 所以我使用Windows\Fonts目录中的d67717a6fe84e21bc580443add16ec920e6988ca067041d0461c641f75074a8c (SHA256 = d67717a6fe84e21bc580443add16ec920e6988ca067041d0461c641f75074a8c ),但FT_HAS_COLOR总是返回false。 我也尝试了从github的EmojiOneColor-SVGinOT.ttf ,这导致了相同的行为。

在android中使用此文件时, 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中的表情符号

Word / Firefox中的表情符号

表情符号在我的应用程序

表情符号在我的应用程序

有什么可以解决的,或者我有什么问题?

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

你应该没问题,如果你跳过FT_Render_Glyph。