mirror of https://github.com/AxioDL/metaforce.git
Better use of TextView resources
This commit is contained in:
parent
70bce7ba2e
commit
00945a44d7
|
@ -60,6 +60,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
size_t m_capacity;
|
size_t m_capacity;
|
||||||
|
size_t m_curSize = 0;
|
||||||
hecl::VertexBufferPool<RenderGlyph>::Token m_glyphBuf;
|
hecl::VertexBufferPool<RenderGlyph>::Token m_glyphBuf;
|
||||||
boo::ObjToken<boo::IVertexFormat> m_vtxFmt; /* OpenGL only */
|
boo::ObjToken<boo::IVertexFormat> m_vtxFmt; /* OpenGL only */
|
||||||
boo::ObjToken<boo::IShaderDataBinding> m_shaderBinding;
|
boo::ObjToken<boo::IShaderDataBinding> m_shaderBinding;
|
||||||
|
|
|
@ -170,7 +170,6 @@ void MultiLineTextView::typesetGlyphs(std::string_view str,
|
||||||
}
|
}
|
||||||
|
|
||||||
m_width = 0;
|
m_width = 0;
|
||||||
m_lines.clear();
|
|
||||||
size_t rem = str.size() + 1;
|
size_t rem = str.size() + 1;
|
||||||
const utf8proc_uint8_t* it = reinterpret_cast<const utf8proc_uint8_t*>(str.data());
|
const utf8proc_uint8_t* it = reinterpret_cast<const utf8proc_uint8_t*>(str.data());
|
||||||
|
|
||||||
|
@ -191,6 +190,7 @@ void MultiLineTextView::typesetGlyphs(std::string_view str,
|
||||||
rem = str.size() + 1;
|
rem = str.size() + 1;
|
||||||
it = reinterpret_cast<const utf8proc_uint8_t*>(str.data());
|
it = reinterpret_cast<const utf8proc_uint8_t*>(str.data());
|
||||||
const utf8proc_uint8_t* beginIt = it;
|
const utf8proc_uint8_t* beginIt = it;
|
||||||
|
size_t lineIt = 0;
|
||||||
|
|
||||||
while (rem)
|
while (rem)
|
||||||
{
|
{
|
||||||
|
@ -198,10 +198,12 @@ void MultiLineTextView::typesetGlyphs(std::string_view str,
|
||||||
utf8proc_ssize_t sz = utf8proc_iterate(it, -1, &ch);
|
utf8proc_ssize_t sz = utf8proc_iterate(it, -1, &ch);
|
||||||
if (ch == '\n' || ch == '\0')
|
if (ch == '\n' || ch == '\0')
|
||||||
{
|
{
|
||||||
m_lines.emplace_back(new TextView(m_viewSystem, *this, m_fontAtlas, m_align, m_lineCapacity));
|
TextView& tv = (lineIt < m_lines.size()) ? *m_lines[lineIt] :
|
||||||
m_lines.back()->typesetGlyphs(std::string((char*)beginIt, it - beginIt), defaultColor);
|
*m_lines.emplace_back(new TextView(m_viewSystem, *this, m_fontAtlas, m_align, m_lineCapacity));
|
||||||
m_width = std::max(m_width, m_lines.back()->nominalWidth());
|
tv.typesetGlyphs(std::string((char*)beginIt, it - beginIt), defaultColor);
|
||||||
|
m_width = std::max(m_width, tv.nominalWidth());
|
||||||
beginIt = it + 1;
|
beginIt = it + 1;
|
||||||
|
++lineIt;
|
||||||
}
|
}
|
||||||
rem -= sz;
|
rem -= sz;
|
||||||
it += sz;
|
it += sz;
|
||||||
|
@ -221,7 +223,6 @@ void MultiLineTextView::typesetGlyphs(std::wstring_view str,
|
||||||
}
|
}
|
||||||
|
|
||||||
m_width = 0;
|
m_width = 0;
|
||||||
m_lines.clear();
|
|
||||||
size_t rem = str.size() + 1;
|
size_t rem = str.size() + 1;
|
||||||
auto it = str.cbegin();
|
auto it = str.cbegin();
|
||||||
|
|
||||||
|
@ -238,15 +239,18 @@ void MultiLineTextView::typesetGlyphs(std::wstring_view str,
|
||||||
rem = str.size() + 1;
|
rem = str.size() + 1;
|
||||||
it = str.cbegin();
|
it = str.cbegin();
|
||||||
auto beginIt = it;
|
auto beginIt = it;
|
||||||
|
size_t lineIt = 0;
|
||||||
|
|
||||||
while (rem)
|
while (rem)
|
||||||
{
|
{
|
||||||
if (*it == L'\n' || *it == L'\0')
|
if (*it == L'\n' || *it == L'\0')
|
||||||
{
|
{
|
||||||
m_lines.emplace_back(new TextView(m_viewSystem, *this, m_fontAtlas, m_align, m_lineCapacity));
|
TextView& tv = (lineIt < m_lines.size()) ? *m_lines[lineIt] :
|
||||||
m_lines.back()->typesetGlyphs(std::wstring(beginIt, it), defaultColor);
|
*m_lines.emplace_back(new TextView(m_viewSystem, *this, m_fontAtlas, m_align, m_lineCapacity));
|
||||||
m_width = std::max(m_width, m_lines.back()->nominalWidth());
|
tv.typesetGlyphs(std::wstring(beginIt, it), defaultColor);
|
||||||
|
m_width = std::max(m_width, tv.nominalWidth());
|
||||||
beginIt = it + 1;
|
beginIt = it + 1;
|
||||||
|
++lineIt;
|
||||||
}
|
}
|
||||||
--rem;
|
--rem;
|
||||||
++it;
|
++it;
|
||||||
|
|
|
@ -300,7 +300,7 @@ void TextView::_commitResources(size_t capacity)
|
||||||
{
|
{
|
||||||
auto& res = rootView().viewRes();
|
auto& res = rootView().viewRes();
|
||||||
auto fontTex = m_fontAtlas.texture(res.m_factory);
|
auto fontTex = m_fontAtlas.texture(res.m_factory);
|
||||||
View::commitResources(res, [&](boo::IGraphicsDataFactory::Context& ctx) -> bool
|
View::commitResources(res, [&](boo::IGraphicsDataFactory::Context& ctx)
|
||||||
{
|
{
|
||||||
buildResources(ctx, res);
|
buildResources(ctx, res);
|
||||||
|
|
||||||
|
@ -409,7 +409,11 @@ void TextView::typesetGlyphs(std::string_view str, const zeus::CColor& defaultCo
|
||||||
{
|
{
|
||||||
UTF8Iterator it(str.begin());
|
UTF8Iterator it(str.begin());
|
||||||
size_t charLen = str.size() ? std::min(it.countTo(str.end()), m_capacity) : 0;
|
size_t charLen = str.size() ? std::min(it.countTo(str.end()), m_capacity) : 0;
|
||||||
|
if (charLen > m_curSize)
|
||||||
|
{
|
||||||
|
m_curSize = charLen;
|
||||||
_commitResources(charLen);
|
_commitResources(charLen);
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t lCh = -1;
|
uint32_t lCh = -1;
|
||||||
m_glyphs.clear();
|
m_glyphs.clear();
|
||||||
|
@ -478,7 +482,11 @@ void TextView::typesetGlyphs(std::string_view str, const zeus::CColor& defaultCo
|
||||||
void TextView::typesetGlyphs(std::wstring_view str, const zeus::CColor& defaultColor)
|
void TextView::typesetGlyphs(std::wstring_view str, const zeus::CColor& defaultColor)
|
||||||
{
|
{
|
||||||
size_t charLen = std::min(str.size(), m_capacity);
|
size_t charLen = std::min(str.size(), m_capacity);
|
||||||
|
if (charLen > m_curSize)
|
||||||
|
{
|
||||||
|
m_curSize = charLen;
|
||||||
_commitResources(charLen);
|
_commitResources(charLen);
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t lCh = -1;
|
uint32_t lCh = -1;
|
||||||
m_glyphs.clear();
|
m_glyphs.clear();
|
||||||
|
|
Loading…
Reference in New Issue