2017-04-07 4 views
0

Ich habe einen Code geerbt, bei dem der Autor mit FreeType und OpenGL Text (nicht unbedingt in der Monospace-Schriftart) druckt.Wie bekomme ich die Textbreite in FreeType?

Ich muss gedruckte Textbreite berechnen, damit ich es richtig ausrichten kann. Hier

ist der Code, den er schrieb:

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

Here ist die Freetype-Quelle mit print Funktion.

konnte ich nicht glauben, von irgendeiner Weise durch Modifizieren print Funktion die Textbreite zu erhalten, und ich versuchte init Funktion der Schrift Bearbeitung (auch in der genannten Datei) face->glyph->metrics.width zurückzukehren, aber es gab eine Ausnahme sagen, dass face->glyph null ist. Aber ich sollte nicht einmal versuchen, Quellen von Bibliotheken zu bearbeiten.

Da ich keine Ahnung habe, wie man die Textbreite bekommt, überlege ich irgendwie, den Text zu drucken, die Breite dessen, was gedruckt wurde, zu drucken und etwas darüber zu drucken. Irgendwelche Ideen dazu vielleicht?

+0

Soweit ich mich erinnern kann, sind Sie auf dem richtigen Weg. Sie müssen den Text drucken, dafür können Sie einen Offscreen-Puffer verwenden. Es sollte eine Möglichkeit geben, die Breite des Drucks in Pixeln zu erhalten. – Jay

Antwort

2

Wenn Sie auf die Verwendung lateinischer Zeichen beschränkt sind, hier ist eine einfache und schmutzige Art, es zu tun.

Sie über Glyphen laufen kann, jede Glyphe laden und dann den Begrenzungsrahmen berechnen:

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; 

} 

aber wenn Sie mehr es professionell machen wollen, ich glaube, Sie verwenden HarfBuzz müssen (oder eine komplexe Textbibliothek Gestaltung). Es ist eine One-Size-All-for-All-Lösung, das heißt, sobald Sie es kompiliert haben, können Sie es verwenden, um nicht nur lateinische Strings, sondern auch Unicode-Strings zu zeichnen und zu messen. Ich empfehle dringend, dieses zu verwenden.