Utility/TextDrawer: Expose lines
This commit is contained in:
parent
736b31af1b
commit
38da351e9b
|
|
@ -22,6 +22,7 @@ namespace Nz
|
|||
{
|
||||
public:
|
||||
struct Glyph;
|
||||
struct Line;
|
||||
|
||||
AbstractTextDrawer() = default;
|
||||
virtual ~AbstractTextDrawer();
|
||||
|
|
@ -31,15 +32,24 @@ namespace Nz
|
|||
virtual std::size_t GetFontCount() const = 0;
|
||||
virtual const Glyph& GetGlyph(std::size_t index) const = 0;
|
||||
virtual std::size_t GetGlyphCount() const = 0;
|
||||
virtual const Line& GetLine(std::size_t index) const = 0;
|
||||
virtual std::size_t GetLineCount() const = 0;
|
||||
|
||||
struct Glyph
|
||||
{
|
||||
Color color;
|
||||
Rectf bounds;
|
||||
Rectui atlasRect;
|
||||
Vector2f corners[4];
|
||||
AbstractImage* atlas;
|
||||
bool flipped;
|
||||
};
|
||||
|
||||
struct Line
|
||||
{
|
||||
Rectf bounds;
|
||||
std::size_t glyphIndex;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@ namespace Nz
|
|||
std::size_t GetFontCount() const override;
|
||||
const Glyph& GetGlyph(std::size_t index) const override;
|
||||
std::size_t GetGlyphCount() const override;
|
||||
const Line& GetLine(std::size_t index) const override;
|
||||
std::size_t GetLineCount() const override;
|
||||
UInt32 GetStyle() const;
|
||||
const String& GetText() const;
|
||||
|
||||
|
|
@ -68,6 +70,7 @@ namespace Nz
|
|||
NazaraSlot(Font, OnFontRelease, m_fontReleaseSlot);
|
||||
|
||||
mutable std::vector<Glyph> m_glyphs;
|
||||
mutable std::vector<Line> m_lines;
|
||||
Color m_color;
|
||||
FontRef m_font;
|
||||
mutable Rectf m_workingBounds;
|
||||
|
|
|
|||
|
|
@ -102,6 +102,24 @@ namespace Nz
|
|||
return m_glyphs.size();
|
||||
}
|
||||
|
||||
const AbstractTextDrawer::Line& SimpleTextDrawer::GetLine(std::size_t index) const
|
||||
{
|
||||
NazaraAssert(index < m_lines.size(), "Line index out of range");
|
||||
|
||||
if (!m_glyphUpdated)
|
||||
UpdateGlyphs();
|
||||
|
||||
return m_lines[index];
|
||||
}
|
||||
|
||||
std::size_t SimpleTextDrawer::GetLineCount() const
|
||||
{
|
||||
if (!m_glyphUpdated)
|
||||
UpdateGlyphs();
|
||||
|
||||
return m_lines.size();
|
||||
}
|
||||
|
||||
UInt32 SimpleTextDrawer::GetStyle() const
|
||||
{
|
||||
return m_style;
|
||||
|
|
@ -217,10 +235,16 @@ namespace Nz
|
|||
m_bounds.MakeZero();
|
||||
m_colorUpdated = true;
|
||||
m_drawPos.Set(0, m_characterSize); //< Our draw "cursor"
|
||||
m_lines.clear();
|
||||
m_glyphs.clear();
|
||||
m_glyphUpdated = true;
|
||||
m_previousCharacter = 0;
|
||||
m_workingBounds.MakeZero(); //< Compute bounds as float to speedup bounds computation (as casting between floats and integers is costly)
|
||||
|
||||
if (m_font)
|
||||
m_lines.emplace_back(Line{Rectf(0.f, 0.f, 0.f, m_font->GetSizeInfo(m_characterSize).lineHeight), 0});
|
||||
else
|
||||
m_lines.emplace_back(Line{Rectf::Zero(), 0});
|
||||
}
|
||||
|
||||
void SimpleTextDrawer::ConnectFontSlots()
|
||||
|
|
@ -271,6 +295,13 @@ namespace Nz
|
|||
break;
|
||||
|
||||
case '\n':
|
||||
if (!m_glyphs.empty())
|
||||
{
|
||||
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;
|
||||
|
|
@ -343,6 +374,7 @@ namespace Nz
|
|||
glyph.corners[3].Set(glyph.bounds.GetCorner(RectCorner_RightBottom));
|
||||
}
|
||||
|
||||
m_lines.back().bounds.ExtendTo(glyph.bounds);
|
||||
|
||||
if (!m_workingBounds.IsValid())
|
||||
m_workingBounds.Set(glyph.bounds);
|
||||
|
|
|
|||
Loading…
Reference in New Issue