From 8306c4e86aacfe0e2a7b2aedb88c404735dccdcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20N=C3=A9meth?= Date: Wed, 24 Sep 2025 12:14:57 +0200 Subject: [PATCH] tdf#168528 sw letter spacing: fix freezing with minimum spacing/scaling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix never-ending loop in SwTextFrame::Format_() resulted by bad compression of lines with COMPLETE_STRING cut position. Note: to test the fix of the rare freezing, a subset font has been created from Source Serif 4 Variable, and embedded in the test file. Follow-up to commit 33f20d0a0fb32bf4452c15c6ae0e7c85b2ee6d46 "tdf#168351 sw letter spacing: fix spaces in the last line", commit 45ec7bd76196dcc60b4c2db2f6f00623ecbaf5a4 "tdf#168251 cui offapi xmloff sw glyph scaling: extend UNO/UX/ODF", commit 3c53797210bf0a4e3ffb36ed2beac4d5ce229ff2 "tdf#167648 sw letter spacing: implement minimum letter spacing" and commit f83a04c51056445bbf947a31c8c1866a5c30bef1 "tdf#167648 cui offapi xmloff sw: add DTP-feature maximum letter spacing". Change-Id: I517f2b878421df40d69c785155107cf7380f0c0c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191432 Tested-by: Jenkins Reviewed-by: László Németh --- sw/qa/extras/layout/data/tdf168528.odt | Bin 0 -> 29979 bytes sw/qa/extras/layout/layout3.cxx | 8 ++++++++ sw/source/core/text/guess.cxx | 9 +++++++-- vcl/unx/generic/fontmanager/fontconfig.cxx | 3 +++ 4 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 sw/qa/extras/layout/data/tdf168528.odt diff --git a/sw/qa/extras/layout/data/tdf168528.odt b/sw/qa/extras/layout/data/tdf168528.odt new file mode 100644 index 0000000000000000000000000000000000000000..97608cc1eefe0b66c83ab1a335d7cf8073ec3731 GIT binary patch literal 29979 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 AE&u=k literal 0 HcmV?d00001 diff --git a/sw/qa/extras/layout/layout3.cxx b/sw/qa/extras/layout/layout3.cxx index 9ad3c18412fd..d5f2ad01ef6e 100644 --- a/sw/qa/extras/layout/layout3.cxx +++ b/sw/qa/extras/layout/layout3.cxx @@ -837,6 +837,14 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf168448) } } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf168528) +{ + //just care it doesn't freeze + // embedded font subset created with: + // hb-subset SourceSerif4Variable-Roman.ttf -u '20,3a,61,64,65,66,67,68,6c,6d,6e,6f,72,73,74,75,79' -o subset.ttf + createSwDoc("tdf168528.odt"); +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf164499) { createSwDoc("tdf164499.docx"); diff --git a/sw/source/core/text/guess.cxx b/sw/source/core/text/guess.cxx index 18732a7704ad..1088f5e949a3 100644 --- a/sw/source/core/text/guess.cxx +++ b/sw/source/core/text/guess.cxx @@ -502,7 +502,9 @@ bool SwTextGuess::Guess( const SwTextPortion& rPor, SwTextFormatInfo &rInf, // tdf#168251 minimum glyph scaling allows more text in the line // TODO don't be greedy, allow only an extra word or word part const sal_Int16 nScaleWidthMinimum = aAdjustItem.GetPropScaleWidthMinimum(); - if ( nScaleWidthMinimum < 100 ) + if ( nScaleWidthMinimum < 100 && + // tdf#168528 avoid freezing + m_nCutPos < TextFrameIndex(rInf.GetText().getLength()) ) { SwTwips nExtraSpace = nLineWidth / (nScaleWidthMinimum / 100.0) - nLineWidth; nLineWidth += nExtraSpace; @@ -512,7 +514,10 @@ bool SwTextGuess::Guess( const SwTextPortion& rPor, SwTextFormatInfo &rInf, // tdf#167648 minimum letter spacing allows more text in the line // TODO don't be greedy, allow only an extra word or word part - if ( const sal_Int16 nLetterSpacingMinimum = aAdjustItem.GetPropLetterSpacingMinimum() ) + const sal_Int16 nLetterSpacingMinimum = aAdjustItem.GetPropLetterSpacingMinimum(); + if ( nLetterSpacingMinimum && + // tdf#168528 avoid freezing + m_nCutPos < TextFrameIndex(rInf.GetText().getLength()) ) { SwTwips nExtraSpace = sal_Int32(m_nCutPos - rInf.GetIdx()) * nSpaceWidth / 10.0 * nLetterSpacingMinimum / 100.0; diff --git a/vcl/unx/generic/fontmanager/fontconfig.cxx b/vcl/unx/generic/fontmanager/fontconfig.cxx index 642a1a7ef733..8516a8b6ac9d 100644 --- a/vcl/unx/generic/fontmanager/fontconfig.cxx +++ b/vcl/unx/generic/fontmanager/fontconfig.cxx @@ -1265,6 +1265,9 @@ void PrintFontManager::Substitute(vcl::font::FontSelectPattern &rPattern, OUStri } if (rPattern.maTargetName == "Linux Libertine G" && rPattern.maSearchName == "Linux Libertine O") return; + // tdf#168528 allow testing with embedded subset + if (rPattern.maTargetName == "Source Serif 4 Variable" && rPattern.maSearchName == "DejaVu Serif") + return; SAL_WARN("vcl.fonts", "PrintFontManager::Substitute: missing font: '" << rPattern.maTargetName << "' try: " << rPattern.maSearchName << " instead"); std::cerr << "terminating test due to missing font: " << rPattern.maTargetName << std::endl;