mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2025-10-05 22:02:38 +00:00
Fix font bounds calculation
BitmapFont::getActualWidth() is still a bit less than getStringWidth(), but won't fix that now since it shouldn't cause any issues... hopefully.
This commit is contained in:
parent
d41375d5d2
commit
26549f84b7
11 changed files with 118 additions and 73 deletions
|
@ -63,6 +63,7 @@ TTFText::TTFText(TTFFont *f) : font(f)
|
|||
h = 0;
|
||||
width = 0;
|
||||
shadow = false;
|
||||
maxW = 0;
|
||||
}
|
||||
|
||||
void TTFText::setText(const std::string &txt)
|
||||
|
@ -95,36 +96,41 @@ void TTFText::updateAlign()
|
|||
}
|
||||
}
|
||||
|
||||
float TTFText::getWidth()
|
||||
{
|
||||
return getStringWidth(originalText);
|
||||
}
|
||||
|
||||
float TTFText::getHeight()
|
||||
{
|
||||
float llx, lly, llz, urx, ury, urz;
|
||||
font->font->BBox(originalText.c_str(), llx, lly, llz, urx, ury, urz);
|
||||
return ury - lly;
|
||||
return text.size()*lineHeight;
|
||||
}
|
||||
|
||||
float TTFText::getStringWidth(const std::string& s)
|
||||
{
|
||||
float w = 0;
|
||||
std::string cp = s;
|
||||
float llx, lly, llz, urx, ury, urz;
|
||||
font->font->BBox(s.c_str(), llx, lly, llz, urx, ury, urz);
|
||||
return urx - llx;
|
||||
const char *start = cp.c_str();
|
||||
size_t begin = 0;
|
||||
for(size_t i = 0; i < cp.length(); ++i)
|
||||
{
|
||||
const char c = cp[i];
|
||||
if(c == '\n')
|
||||
{
|
||||
cp[i] = 0;
|
||||
const char *p = start + begin;
|
||||
font->font->BBox(p, llx, lly, llz, urx, ury, urz);
|
||||
w = std::max(w, urx - llx);
|
||||
cp[i] = c;
|
||||
begin = i + 1;
|
||||
}
|
||||
}
|
||||
if(begin < cp.length())
|
||||
{
|
||||
font->font->BBox(start + begin, llx, lly, llz, urx, ury, urz);
|
||||
w = std::max(w, urx - llx);
|
||||
}
|
||||
return w;
|
||||
}
|
||||
|
||||
float TTFText::getFullHeight()
|
||||
{
|
||||
/*
|
||||
float llx, lly, llz, urx, ury, urz;
|
||||
font->font->BBox(originalText.c_str(), llx, lly, llz, urx, ury, urz);
|
||||
float diff = ury - lly;
|
||||
*/
|
||||
return text.size()*lineHeight;
|
||||
}
|
||||
|
||||
void TTFText::setWidth(int width)
|
||||
void TTFText::setWidth(float width)
|
||||
{
|
||||
this->width = width;
|
||||
|
||||
|
@ -132,7 +138,7 @@ void TTFText::setWidth(int width)
|
|||
updateFormatting();
|
||||
}
|
||||
|
||||
void TTFText::setFontSize(int)
|
||||
void TTFText::setFontSize(float)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -142,12 +148,18 @@ void TTFText::updateFormatting()
|
|||
text.clear();
|
||||
int i=0;
|
||||
int sz = originalText.size();
|
||||
maxW = 0;
|
||||
for (i = 0; i < sz; i++)
|
||||
{
|
||||
if (originalText[i] == '\n')
|
||||
{
|
||||
text.push_back(originalText.substr(start, i-start));
|
||||
std::string part = originalText.substr(start, i-start);
|
||||
text.push_back(part);
|
||||
start = i+1;
|
||||
float llx, lly, llz, urx, ury, urz;
|
||||
font->font->BBox(part.c_str(), llx, lly, llz, urx, ury, urz);
|
||||
float w = urx - llx;
|
||||
maxW = std::max(maxW, w);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -156,25 +168,39 @@ void TTFText::updateFormatting()
|
|||
lastSpace = i;
|
||||
}
|
||||
float llx, lly, llz, urx, ury, urz;
|
||||
font->font->BBox(originalText.substr(start, i-start).c_str(), llx, lly, llz, urx, ury, urz);
|
||||
int w = urx - llx;
|
||||
std::string part = originalText.substr(start, i-start);
|
||||
font->font->BBox(part.c_str(), llx, lly, llz, urx, ury, urz);
|
||||
float w = urx - llx;
|
||||
|
||||
if (width != 0 && w >= width)
|
||||
{
|
||||
if (lastSpace != -1) {
|
||||
text.push_back(originalText.substr(start, lastSpace-start));
|
||||
if (lastSpace != -1)
|
||||
{
|
||||
part = originalText.substr(start, lastSpace-start);
|
||||
i = lastSpace+1;
|
||||
lastSpace = -1;
|
||||
start = i;
|
||||
}
|
||||
else {
|
||||
text.push_back(originalText.substr(start, i-start));
|
||||
}
|
||||
else
|
||||
part = originalText.substr(start, i-start);
|
||||
|
||||
text.push_back(part);
|
||||
// recalc width of remaining text after linebreak
|
||||
font->font->BBox(part.c_str(), llx, lly, llz, urx, ury, urz);
|
||||
w = urx - llx;
|
||||
}
|
||||
|
||||
maxW = std::max(maxW, w);
|
||||
}
|
||||
}
|
||||
if (i == sz)
|
||||
{
|
||||
text.push_back(originalText.substr(start, i-start));
|
||||
std::string part = originalText.substr(start, i-start);
|
||||
text.push_back(part);
|
||||
float llx, lly, llz, urx, ury, urz;
|
||||
font->font->BBox(part.c_str(), llx, lly, llz, urx, ury, urz);
|
||||
float w = urx - llx;
|
||||
maxW = std::max(maxW, w);
|
||||
}
|
||||
lineHeight = font->font->LineHeight();
|
||||
}
|
||||
|
@ -184,7 +210,7 @@ void TTFText::onUpdate(float dt)
|
|||
RenderObject::onUpdate(dt);
|
||||
}
|
||||
|
||||
int TTFText::getLineHeight()
|
||||
float TTFText::getLineHeight()
|
||||
{
|
||||
return lineHeight;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue