2017-09-22 4 views
5

J'essaie de rendre les glyphes colorés de Windows "Segoe UI Emoji" -Font avec le dernier freetype 2.8.1 (j'ai compilé la version de débogage x64 du code source sans single ou multithread) et OpenGL. J'utilise donc le seguiemj.ttf du répertoire Windows\Fonts (SHA256 = d67717a6fe84e21bc580443add16ec920e6988ca067041d0461c641f75074a8c), mais FT_HAS_COLOR renvoie toujours false. J'ai également essayé avec le EmojiOneColor-SVGinOT.ttf par eosrei from github, ce qui entraîne le même comportement. Lors de l'utilisation du fichier this pour android, FT_HAS_COLOR renvoie true et l'emplacement bitmap n'est pas rempli.Comment rendre des glyphes colorés à partir de "Segoe UI Emoji" avec freetype?

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"); 

    ... 
} 

Fondamentalement, j'utiliser le code ci-dessus, qui est seulement capable de recevoir le bitmap monochrome que les fichiers de police et le mode de pixel est toujours FT_PIXEL_MODE_GRAY.

Emojis dans Word/Firefox

Emojis in Word/Firefox

Emojis dans mon applicaton

Emojis in my applicaton

Y at-il quelque chose pour résoudre ce problème ou a fait quelque chose de mal je?

+0

Modifier dans un [mcve]. En outre, linkify la police de Github et éditent dans le md5sum/sha256 de la police de Microsoft que vous avez essayée. – genpfault

+0

Merci, je l'ai édité. La police de github peut être trouvée [ici] (https://github.com/eosrei/EmojiOne-Color-Font). (pas en mesure de l'ajouter à mon message en raison de limitations) –

+0

Pas de soucis, je l'ai édité pour vous. – genpfault

Répondre

1

FT_Load_Glyph avec FT_LOAD_COLOR charge une version bitmap de la police dans le slot glyphe. Après cela, votre code appelle FT_Render_Glyph et restitue le glyphe à partir des contours, remplaçant efficacement le bitmap précédemment chargé.

Cela devrait aller si vous ignorez FT_Render_Glyph.

+0

Vous avez raison. Mais seulement quand j'ajoute FT_LOAD_RENDER à la fonction FT_Load_Glyph, alors je peux passer l'appel FT_Render_Glyph et le tampon bitmap est rempli. Peut-être parce qu'il n'y a pas de couleurs disponibles. –

+0

@code_hunter Attendez. Le bitmap n'est pas rempli lors de l'exécution de FT_Load_Glyph (..., FT_LOAD_COLOR)? Mettre FT_LOAD_RENDER dedans équivaut à exécuter FT_Render_Glyph après le chargement, ce qui est exactement ce que vous ne voulez pas faire. C'était ma conjecture. Si je me trompe je vais reprendre la réponse – Andreas

+0

Vous avez absolument raison. FT_Render_Glyph n'est nécessaire que lorsque vous voulez un mode de rendu différent. Utiliser seulement FT_LOAD_COLOR devrait avoir raison. –