Utility/SimpleTextDrawer: Fix handling of whitespace glyphs

This commit is contained in:
Lynix 2016-12-03 00:37:02 +01:00
parent fd196cf0ae
commit 1794c83a32
1 changed files with 23 additions and 16 deletions

View File

@ -292,20 +292,8 @@ namespace Nz
switch (character) switch (character)
{ {
case ' ': case ' ':
advance = sizeInfo.spaceAdvance;
break;
case '\n': case '\n':
if (!m_glyphs.empty()) advance = sizeInfo.spaceAdvance;
{
Glyph& glyph = m_glyphs.back();
m_lines.back().bounds.ExtendTo(glyph.bounds);
}
m_lines.emplace_back(Line{Rectf(0.f, m_drawPos.y, 0.f, sizeInfo.lineHeight), m_glyphs.size()});
advance = 0;
m_drawPos.x = 0;
m_drawPos.y += sizeInfo.lineHeight;
break; break;
case '\t': case '\t':
@ -318,8 +306,6 @@ namespace Nz
} }
Glyph glyph; Glyph glyph;
glyph.color = m_color;
if (!whitespace) if (!whitespace)
{ {
const Font::Glyph& fontGlyph = m_font->GetGlyph(m_characterSize, m_style, character); const Font::Glyph& fontGlyph = m_font->GetGlyph(m_characterSize, m_style, character);
@ -330,6 +316,7 @@ namespace Nz
glyph.atlas = m_font->GetAtlas()->GetLayer(fontGlyph.layerIndex); glyph.atlas = m_font->GetAtlas()->GetLayer(fontGlyph.layerIndex);
glyph.atlasRect = fontGlyph.atlasRect; glyph.atlasRect = fontGlyph.atlasRect;
glyph.color = m_color;
glyph.flipped = fontGlyph.flipped; glyph.flipped = fontGlyph.flipped;
if (fontGlyph.requireFauxBold) if (fontGlyph.requireFauxBold)
@ -367,12 +354,31 @@ namespace Nz
{ {
glyph.atlas = nullptr; glyph.atlas = nullptr;
glyph.bounds.Set(m_drawPos.x - advance, m_drawPos.y - sizeInfo.lineHeight, float(advance), sizeInfo.lineHeight); glyph.bounds.Set(m_drawPos.x, m_drawPos.y, float(advance), sizeInfo.lineHeight);
glyph.corners[0].Set(glyph.bounds.GetCorner(RectCorner_LeftTop)); glyph.corners[0].Set(glyph.bounds.GetCorner(RectCorner_LeftTop));
glyph.corners[1].Set(glyph.bounds.GetCorner(RectCorner_RightTop)); glyph.corners[1].Set(glyph.bounds.GetCorner(RectCorner_RightTop));
glyph.corners[2].Set(glyph.bounds.GetCorner(RectCorner_LeftBottom)); glyph.corners[2].Set(glyph.bounds.GetCorner(RectCorner_LeftBottom));
glyph.corners[3].Set(glyph.bounds.GetCorner(RectCorner_RightBottom)); glyph.corners[3].Set(glyph.bounds.GetCorner(RectCorner_RightBottom));
switch (character)
{
case '\n':
{
if (!m_glyphs.empty())
{
Glyph& glyph = m_glyphs.back();
m_lines.back().bounds.ExtendTo(glyph.bounds);
}
advance = 0;
m_drawPos.x = 0;
m_drawPos.y += sizeInfo.lineHeight;
m_lines.emplace_back(Line{Rectf(0.f, sizeInfo.lineHeight * m_lines.size(), 0.f, sizeInfo.lineHeight), m_glyphs.size() + 1});
break;
}
}
} }
m_lines.back().bounds.ExtendTo(glyph.bounds); m_lines.back().bounds.ExtendTo(glyph.bounds);
@ -385,6 +391,7 @@ namespace Nz
m_drawPos.x += advance; m_drawPos.x += advance;
m_glyphs.push_back(glyph); m_glyphs.push_back(glyph);
} }
m_lines.back().bounds.ExtendTo(m_glyphs.back().bounds);
m_bounds.Set(Rectf(std::floor(m_workingBounds.x), std::floor(m_workingBounds.y), std::ceil(m_workingBounds.width), std::ceil(m_workingBounds.height))); m_bounds.Set(Rectf(std::floor(m_workingBounds.x), std::floor(m_workingBounds.y), std::ceil(m_workingBounds.width), std::ceil(m_workingBounds.height)));
} }