¹öÆÛ¿¡ ÆùÆ® À̹ÌÁö ÀúÀå

ÆùÆ®¸¦ ij½ÌÇϱâ À§ÇØ ºñÆ®¸Ê ÆùÆ®¸¦ ¹öÆÛ¿¡ ÀúÀåÇÑ´Ù.
ÆùÆ® ij½Ì ±¸ÇöÀº ¾Æ´Ï°í ¹öÆÛ¿¡ ÀúÀå½Ã À̹ÌÁö°¡ ¾î¶² ¸ð¾çÀÏÁö ±Ã±ÝÇÏ°í È®ÀÎÇϱâ À§Çؼ­ÀÌ´Ù.

ÀúÀåµÈ À̹ÌÁö¸¦ ¸ÕÀú º¸ÀÚ.


ºñÆ®¸Ê¸¸ ÀúÀåÇϱ⠶§¹®¿¡ base lineÀ» °í·ÁÇÏÁö ¾Ê±â ¶§¹®¿¡ ÆùÆ®°¡ À§¸¦ ±âÁØÀ¸·Î Á¤·Ä µÇ¾î ÀÖ´Ù.

int StringBuff::DrawFont(char* buff, int width, int height, int x, int y, FT_Face& face, TCHAR ch)
{
    //±Û¸®ÇÁ À妽º ±¸ÇÔ
    int index = FT_Get_Char_Index(face, ch);

    //·Îµå ±Û¸®ÇÁ
    int error = FT_Load_Glyph(face, index, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP);
    if(error)
        return error;

    //·£´õ¸µ
    error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
    if(error)
        return error;

    //È­¸é¿¡ Ãâ·ÂÇϱâ À§ÇØ bitmapÀÇ width, rows¸¦ ±¸ÇÑ´Ù.
    int bitmapWidth = face->glyph->bitmap.width;
    int bitmapHeight = face->glyph->bitmap.rows;
    char* bitmapBuff = (char*)face->glyph->bitmap.buffer;
    int bitmapLeft = face->glyph->bitmap_left;
    int bitmapTop = face->glyph->bitmap_top;

    if(( bitmapWidth  + x + bitmapLeft) > width)
        return 1;  //ÆùÆ®°¡ width À̹ÌÁö Å©±âº¸´Ù Å©´Ù.

    
    for (int n = 0 ; n < bitmapHeight; n++)
    {
        for(int m = 0; m < bitmapWidth; m++)
        {
            buff[width*(n + y) + m + x]  = bitmapBuff[bitmapWidth*n + m];
        }
    }

    return 0;
}

int StringBuff::WriteGlyphString(FT_Face& face, const char* szPath, TCHAR *str)
{
    int width = 1024;
    int height = 1024;
    char* buff = new char[1024*1024];
    memset(buff, 0, 1024*1024);

    Point2<int> advance = {0, 0}, pos = {0, 0};
    int len = (int)_tcslen(str);

    for(int n = 0; n < len; n++)
    {
        int res = DrawFont(buff, width, height, pos.x, pos.y, face, str[n]);
        advance.x = face->glyph->bitmap.width;
        advance.y = face->glyph->bitmap.rows;

        if(res == 1)
        {
            pos.x = 0;
            pos.y += advance.y;
            DrawFont(buff, width, height, pos.x, pos.y, face, str[n]);
        }
        pos.x += advance.x;
    }

    StringBuff::WritePGM(szPath, width, height, (const char *)buff);

    delete [] buff;
    return 0;
}

¿©±â¼­ WriteGlyphString, DrawFont´Â ij½Ì ¹öÆÛ¿¡ ÆùÆ®¸¦ ±×¸°´Ù.

DrawFont ÇÔ¼ö¿¡¼­ ¿Ü°û¼± ±×·ÁÁø ºñÆ®¸ÊÀ» ij½Ì ¹öÆÛ·Î º¹»çÇÏ°í ÀÖ´Ù.

    for (int n = 0 ; n < bitmapHeight; n++)
    {
        for(int m = 0; m < bitmapWidth; m++)
        {
            buff[width*(n + y) + m + x]  = bitmapBuff[bitmapWidth*n + m];
        }
    }

È£Ãâ ÇÔ¼ö ¼ø¼­´Â SaveFont > WriteGlyphString > DrawFont ·Î °£´ÜÇϱ⠶§¹®¿¡ ÀÌÀåÀº º°µµÀÇ ¼³¸íÀº ÇÏÁö ¾Ê´Â´Ù.

¼Ò½º : 03_string_buff.cpp