From 06d4ea64001f7d7c019f5dac5080d80e37828c3d Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Wed, 18 Apr 2012 10:57:43 +0200 Subject: Fix memory leak when drawing text in non-common script When the font engine cache was updated for new parameters, we would overwrite the cached engine, but not deref the old cached engine, thus it would never be deleted. This is manual cherry pick of 44c14470e5b28e45c19d6959b114e063cf3f4d83 from 4.8 branch. Change-Id: Ice2e555fe380dc9851ef490fa1a6928936ae4c35 Reviewed-by: Jiang Jiang --- src/gui/text/qtextengine.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'src/gui') diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp index 793ea4aa9e..ec7dc57314 100644 --- a/src/gui/text/qtextengine.cpp +++ b/src/gui/text/qtextengine.cpp @@ -1755,12 +1755,19 @@ QFontEngine *QTextEngine::fontEngine(const QScriptItem &si, QFixed *ascent, QFix font.setPixelSize((font.pixelSize() * 2) / 3); scaledEngine = font.d->engineForScript(script); } - feCache.prevFontEngine = engine; + if (engine) engine->ref.ref(); - feCache.prevScaledFontEngine = scaledEngine; + if (feCache.prevFontEngine) + releaseCachedFontEngine(feCache.prevFontEngine); + feCache.prevFontEngine = engine; + if (scaledEngine) scaledEngine->ref.ref(); + if (feCache.prevScaledFontEngine) + releaseCachedFontEngine(feCache.prevScaledFontEngine); + feCache.prevScaledFontEngine = scaledEngine; + feCache.prevScript = script; feCache.prevPosition = si.position; feCache.prevLength = length(&si); @@ -1770,9 +1777,13 @@ QFontEngine *QTextEngine::fontEngine(const QScriptItem &si, QFixed *ascent, QFix engine = feCache.prevFontEngine; else { engine = font.d->engineForScript(script); - feCache.prevFontEngine = engine; + if (engine) engine->ref.ref(); + if (feCache.prevFontEngine) + releaseCachedFontEngine(feCache.prevFontEngine); + feCache.prevFontEngine = engine; + feCache.prevScript = script; feCache.prevPosition = -1; feCache.prevLength = -1; -- cgit v1.2.3