Utility/SimpleTextDrawer: Whitespaces are now glyphs too

This commit is contained in:
Lynix 2016-10-28 17:44:59 +02:00
parent a4eccc9fac
commit 736b31af1b
2 changed files with 58 additions and 42 deletions

View File

@ -149,6 +149,8 @@ namespace Nz
for (unsigned int i = 0; i < glyphCount; ++i)
{
const AbstractTextDrawer::Glyph& glyph = drawer.GetGlyph(i);
if (!glyph.atlas)
continue;
Texture* texture = static_cast<Texture*>(glyph.atlas);
if (lastTexture != texture)

View File

@ -263,19 +263,21 @@ namespace Nz
m_previousCharacter = character;
bool whitespace = true;
int advance = 0;
switch (character)
{
case ' ':
m_drawPos.x += sizeInfo.spaceAdvance;
advance = sizeInfo.spaceAdvance;
break;
case '\n':
advance = 0;
m_drawPos.x = 0;
m_drawPos.y += sizeInfo.lineHeight;
break;
case '\t':
m_drawPos.x += sizeInfo.spaceAdvance * 4;
advance = sizeInfo.spaceAdvance * 4;
break;
default:
@ -283,57 +285,69 @@ namespace Nz
break;
}
if (whitespace)
continue; // White spaces are blanks and invisible, move the draw position and skip the rest
const Font::Glyph& fontGlyph = m_font->GetGlyph(m_characterSize, m_style, character);
if (!fontGlyph.valid)
continue; // Glyph failed to load, just skip it (can't do much)
Glyph glyph;
glyph.atlas = m_font->GetAtlas()->GetLayer(fontGlyph.layerIndex);
glyph.atlasRect = fontGlyph.atlasRect;
glyph.color = m_color;
glyph.flipped = fontGlyph.flipped;
int advance = fontGlyph.advance;
Rectf bounds(fontGlyph.aabb);
bounds.x += m_drawPos.x;
bounds.y += m_drawPos.y;
if (fontGlyph.requireFauxBold)
if (!whitespace)
{
// Let's simulate bold by enlarging the glyph (not a neat idea, but should work)
Vector2f center = bounds.GetCenter();
const Font::Glyph& fontGlyph = m_font->GetGlyph(m_characterSize, m_style, character);
if (!fontGlyph.valid)
continue; // Glyph failed to load, just skip it (can't do much)
// Enlarge by 10%
bounds.width *= 1.1f;
bounds.height *= 1.1f;
advance = fontGlyph.advance;
// Replace it at the correct height
Vector2f offset(bounds.GetCenter() - center);
bounds.y -= offset.y;
glyph.atlas = m_font->GetAtlas()->GetLayer(fontGlyph.layerIndex);
glyph.atlasRect = fontGlyph.atlasRect;
glyph.flipped = fontGlyph.flipped;
// Adjust advance (+10%)
advance += advance / 10;
if (fontGlyph.requireFauxBold)
{
// Let's simulate bold by enlarging the glyph (not a neat idea, but should work)
Vector2f center = glyph.bounds.GetCenter();
// Enlarge by 10%
glyph.bounds.width *= 1.1f;
glyph.bounds.height *= 1.1f;
// Replace it at the correct height
Vector2f offset(glyph.bounds.GetCenter() - center);
glyph.bounds.y -= offset.y;
// Adjust advance (+10%)
advance += advance / 10;
}
glyph.bounds.Set(fontGlyph.aabb);
glyph.bounds.x += m_drawPos.x;
glyph.bounds.y += m_drawPos.y;
// We "lean" the glyph to simulate italics style
float italic = (fontGlyph.requireFauxItalic) ? 0.208f : 0.f;
float italicTop = italic * glyph.bounds.y;
float italicBottom = italic * glyph.bounds.GetMaximum().y;
glyph.corners[0].Set(glyph.bounds.x - italicTop, glyph.bounds.y);
glyph.corners[1].Set(glyph.bounds.x + glyph.bounds.width - italicTop, glyph.bounds.y);
glyph.corners[2].Set(glyph.bounds.x - italicBottom, glyph.bounds.y + glyph.bounds.height);
glyph.corners[3].Set(glyph.bounds.x + glyph.bounds.width - italicBottom, glyph.bounds.y + glyph.bounds.height);
}
else
{
glyph.atlas = nullptr;
glyph.bounds.Set(m_drawPos.x - advance, m_drawPos.y - sizeInfo.lineHeight, float(advance), sizeInfo.lineHeight);
glyph.corners[0].Set(glyph.bounds.GetCorner(RectCorner_LeftTop));
glyph.corners[1].Set(glyph.bounds.GetCorner(RectCorner_RightTop));
glyph.corners[2].Set(glyph.bounds.GetCorner(RectCorner_LeftBottom));
glyph.corners[3].Set(glyph.bounds.GetCorner(RectCorner_RightBottom));
}
// We "lean" the glyph to simulate italics style
float italic = (fontGlyph.requireFauxItalic) ? 0.208f : 0.f;
float italicTop = italic * bounds.y;
float italicBottom = italic * bounds.GetMaximum().y;
glyph.corners[0].Set(bounds.x - italicTop, bounds.y);
glyph.corners[1].Set(bounds.x + bounds.width - italicTop, bounds.y);
glyph.corners[2].Set(bounds.x - italicBottom, bounds.y + bounds.height);
glyph.corners[3].Set(bounds.x + bounds.width - italicBottom, bounds.y + bounds.height);
if (!m_workingBounds.IsValid())
m_workingBounds.Set(glyph.corners[0]);
for (unsigned int i = 0; i < 4; ++i)
m_workingBounds.ExtendTo(glyph.corners[i]);
m_workingBounds.Set(glyph.bounds);
else
m_workingBounds.ExtendTo(glyph.bounds);
m_drawPos.x += advance;
m_glyphs.push_back(glyph);