diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-06-20 10:25:54 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-06-20 11:06:17 +0300 |
commit | 46a1400d950a735d85fb061b1d7264f1f8d3c542 (patch) | |
tree | 41ee0e649eaab955618b07d750edb95c0fe74e1e | |
parent | d66674bf53a572c1788ae35649539c3d381de875 (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.cpp | 14 | ||||
-rw-r--r-- | src/runtimerender/rendererimpl/Qt3DSRendererImpl.cpp | 7 |
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); } } } |