sw/qa/extras/layout/data/tdf169607-big-letters.fodt | 25 ++++++++++++++++++++ sw/qa/extras/layout/layout6.cxx | 13 ++++++++++ sw/source/core/text/frmform.cxx | 13 ++++++++++ 3 files changed, 51 insertions(+)
New commits: commit a8bd2b794b308acfd8822b9f88326f61963fc1bf Author: Mike Kaganski <[email protected]> AuthorDate: Sun Feb 8 17:08:52 2026 +0500 Commit: Xisco Fauli <[email protected]> CommitDate: Tue Feb 10 14:42:31 2026 +0100 tdf#169607: Do split when learned that it wasn't an empty master split Commit ae9e8f3f6d10b0be2fe5b9b238a531b17e0d67da prevented splitting master frame at the beginning of page, because there shouldn't be an empty frame there. But the actual number of characters that goes to the master frame will only be known after FindBreak, at which point it may turn out that the suppression was wrong. This change checks this situation, and splits anyway. It is similar to what happens below, where SplitFrame is also called. Change-Id: If32fe2817a91724d704a096111a963f63deee593 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198902 Tested-by: Jenkins Reviewed-by: Mike Kaganski <[email protected]> Signed-off-by: Xisco Fauli <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198955 diff --git a/sw/qa/extras/layout/data/tdf169607-big-letters.fodt b/sw/qa/extras/layout/data/tdf169607-big-letters.fodt new file mode 100644 index 000000000000..1875781f248d --- /dev/null +++ b/sw/qa/extras/layout/data/tdf169607-big-letters.fodt @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.4" office:mimetype="application/vnd.oasis.opendocument.text"> + <office:settings> + <config:config-item-set config:name="ooo:configuration-settings"> + <config:config-item config:name="IgnoreTabsAndBlanksForLineCalculation" config:type="boolean">true</config:config-item> + </config:config-item-set> + </office:settings> + <office:automatic-styles> + <style:style style:name="T1" style:family="text"> + <style:text-properties fo:font-size="500pt"/> + </style:style> + <style:page-layout style:name="pm1"> + <style:page-layout-properties fo:page-width="297mm" fo:page-height="210mm" style:print-orientation="landscape" fo:margin-top="20mm" fo:margin-bottom="20mm" fo:margin-left="20mm" fo:margin-right="20mm" style:writing-mode="lr-tb"/> + </style:page-layout> + </office:automatic-styles> + <office:master-styles> + <style:master-page style:name="Standard" style:page-layout-name="pm1"/> + </office:master-styles> + <office:body> + <office:text> + <text:p loext:marker-style-name="T1"><text:span text:style-name="T1">FOOBAR</text:span></text:p> + </office:text> + </office:body> +</office:document> \ No newline at end of file diff --git a/sw/qa/extras/layout/layout6.cxx b/sw/qa/extras/layout/layout6.cxx index 1217dc28ff87..bebc6deb7563 100644 --- a/sw/qa/extras/layout/layout6.cxx +++ b/sw/qa/extras/layout/layout6.cxx @@ -2183,6 +2183,19 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter6, testTdf167946) assertXPath(pXmlDoc, "//SwLineLayout[2]/child::*[81]", "portion", u","); } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter6, testTdf169607) +{ + // Given a document with a sequence of huge letters, each of which don't fit to page vertically: + createSwDoc("tdf169607-big-letters.fodt"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + CPPUNIT_ASSERT(pXmlDoc); + + // There must be three pages, because the sequence must split two characters per page. Before + // the fix, there was only one page: + assertXPath(pXmlDoc, "//page", 3); +} + } // end of anonymous namespace CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/core/text/frmform.cxx b/sw/source/core/text/frmform.cxx index dc4e06c89292..7afd83430384 100644 --- a/sw/source/core/text/frmform.cxx +++ b/sw/source/core/text/frmform.cxx @@ -1233,6 +1233,7 @@ void SwTextFrame::FormatAdjust( SwTextFormatter &rLine, GetDrawObjs() && GetDrawObjs()->size() == 1 && (*GetDrawObjs())[0]->GetFrameFormat()->GetAnchor().GetAnchorId() == RndStdIds::FLY_AS_CHAR; + bool bCreateNewSuppressedByEmptySplit = false; if (bLoneAsCharAnchoredObj) { // Still try split text frame if we have columns. @@ -1263,7 +1264,10 @@ void SwTextFrame::FormatAdjust( SwTextFormatter &rLine, // frame if we have columns. if (pBodyFrame && !FindColFrame() && isFirstVisibleFrameInPageBody(this) && !hasFly(this) && !hasAtPageFly(pBodyFrame)) + { createNew = false; + bCreateNewSuppressedByEmptySplit = true; + } } } @@ -1317,6 +1321,15 @@ void SwTextFrame::FormatAdjust( SwTextFormatter &rLine, if( !bDelta ) GetFollow()->ManipOfst( nEnd ); } + else + { + if (bCreateNewSuppressedByEmptySplit && nEnd != nOld) + { + // Not empty split: nEnd moved + SplitFrame(nEnd); + dontJoin = true; + } + } } else { // If we pass over lines, we must not call Join in Follows, instead we even
