diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com> | 2012-04-18 10:57:43 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-04-18 23:26:01 +0200 |
commit | 06d4ea64001f7d7c019f5dac5080d80e37828c3d (patch) | |
tree | 3ad80e8d7ad48866c8c6152465989bcf979fe1c6 /src/gui/text | |
parent | 197b423e9663c11221172253bb84754adb51742f (diff) |
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 <jiang.jiang@nokia.com>
Diffstat (limited to 'src/gui/text')
-rw-r--r-- | src/gui/text/qtextengine.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
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; |