2017-04-07 14 views
0

필자가 FreeType과 OpenGL을 사용하여 일부 텍스트를 인쇄 할 때 코드를 계승했습니다 (글꼴이 모노 스페이스 글꼴 일 필요는 없음).FreeType에서 텍스트 폭을 얻는 방법은 무엇입니까?

올바르게 정렬 할 수 있도록 인쇄 된 텍스트 너비를 계산해야합니다.

freetype::font_data font; 
font.init(fontPath.c_str(), fontSize); 
freetype::print(font, x, y, "%s", str.c_str()); 

Hereprint 기능을 가진 FreeType에서 소스입니다 : 여기

그가 쓴 코드입니다.

나는 print 기능을 수정하여 텍스트 폭을 얻을 수있는 방법을 생각할 수 없었다 나는 face->glyph->metrics.width을 반환 (도 언급 한 파일) 글꼴의 init 기능 편집을 시도했지만 face->glyph가 null 없다는 예외가 있었다. 그러나 나는 심지어 도서관의 출처를 편집하려고 노력해야한다고 생각하지 않는다.

텍스트 너비를 얻는 방법에 대한 단서가 없기 때문에 텍스트를 인쇄하고 인쇄 된 너비와 그 위에 뭔가를 인쇄하는 것을 고려하고 있습니다. 그 아이디어가 있을까요?

+0

내가 기억하는 것으로부터, 당신은 올바른 길을 가고 있습니다. 텍스트를 인쇄해야합니다.이 경우 화면 버퍼를 사용할 수 없습니다. 인쇄 폭을 픽셀 단위로 가져 오는 방법이 있어야합니다. – Jay

답변

2

라틴 문자를 사용하는 경우 여기에 간단하고 더러운 방법이 있습니다.

당신이 그리 반복 각각의 문양을 넣은 다음 경계 상자 계산할 수 있습니다

int xmx, xmn, ymx, ymn; 

xmn = ymn = INT_MAX; 
xmx = ymx = INT_MIN; 

FT_GlyphSlot slot = face->glyph; /* a small shortcut */ 
int   pen_x, pen_y, n; 


... initialize library ... 
... create face object ... 
... set character size ... 

pen_x = x; 
pen_y = y; 

for (n = 0; n < num_chars; n++) 
{ 
    FT_UInt glyph_index; 


    /* retrieve glyph index from character code */ 
    glyph_index = FT_Get_Char_Index(face, text[n]); 

    /* load glyph image into the slot (erase previous one) */ 
    error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); 
    if (error) 
    continue; /* ignore errors */ 

    /* convert to an anti-aliased bitmap */ 
    error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL); 
    if (error) 
    continue; 

    /* now, draw to our target surface */ 
    my_draw_bitmap(&slot->bitmap, 
        pen_x + slot->bitmap_left, 
        pen_y - slot->bitmap_top); 

    if (pen_x < xmn) xmn = pen_x; 
    if (pen_y < ymn) ymn = pen_y; 

    /* increment pen position */ 
    pen_x += slot->advance.x >> 6; 
    pen_y += slot->advance.y >> 6; /* not useful for now */ 

    if (pen_x > xmx) xmx = pen_x; 
    if (pen_y > ymx) ymx = pen_y; 

} 

을하지만 당신은 더 전문적으로 수행하려는 경우, 당신이에 HarfBuzz 사용해야합니다 생각 (또는 복잡한 텍스트 라이브러리를 형성). 그것은 하나의 크기에 맞는 모든 soultion입니다. 즉, 일단 컴파일하면, 라틴 문자열뿐만 아니라 유니 코드 문자열도 추출하고 측정 할 수 있습니다. 나는 이것을 강력히 추천한다.