我已经尝试使用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 并添加一些填充和边距?
我创建了一个函数,该函数使用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)处,为什么两个轴上都存在空格?