I'm trying to make a string with specials characters but I can't get my program run correctly. Specials characters aren't displayed. My program run like this :
- Initialization
- New face
- Set character size
- Select character map ( here Unicode with " ft_encoding_unicode" macro )
while I don't reach the 0xFFth character from the space character :
- Load glyph
- Get glyph
- Convert to bitmap if necessary
- Load pixels and others
with the code :
ENG_Font* ENG_OpenFont(const char* path, uint size, ENG_Color* color)
{
ENG_Font* font = (ENG_Font*) malloc(sizeof(ENG_Font));
ENG_If_AddError_Goto(!font, ENGER_ALLOC, END);
ENG_If_AddError_Goto(FT_New_Face(ENG_GetConfigFTLib(ENG_GetGlobConfig()), path, 0, &font->face), ENGER_FONT, END_ERR_0);
ENG_If_AddError_Goto(FT_Set_Char_Size(font->face, size << 6, size << 6, 96, 96), ENGER_FONT, END_ERR_0);
FT_Select_Charmap(font->face, ft_encoding_unicode);
label end = &&END;
for(uint i = ' '; i <= 0xFF; i++)
{
FT_Glyph glyph;
u32 index = FT_Get_Char_Index(font->face, i);
if(FT_Load_Glyph(font->face, index, FT_LOAD_RENDER))
continue;
if(FT_Get_Glyph(font->face->glyph, &glyph))
continue;
if(font->face->glyph->format != FT_GLYPH_FORMAT_BITMAP && FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, NULL, 1))
continue;
u32 w = font->face->glyph->bitmap.width, h = font->face->glyph->bitmap.rows;
u8* px = (u8*) malloc(w * h * 4 * sizeof(u8));
if(!px)
{
ENG_AddError(ENGER_ALLOC);
end = &&END_ERR_0;
break;
}
for(uint y = 0; y < h; y++)
{
for(uint x = 0; x < w; x++)
{
u8* ptr = &font->face->glyph->bitmap.buffer[x + y * w];
px[(x + y * w) * 4] = (*ptr) ? color->r : 0;
px[(x + y * w) * 4 + 1] = (*ptr) ? color->g : 0;
px[(x + y * w) * 4 + 2] = (*ptr) ? color->b : 0;
px[(x + y * w) * 4 + 3] = (*ptr) ? color->a : 0;
}
}
u32 tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, px);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glBindTexture(GL_TEXTURE_2D, 0);
FT_Done_Glyph(glyph);
free(px);
font->glyph_tex[i] = tex;
font->coord[i].x = font->face->glyph->advance.x >> 6;
font->coord[i].y = h - (font->face->glyph->metrics.horiBearingY >> 6); // to move down the glyphs with a long bottom
font->coord[i].w = w;
font->coord[i].h = h;
}
goto *end;
END_ERR_0 :
free(font);
font = NULL;
END :
return font;
}
All ASCII character are loaded in any case. If you don't know how, I can load the extended ASCII, it's enough for me.
Solution :
Just change the string encoding like this :
"string" => U"string"