Я борюсь с расчетами freetypegl и высоты.Я обнаружил, что Черно использовал библиотеку в своем движке Sparky, и он вычисляет ее примерно так:
float Font::GetHeight(const String& text) const
{
using namespace ftgl;
const maths::vec2& scale = m_Scale;
float min = 0.0f;
float max = 0.0f;
for (int i = 0; i < text.size(); i++)
{
texture_glyph_t* glyph = texture_font_get_glyph(m_FTFont, text[i]);
SP_ASSERT(glyph);
float height = glyph->height / scale.y;
float offset = glyph->offset_y / scale.y - height;
if (offset < min)
min = offset;
if (height > max)
max = height;
}
return abs(min) + abs(max);
}
maths::vec2 Font::GetOffsets(const String& text) const
{
using namespace ftgl;
if (text.empty())
return maths::vec2(0.0f, 0.0f);
texture_glyph_t* glyph = texture_font_get_glyph(m_FTFont, text[0]);
SP_ASSERT(glyph);
float yo = 0.0f;
const maths::vec2& scale = m_Scale;
for (int i = 0; i < text.size(); i++)
{
texture_glyph_t* glyph = texture_font_get_glyph(m_FTFont, text[i]);
SP_ASSERT(glyph);
float height = glyph->height / scale.y;
float offset = glyph->offset_y / scale.y - height;
if (offset < yo)
yo = offset;
}
return maths::vec2(glyph->offset_x / scale.x, yo);
}
, и она меня не удовлетворяет, потому что, например, [fps]
строка слишком высокая, как мне хотелось быэто будет.
мой пример кода:
// A B G R
// text = "[fps]"; position = {200.0f, 200.0f}; color = 0xffffffff
renderer2D->DrawString("[fps]", 200.0f, 0xffffffff, font);
//position X = 200.0f; position Y = 200.0f + font.getOffsets("[fps]").y
//width = font.getWidth("[fps]"; height = font.getHeight("[fps]");
// A B G R
//color = 0xff0000ff
//thickness = 0.2f
renderer2D->DrawRect(Rect(200.0f,
200.0f + font.getOffsets("[fps]").y,
font.getWidth("[fps]"),
font.getHeight("[fps]")), 0xff0000ff, 0.2f);
Я хочу, чтобы прямоугольник был вокруг текста, поэтому я добавляю смещение (которое является отрицательным) к позиции Y, потому что буквы как p, q, g
и т. д. имеют немного другую высоту, поэтому, когда я добавляю смещение Y, оно будет охватывать всю букву.
проблема проявляется, когда в тексте есть символы типа: @
, [
, ]
его высота слишком велика
она должна быть немного ниже, например:
и это было бы идеально.
Как мне этого добиться?