Как получить точный размер текстуры TTF_RenderText без отступов или пробелов - PullRequest
0 голосов
/ 11 июня 2019

Я работаю над библиотекой на основе sdl2, чтобы создать собственную систему заполнения текста, но я не могу понять, как получить точный размер текстуры, возвращаемый TTF_RenderText_ Solid / Shaded / Blended.

Я уже пытался получить размер текста с TTF_SizeText, но он возвращает тот же результат, что и SDL_QueryTexture, и этот результат не идеально подходит.

https://i.ibb.co/1R34R5T/capture.png

Я также пробовалчтобы изменить положение и изменить его размер, но напрасно кажется, что есть множитель, зависящий от размера шрифта.

Для этого я создал класс TextSprite, вот как я его рисую:

void TextSprite::draw(){
    SDL_Rect tmp = {m_pos.x, m_pos.y, m_size.w, m_size.h};
    SDL_SetRenderDrawColor(g_manager->getContext().renderer, 255, 255, 255, 255);
    //Bounds rect for debug
    SDL_RenderDrawRect(g_manager->getContext().renderer, &tmp);

    SDL_RenderCopyEx(g_manager->getContext().renderer, m_texture, 0, &tmp, 0, 0, (SDL_RendererFlip)m_flip);
}

А вот мой конструктор:

TextSprite::TextSprite(std::string text, Pos pos, Size size, Font &font, Color color, int px, bool isEnabled, int zIndex): AbstractSprite(pos, {size.w-2, size.h-2}, isEnabled, zIndex){
    m_text = text;
    m_px = px;
    m_font = &font;
    m_color = color;
    loadText();
}
void TextSprite::loadText(){
    m_texture = TTF_TextureRenderText_Solid(g_manager->getContext().renderer, m_text, m_font->getFont(m_px), {(Uint8)m_color.r, (Uint8)m_color.g, (Uint8)m_color.b, (Uint8)m_color.a});
    TTF_SizeUTF8(m_font->getFont(m_px), m_text.c_str(), &m_size.w, &m_size.h);
}

Я бы хотел получить точные границы текста TTF для того, чтобы самостоятельно управлять отступами и выделять поля.Есть ли способ получить размер, подобный этому:

https://i.ibb.co/nsDXXjW/capture1.png и добавить некоторые отступы и поля?

Редактировать 1:

Я создалфункция, которая вычисляет ширину и высоту текста, отображаемого TTF, используя функции как TTF_GlyphMetrics

Size GetTextSize(Font &font, std::string text, int px){
    Size size;
    int maxH(0);
    for(int i(0); i<text.size(); i++){
        int xmin(0), xmax(0);
        int ymin(0), ymax(0);
        int advance(0);
        //Get metrics of each char
        TTF_GlyphMetrics(font.getFont(px), text[i], &xmin, &xmax, &ymin, &ymax, &advance);
        int width(xmax-xmin);
        if(i > 0 && i < text.size()){
            size.w+=advance-xmin;
        }
        else{
            size.w+=width;
        }
        //Keep the highest height
        maxH = std::max(maxH, ymax-ymin);
    }
    size.h = maxH;
    // TTF_SizeText(font.getFont(px), text.c_str(), &size.w, &size.h);
    return size;
}

Кажется, что работает с прецедентным шрифтом, который я использовал:

https://i.ibb.co/XWqMhYH/capture-2.png

, но по некоторым причинам он не работает с другими шрифтами, такими как DejaVuSans и LemonMilk:

LemonMilk: https://i.ibb.co/4jmccbf/capture-3.png

DejaVuSans: https://i.ibb.co/Gx8kF6Y/capture-4.png

Почему текст не помещен в (0, 0) и почему на двух осях есть пробелы?

...