我试图从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中的表情符号
表情符号在我的应用程序
有什么可以解决的,或者我有什么问题?
带有FT_LOAD_COLOR的FT_Load_Glyph将字体的位图版本加载到字形槽中。 之后,您的代码调用FT_Render_Glyph并从轮廓渲染字形,有效地替换以前加载的位图。
你应该没问题,如果你跳过FT_Render_Glyph。