2017-09-22 49 views
5

मैं विंडोज "सेगो यूआई इमोजी" से रंगीन ग्लिफ प्रस्तुत करने की कोशिश कर रहा हूं- नवीनतम फ्रेटीप 2.8.1 के साथ नहीं (मैंने एकल कोड या बहुप्रचारित किए बिना स्रोत कोड से x64 डीबग संस्करण संकलित किया) और ओपनजीएल। तो मैं Windows\Fonts निर्देशिका (SHA256 = d67717a6fe84e21bc580443add16ec920e6988ca067041d0461c641f75074a8c) से seguiemj.ttf का उपयोग करता हूं, लेकिन FT_HAS_COLOR हमेशा झूठा लौटाता है। मैंने इसे EmojiOneColor-SVGinOT.ttfeosrei from github से भी आजमाया, जिसके परिणामस्वरूप एक ही व्यवहार होता है।मैं freetype के साथ "सेगो यूआई इमोजी" से रंगीन ग्लिफ कैसे प्रस्तुत कर सकता हूं?

एंड्रॉइड के लिए this फ़ाइल का उपयोग करते समय, FT_HAS_COLOR सत्य लौटाता है और बिटमैप स्लॉट वैसे भी भर नहीं जाता है।

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 है। वर्ड में

Emojis/फ़ायरफ़ॉक्स

Emojis in Word/Firefox

Emojis मेरी applicaton

Emojis in my applicaton

में वहाँ है कि ठीक करने या मैंने कुछ गलत किया था के लिए कुछ है?

+0

एक [mcve] में संपादित करें। साथ ही, जीथ्यूब फ़ॉन्ट को लिंक करें और आपके द्वारा किए गए माइक्रोसॉफ्ट फ़ॉन्ट के md5sum/sha256 में संपादित करें। – genpfault

+0

धन्यवाद, मैंने इसे संपादित किया। जिथब से फ़ॉन्ट पाया जा सकता है [यहां] (https://github.com/eosrei/EmojiOne-color-Font)। (सीमाओं के कारण इसे मेरे पोस्ट में जोड़ने में सक्षम नहीं) –

+0

कोई चिंता नहीं, मैंने इसे आपके लिए संपादित किया। – genpfault

उत्तर

1

FT_Load_Glyph FT_LOAD_COLOR के साथ ग्लाइफ स्लॉट में फ़ॉन्ट का बिटमैप संस्करण लोड करें। उसके बाद आपका कोड FT_Render_Glyph को कॉल करता है और पहले से लोड किए गए बिटमैप को प्रभावी ढंग से बदलकर, रूपरेखा से ग्लिफ़ प्रस्तुत करता है।

यदि आप FT_Render_Glyph को छोड़ते हैं तो आपको ठीक होना चाहिए।

+0

आप सही हैं। लेकिन केवल जब मैं FT_Load_Glyph फ़ंक्शन में FT_LOAD_RENDER जोड़ता हूं, तो मैं FT_Render_Glyph कॉल को छोड़ सकता हूं और बिटमैप बफर भर जाता है। शायद क्योंकि कोई रंग उपलब्ध नहीं है। –

+0

@code_hunter प्रतीक्षा करें। FT_Load_Glyph (..., FT_LOAD_COLOR) चलाते समय बिटमैप भरा नहीं है? वहां FT_LOAD_RENDER को लोड करने के बाद FT_Render_Glyph को चलाने के बराबर है जो वास्तव में आप नहीं करना चाहते हैं। वह मेरा अनुमान था। अगर मैं गलत हूं तो मैं जवाब वापस ले जाऊंगा – Andreas

+0

आप बिल्कुल सही हैं। FT_Render_Glyph केवल तभी जरूरी है जब आप एक अलग रेंडर मोड नहीं बनाते। केवल FT_LOAD_COLOR का उपयोग करना सही होना चाहिए। –

संबंधित मुद्दे