Я работаю над библиотекой на основе 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) и почему на двух осях есть пробелы?