1

I trying to use FreeType2 with OpenGL and I can only write the spanish interogation mark when I write something. Here is the loop where I load all the glyphs :

for(uint i = ' '; i <= '~'; i++)
{
    FT_Glyph glyph;
    u32 index = FT_Get_Char_Index(font->face, i);

    if(FT_Load_Char(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++)
        {
            for(u8 off = 0; off < 4; off++)
                px[(x + y * w) * 4 + off] = font->face->glyph->bitmap.buffer[x + y * w];
        }
    }

    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 = w;
    font->coord[i].y = h;
    font->coord[i].w = font->face->glyph->advance.x >> 6;
    font->coord[i].h = font->face->glyph->metrics.horiBearingY >> 6;
}

and to display :

uint len = strlen(str);

for(const char* ptr = str; len--; ptr++)
{
    uint w = font->coord[(u32) *ptr].x;
    uint h = font->coord[(u32) *ptr].y;
    ENG_ArrayVertex px[] = { x, y,  x + w, y,  x + w, y + h,  x, y,  x, y + h,  x + w, y + h };
    ENG_ArrayTextureCoord texcoord[12];
    texcoord[0] = 0.0;
    texcoord[1] = 0.0;
    texcoord[2] = 1.0;
    texcoord[3] = 0.0;
    texcoord[4] = 1.0;
    texcoord[5] = 1.0;
    texcoord[6] = 0.0;
    texcoord[7] = 0.0;
    texcoord[8] = 0.0;
    texcoord[9] = 1.0;
    texcoord[10] = 1.0;
    texcoord[11] = 1.0;
    ENG_VRAMAddr* addr = ENG_AllocVRAM(24 * sizeof(ENG_ArrayVertex), ENG_VRAM_UPDATE_RARELY);
    ENG_VRAMUse(addr);
    ENG_VRAMSend(ENG_ArrayVertex, 0, 12, px);
    ENG_VRAMSend(ENG_ArrayVertex, 12 * sizeof(ENG_ArrayVertex), 12, texcoord);
    ENG_VRAMUse(NULL);
    ENG_VRAMFuncList* flist = ENG_AllocVRAMFuncList();
    ENG_VRAMFuncListUse(flist);
    ENG_VRAMUse(addr);
    ENG_SetVRAMID(0, ENG_SHADER_ID_VERTEX, 2, px);
    ENG_SetVRAMID(12 * sizeof(ENG_ArrayVertex), ENG_SHADER_ID_TEXTURE_COORD, 2, texcoord);
    ENG_ArrayEnable(ENG_SHADER_ID_VERTEX);
    ENG_ArrayEnable(ENG_SHADER_ID_TEXTURE_COORD);
    glBindTexture(GL_TEXTURE_2D, font->glyph_tex[(u16) *ptr]);

    ENG_ShaderUse(ENG_GetConfigShaderTexture(ENG_GetGlobConfig()));
        ENG_ShaderSendMatrix(ENG_GetConfigShader(ENG_GetGlobConfig()), "scale", ENG_GetConfigMatrixOrtho(ENG_GetGlobConfig()));
        ENG_ArrayDraw(ENG_ARRAY_DRAW_TRIANGLES, 0, 6);
    ENG_ShaderUse(NULL);

    ENG_VRAMFuncListUse(NULL);
    ENG_VRAMUse(NULL);
    ENG_FreeVRAMFuncList(flist);
    ENG_FreeVRAM(addr);
    x += w;
}

I use the C language on Windows 8.1 ( if you know the way we can make a portable program, I'd rather ).

zonn
  • 115
  • 7
  • You may be interested to use this library: https://code.google.com/p/freetype-gl/ – Klathzazt May 16 '15 at 15:08
  • Thank you, it looks a good library but do you now how I can get the mingw version because I never tried to compile any library ? – zonn May 20 '15 at 20:59
  • I finelly found, just replace a function : FT_Load_Char -> FT_Load_Glyph – zonn May 27 '15 at 14:31

0 Answers0