2017-09-22 14 views
5

Windows "Segoe UI Emoji"에서 색칠 한 글자를 렌더링하려고합니다. 최신 freetype 2.8.1 (단일 또는 다중 스레드없이 소스 코드에서 x64 디버그 버전을 컴파일했습니다) 및 OpenGL을 사용합니다. 그래서 seguiemj.ttfWindows\Fonts 디렉토리 (SHA256 = d67717a6fe84e21bc580443add16ec920e6988ca067041d0461c641f75074a8c)에서 사용하지만 FT_HAS_COLOR는 항상 false를 반환합니다. 나는 또한 EmojiOneColor-SVGinOT.ttf에 의해 eosrei from github으로 시도해 본 결과 같은 결과가 나왔습니다.프리 형식으로 "Segoe UI Emoji"에서 색칠 된 글리프를 렌더링하는 방법은 무엇입니까?

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입니다. 내 applicaton

Emojis in my applicaton

에서 Word에서

이모티콘/

Emojis in Word/Firefox

이모티콘, 파이어 폭스

는 그것을 수정하거나 내가 뭔가 잘못했는지 뭔가가 있나요?

+0

[mcve]에서 편집하십시오. 또한 Github 글꼴을 연결하고 시도한 Microsoft 글꼴의 md5sum/sha256에서 편집하십시오. – genpfault

+0

감사합니다. 편집했습니다. github의 글꼴은 [여기] (https://github.com/eosrei/EmojiOne-Color-Font)에서 찾을 수 있습니다. (제한 때문에 내 게시물에 추가 할 수 없음) –

+0

걱정할 필요없이 편집했습니다. – genpfault

답변

1

FT_Load_Glyph with 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 만 사용하면됩니다. –