2017-09-22 29 views
5

Tôi đang cố gắng hiển thị các hình tượng màu từ Windows "Segoe UI Emoji" -Font với freetype mới nhất 2.8.1 (Tôi đã biên dịch phiên bản gỡ lỗi x64 từ mã nguồn mà không có đơn hoặc đa luồng) và OpenGL. Vì vậy, tôi sử dụng số seguiemj.ttf từ thư mục Windows\Fonts (SHA256 = d67717a6fe84e21bc580443add16ec920e6988ca067041d0461c641f75074a8c), nhưng FT_HAS_COLOR luôn trả về false. Tôi cũng đã thử nó với EmojiOneColor-SVGinOT.ttf bởi eosrei from github, dẫn đến hành vi tương tự.Tôi làm cách nào để hiển thị các hình tượng màu từ "Segoe UI Emoji" với freetype?

Khi sử dụng this tệp cho android, FT_HAS_COLOR trả về true và thời điểm bitmap không được lấp đầy.

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

    ... 
} 

Về cơ bản tôi sử dụng mã ở trên, chỉ có thể nhận bitmap đơn sắc của tệp phông chữ và chế độ pixel luôn là FT_PIXEL_MODE_GRAY.

biểu tượng cảm xúc trong Word/Firefox

Emojis in Word/Firefox

biểu tượng cảm xúc trong applicaton tôi

Emojis in my applicaton

Có cái gì đó để khắc phục điều đó hoặc đã làm tôi điều gì sai?

+0

Chỉnh sửa trong [mcve]. Ngoài ra, liên kết phông chữ Github & chỉnh sửa trong md5sum/sha256 của phông chữ Microsoft bạn đã thử. – genpfault

+0

Cảm ơn, tôi đã chỉnh sửa nó. Bạn có thể tìm thấy phông chữ từ github [ở đây] (https://github.com/eosrei/EmojiOne-Color-Font). (không thể thêm nó vào bài đăng của tôi vì giới hạn) –

+0

Đừng lo, tôi đã chỉnh sửa nó cho bạn. – genpfault

Trả lời

1

FT_Load_Glyph với FT_LOAD_COLOR tải phiên bản bitmap của phông chữ vào khe glyph. Sau đó mã của bạn gọi FT_Render_Glyph và hiển thị glyph từ các phác thảo, thay thế hiệu quả bitmap đã tải trước đó.

Bạn sẽ ổn nếu bạn bỏ qua FT_Render_Glyph.

+0

Bạn nói đúng. Nhưng chỉ khi tôi thêm FT_LOAD_RENDER vào hàm FT_Load_Glyph, thì tôi có thể bỏ qua cuộc gọi FT_Render_Glyph và bộ đệm bitmap được lấp đầy. Có lẽ vì không có màu sắc. –

+0

@code_hunter Chờ. Bitmap không được lấp đầy khi chạy FT_Load_Glyph (..., FT_LOAD_COLOR)? Đặt FT_LOAD_RENDER trong đó tương đương với việc chạy FT_Render_Glyph sau khi tải, đó chính xác là những gì bạn không muốn làm. Đó là dự đoán của tôi. Nếu tôi sai, tôi sẽ trả lời câu trả lời – Andreas

+0

Bạn hoàn toàn đúng. FT_Render_Glyph chỉ cần thiết khi bạn không phải là chế độ hiển thị khác. Chỉ sử dụng FT_LOAD_COLOR phải đúng. –

Các vấn đề liên quan