From d11715935b677cb9dfe5420a08972036a9ab6b9b Mon Sep 17 00:00:00 2001 From: Sergei Nevdakh Date: Mon, 15 Apr 2024 17:31:49 +0300 Subject: [PATCH 1/2] ref counter LineBreakHelper::previousGlyphFontEngine --- src/qtbase/src/gui/text/qtextlayout.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/qtbase/src/gui/text/qtextlayout.cpp b/src/qtbase/src/gui/text/qtextlayout.cpp index e1eb1202..2e2431c3 100644 --- a/src/qtbase/src/gui/text/qtextlayout.cpp +++ b/src/qtbase/src/gui/text/qtextlayout.cpp @@ -1673,11 +1673,17 @@ namespace { struct LineBreakHelper { LineBreakHelper() - : glyphCount(0), maxGlyphs(0), currentPosition(0), fontEngine(nullptr), logClusters(nullptr), + : glyphCount(0), maxGlyphs(0), currentPosition(0), previousGlyphFontEngine(nullptr), fontEngine(nullptr), logClusters(nullptr), manualWrap(false), whiteSpaceOrObject(true) { } + ~LineBreakHelper() + { + if (previousGlyphFontEngine && !previousGlyphFontEngine->ref.deref()) + delete previousGlyphFontEngine; + } + QScriptLine tmpData; QScriptLine spaceData; @@ -1723,7 +1729,11 @@ namespace { if (currentPosition > 0 && logClusters[currentPosition - 1] < glyphs.numGlyphs) { previousGlyph = currentGlyph(); // needed to calculate right bearing later + if (previousGlyphFontEngine && !previousGlyphFontEngine->ref.deref()) + delete previousGlyphFontEngine; + previousGlyphFontEngine = fontEngine; + previousGlyphFontEngine->ref.ref(); } } -- GitLab From 7522f27b92eda56a5041a83076d39735f7cdeeb9 Mon Sep 17 00:00:00 2001 From: Sergei Nevdakh Date: Mon, 15 Apr 2024 18:27:04 +0300 Subject: [PATCH 2/2] ref counter LineBreakHelper::fontEngine --- src/qtbase/src/gui/text/qtextlayout.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/qtbase/src/gui/text/qtextlayout.cpp b/src/qtbase/src/gui/text/qtextlayout.cpp index 2e2431c3..2d06277d 100644 --- a/src/qtbase/src/gui/text/qtextlayout.cpp +++ b/src/qtbase/src/gui/text/qtextlayout.cpp @@ -1680,6 +1680,9 @@ namespace { ~LineBreakHelper() { + if (fontEngine && !fontEngine->ref.deref()) + delete fontEngine; + if (previousGlyphFontEngine && !previousGlyphFontEngine->ref.deref()) delete previousGlyphFontEngine; } @@ -1898,7 +1901,10 @@ void QTextLine::layout_helper(int maxGlyphs) lbh.glyphs = eng->shapedGlyphs(¤t); QFontEngine *fontEngine = eng->fontEngine(current); if (lbh.fontEngine != fontEngine) { + if (lbh.fontEngine && !lbh.fontEngine->ref.deref()) + delete lbh.fontEngine; lbh.fontEngine = fontEngine; + lbh.fontEngine->ref.ref(); lbh.minimumRightBearing = qMin(QFixed(), QFixed::fromReal(fontEngine->minRightBearing())); } -- GitLab