如何获取准确的TTF_RenderText纹理大小而无填充或空白

时间:2019-06-11 16:22:19

标签: c++ sdl-ttf

我正在基于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_GlyphMetrics函数计算由TTF渲染的文本的宽度和高度

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)处,为什么两个轴上都存在空格?

0 个答案:

没有答案