summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2019-06-20 10:25:54 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2019-06-20 11:06:17 +0300
commit46a1400d950a735d85fb061b1d7264f1f8d3c542 (patch)
tree41ee0e649eaab955618b07d750edb95c0fe74e1e
parentd66674bf53a572c1788ae35649539c3d381de875 (diff)
Fix memory leak from showRenderStats
Use new dynamic strings instead of registering strings to regular string table, and don't use the conversion function of the string table, as that registers the string. Task-number: QT3DS-3680 Change-Id: I930eb013538c819eac6acc06be86d287c3dfc0c9 Reviewed-by: Jari Karppinen <jari.karppinen@qt.io> Reviewed-by: Janne Koskinen <janne.p.koskinen@qt.io> Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
-rw-r--r--src/runtimerender/Qt3DSOnscreenTextRenderer.cpp14
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp7
2 files changed, 11 insertions, 10 deletions
diff --git a/src/runtimerender/Qt3DSOnscreenTextRenderer.cpp b/src/runtimerender/Qt3DSOnscreenTextRenderer.cpp
index 4b74c51..2612b7c 100644
--- a/src/runtimerender/Qt3DSOnscreenTextRenderer.cpp
+++ b/src/runtimerender/Qt3DSOnscreenTextRenderer.cpp
@@ -292,10 +292,8 @@ public:
SRenderTextureAtlasDetails RenderText(const STextRenderInfo &inText) override
{
- qt3ds::foundation::IStringTable &theStringTable(m_RenderContext->GetStringTable());
-
- const wchar_t *wText = theStringTable.GetWideStr(inText.m_Text);
- QT3DSU32 length = (QT3DSU32)wcslen(wText);
+ const QString wText = QString::fromUtf8(inText.m_Text);
+ QT3DSU32 length = QT3DSU32(wText.length());
if (length) {
STextAtlasFont *pFont = m_TextFont;
@@ -307,13 +305,13 @@ public:
// we construct triangles here
// which means character count x 6 vertices x 5 floats
QT3DSF32 *vertexData =
- (QT3DSF32 *)QT3DS_ALLOC(m_Foundation.getAllocator(),
- length * 6 * 5 * sizeof(QT3DSF32),
- "Qt3DSOnscreenTextRenderer");
+ static_cast<QT3DSF32 *>(QT3DS_ALLOC(m_Foundation.getAllocator(),
+ length * 6 * 5 * sizeof(QT3DSF32),
+ "Qt3DSOnscreenTextRenderer"));
QT3DSF32 *bufPtr = vertexData;
if (vertexData) {
for (size_t i = 0; i < length; ++i) {
- pEntry = &pFont->m_AtlasEntries.find(wText[i])->second;
+ pEntry = &pFont->m_AtlasEntries.find(wText[uint(i)].unicode())->second;
if (pEntry) {
x1 = advance + pEntry->m_xOffset;
diff --git a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
index 0b3f665..c40ff55 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp
@@ -1851,9 +1851,11 @@ namespace render {
ITextTextureAtlas *theTextureAtlas = m_qt3dsContext.GetTextureAtlas();
QSize theWindow = m_qt3dsContext.GetWindowDimensions();
- const wchar_t *wText = m_StringTable->GetWideStr(text);
+ // Use dynamic strings to avoid memory leakage
+ QByteArray theText(text);
+ CStringHandle textHandle = m_StringTable->getDynamicHandle(theText);
STextRenderInfo theInfo;
- theInfo.m_Text = m_StringTable->RegisterStr(wText);
+ theInfo.m_Text = m_StringTable->HandleToStr(textHandle);
theInfo.m_FontSize = 20;
// text scale 2% of screen we don't scale Y though because it becomes unreadable
theInfo.m_ScaleX = (theWindow.width() / 100.0f) * 1.5f / (theInfo.m_FontSize);
@@ -1894,6 +1896,7 @@ namespace render {
QT3DS_FREE(m_Context->GetAllocator(),
theRenderTextDetails.first.m_Vertices.begin());
}
+ m_StringTable->releaseDynamicHandle(textHandle);
}
}
}