Próbuję renderować tekst za pomocą FreeType i OpenGL:
text = "fghjRT-123VWYUGHJ$@%"
I masz dwa pytania:
- Dlaczego między literami są takie dziwne spacje? (co nie tak z wyprzedzeniem?)
- Jak obliczyć najwyższą pozycję (lub pozycję początkową)? (pomiędzy żółtą ramką a znakami jest trochę odstępu. Chcę ją dołączyć do górnej ramki)
Mój kod renderowania:
/* top left position on screen to render text (yellow border) */
Vector<2> pos = params.rect.left_top();
/* adjust to bottom (how to get correct origin position?) */
pos.y() += font->char_size();
for (char ch : params.text)
{
/* contains info after freetype FT_LoadGlyph */
FontChar const* char_info = font->find_char(ch);
RectF char_rect(
pos - char_info->bearing(), /* left, top */
char_info->glyph_rect().size() /* width, height */
);
/* convert screen coordinates to OpenGL coordinates */
RectF dr = calc_coord(m_screen_size, char_rect);
/* pack position of glyph and it's texture from bitmap
* into one sequence of data
*/
Vector<16> spr_coords = pack_spr_info(dr, char_info->rect());
m_sprite_buffer.push_back(spr_coords);
/* move pen by advance */
pos.x() += char_info->advance();
}
Fragment mojego kodu ładowania glifów:
FT_GlyphSlot slot = face->glyph;
char_info->bearing() = {
slot->metrics.horiBearingX / 64.0f,
slot->metrics.horiBearingY / 64.0f
};
char_info->glyph_rect() = {
slot->metrics.horiBearingX / 64.0f, /* left */
slot->metrics.horiBearingY / 64.0f, /* top */
slot->metrics.width / 64.0f, /* width */
slot->metrics.height / 64.0f /* height */
};
char_info->advance() = slot->metrics.horiAdvance / 64.0f;
1 odpowiedź
Ok, sam znalazłem odpowiedź.
Wystąpił błąd w moich obliczeniach dla pozycji char_rect
. Właściwa droga:
RectF char_rect(
pos.x() + char_info->bearing().x(), /* left */
pos.y() - char_info->bearing().y(), /* top */
char_info->glyph_rect().size() /* width, height */
);
A sposób na znalezienie linii bazowej (początku) dostosowanego od górnej granicy:
Vector<2> pos = params.rect.left_top();
pos.y() += font->ascend(); /* move pen down on the screen */
Gdzie:
FT_Face face = ...;
font->ascend() = face->ascender / 32;
Podobne pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .