Как добиться хорошей высоты текста для freetypegl? - PullRequest
0 голосов
/ 25 ноября 2018

Я борюсь с расчетами 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, оно будет охватывать всю букву.

проблема проявляется, когда в тексте есть символы типа: @, [, ]

его высота слишком велика

enter image description here

она должна быть немного ниже, например:

enter image description here

и это было бы идеально.

Как мне этого добиться?

...