sw/qa/extras/pagelinespacing/data/removePage.fodt | 32 ++++++---------------- sw/qa/extras/pagelinespacing/pagelinespacing.cxx | 10 +++--- sw/source/core/text/txtfrm.cxx | 9 ++++++ 3 files changed, 24 insertions(+), 27 deletions(-)
New commits: commit 39018ea836bb73862a9fa509f375ee88750dc93f Author: Tamás Zolnai <[email protected]> AuthorDate: Thu Jan 22 08:53:08 2026 +0100 Commit: Tamás Zolnai <[email protected]> CommitDate: Fri Jan 23 11:29:45 2026 +0100 tdf#169922: Apply page line-spacing properly after removing a page. The invalidation code tries to minimise what needs to be recalculated and reformatted in specific scenarios when a text frame is modified. In this case, the code attempted to calculate the new line height determined by the page line-spacing using invalid frame area. When we don't have valid frame print area information, we can't compute the new text alignment incrementally, so a full reformat is required instead. Change-Id: I8c86bc4c2fd5661f11fab339d6eb7cf57c396a91 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197798 Reviewed-by: Tamás Zolnai <[email protected]> Tested-by: Jenkins diff --git a/sw/qa/extras/pagelinespacing/data/removePage.fodt b/sw/qa/extras/pagelinespacing/data/removePage.fodt index e152adf99672..c94fff2efc12 100644 --- a/sw/qa/extras/pagelinespacing/data/removePage.fodt +++ b/sw/qa/extras/pagelinespacing/data/removePage.fodt @@ -1,31 +1,31 @@ <?xml version="1.0" encoding="UTF-8"?> <office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" 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:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:c alcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext: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:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns: meta: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:meta><meta:creation-date>2025-12-04T13:19:44.264945981</meta:creation-date><meta:generator>LibreOfficeDev/26.8.0.0.alpha0$Linux_X86_64 LibreOffice_project/7ae04a3e190c5e30f54adb48767efa8a3715aaf1</meta:generator><dc:date>2026-01-15T15:22:53.077046672</dc:date><meta:editing-duration>PT1H49M40S</meta:editing-duration><meta:editing-cycles>43</meta:editing-cycles><meta:print-date>2025-12-05T13:09:10.638900744</meta:print-date><meta:printed-by>PDF files</meta:printed-by><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="4" meta:paragraph-count="18" meta:word-count="705" meta:character-count="4773" meta:non-whitespace-character-count="4086"/></office:meta> + <office:meta><meta:creation-date>2025-12-04T13:19:44.264945981</meta:creation-date><meta:generator>LibreOfficeDev/26.8.0.0.alpha0$Linux_X86_64 LibreOffice_project/59fe94babf9666fc21e120152d20ca563d4af60e</meta:generator><dc:date>2026-01-21T11:43:10.345388912</dc:date><meta:editing-duration>PT1H50M7S</meta:editing-duration><meta:editing-cycles>44</meta:editing-cycles><meta:print-date>2025-12-05T13:09:10.638900744</meta:print-date><meta:printed-by>PDF files</meta:printed-by><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="2" meta:paragraph-count="6" meta:word-count="235" meta:character-count="1591" meta:non-whitespace-character-count="1362"/></office:meta> <office:settings> <config:config-item-set config:name="ooo:view-settings"> - <config:config-item config:name="ViewAreaTop" config:type="long">0</config:config-item> + <config:config-item config:name="ViewAreaTop" config:type="long">16076</config:config-item> <config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item> <config:config-item config:name="ViewAreaWidth" config:type="long">42196</config:config-item> - <config:config-item config:name="ViewAreaHeight" config:type="long">20862</config:config-item> + <config:config-item config:name="ViewAreaHeight" config:type="long">23703</config:config-item> <config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item> <config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item> <config:config-item-map-indexed config:name="Views"> <config:config-item-map-entry> <config:config-item config:name="ViewId" config:type="string">view2</config:config-item> - <config:config-item config:name="ViewLeft" config:type="long">21098</config:config-item> - <config:config-item config:name="ViewTop" config:type="long">2925</config:config-item> + <config:config-item config:name="ViewLeft" config:type="long">24199</config:config-item> + <config:config-item config:name="ViewTop" config:type="long">31365</config:config-item> <config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item> - <config:config-item config:name="VisibleTop" config:type="long">0</config:config-item> + <config:config-item config:name="VisibleTop" config:type="long">16076</config:config-item> <config:config-item config:name="VisibleRight" config:type="long">42194</config:config-item> - <config:config-item config:name="VisibleBottom" config:type="long">20860</config:config-item> + <config:config-item config:name="VisibleBottom" config:type="long">39777</config:config-item> <config:config-item config:name="ZoomType" config:type="short">0</config:config-item> <config:config-item config:name="ViewLayoutColumns" config:type="short">0</config:config-item> <config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item> <config:config-item config:name="ZoomFactor" config:type="short">95</config:config-item> <config:config-item config:name="IsSelectedFrame" config:type="boolean">false</config:config-item> <config:config-item config:name="KeepRatio" config:type="boolean">false</config:config-item> - <config:config-item config:name="WindowState" config:type="string">-2,28,1921,903;5;0,28,1921,903;</config:config-item> + <config:config-item config:name="WindowState" config:type="string">-2,28,1921,1009;5;0,28,1921,1009;</config:config-item> <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item> <config:config-item config:name="LegacySingleLineFontwork" config:type="boolean">false</config:config-item> <config:config-item config:name="ConnectorUseSnapRect" config:type="boolean">false</config:config-item> @@ -123,7 +123,7 @@ <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item> <config:config-item config:name="IsLabelDocument" config:type="boolean">false</config:config-item> <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item> - <config:config-item config:name="PrinterSetup" config:type="base64Binary">xAH+/0dlbmVyaWMgUHJpbnRlcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0dFTlBSVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAMAsAAAAAAAAAAIAFZUAAAkbQAASm9iRGF0YSAxCnByaW50ZXI9R2VuZXJpYyBQcmludGVyCm9yaWVudGF0aW9uPVBvcnRyYWl0CmNvcGllcz0xCmNvbGxhdGU9ZmFsc2UKbWFyZ2luYWRqdXN0bWVudD0wLDAsJzAsMApjb2xvcmRlcHRoPTI0CmNvbG9yZGV2aWNlPTAKUFBEQ29udGV4dERhdGEKRHVwbGV4Ok5vbmUAUGFnZVNpemU6TGV0dGVyAAASAENPTVBBVF9EVVBMRVhfTU9ERQ8ARHVwbGV4TW9kZTo6T2ZmDABQUklOVEVSX05BTUUPAEdlbmVyaWMgUHJpbnRlcgsARFJJVkVSX05BTUUHAFNHRU5QUlQ=</config:config-item> + <config:config-item config:name="PrinterSetup" config:type="base64Binary">xAH+/0dlbmVyaWMgUHJpbnRlcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU0dFTlBSVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAMAsAAAAAAAAAAIAFZUAAAkbQAASm9iRGF0YSAxCnByaW50ZXI9R2VuZXJpYyBQcmludGVyCm9yaWVudGF0aW9uPVBvcnRyYWl0CmNvcGllcz0xCmNvbGxhdGU9ZmFsc2UKbWFyZ2luYWRqdXN0bWVudD0wLDAsJzAsMApjb2xvcmRlcHRoPTI0CmNvbG9yZGV2aWNlPTAKUFBEQ29udGV4dERhdGEKUGFnZVNpemU6TGV0dGVyAER1cGxleDpOb25lAAASAENPTVBBVF9EVVBMRVhfTU9ERQ8ARHVwbGV4TW9kZTo6T2ZmDABQUklOVEVSX05BTUUPAEdlbmVyaWMgUHJpbnRlcgsARFJJVkVSX05BTUUHAFNHRU5QUlQ=</config:config-item> <config:config-item config:name="UseVariableWidthNBSP" config:type="boolean">false</config:config-item> <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item> <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item> @@ -152,7 +152,7 @@ <config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item> <config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/> <config:config-item config:name="TabsRelativeToIndent" config:type="boolean">true</config:config-item> - <config:config-item config:name="Rsid" config:type="int">3301128</config:config-item> + <config:config-item config:name="Rsid" config:type="int">3323208</config:config-item> <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item> <config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item> <config:config-item config:name="MsWordCompMinLineHeightByFly" config:type="boolean">true</config:config-item> @@ -485,18 +485,6 @@ <text:p text:style-name="P5">Cras eu leo sed justo gravida venenatis quis at justo. Quisque dignissim imperdiet metus. Morbi pellentesque nunc ut sagittis faucibus. Proin eu tortor sit amet massa laoreet varius. Phasellus consectetur dolor neque, in mattis magna venenatis eu. Etiam vitae cursus urna, vitae imperdiet enim. Maecenas ornare massa euismod, fermentum magna ac, fermentum lacus. Aliquam at nisl eu ligula euismod dictum sed et nibh. Phasellus venenatis cursus lectus, a aliquet libero viverra sit amet. Suspendisse nec venenatis mauris, sit amet porta ante. Sed at felis elit. Aliquam egestas porta nulla vehicula consequat. Aliquam mollis metus et aliquam pretium. Pellentesque viverra, nunc non venenatis fermentum, eros ipsum faucibus diam, ac blandit eros augue at justo. Sed in arcu erat.</text:p> <text:h text:style-name="P6" text:outline-level="7">Curabitur at sodales leo. Sed scelerisque nisi eu interdum tristique.</text:h> <text:p text:style-name="P5">Quisque gravida, felis a laoreet fringilla, ligula nisi vehicula magna, at varius nisl nibh nec libero. Fusce gravida velit luctus, facilisis urna ac, sollicitudin dui. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam pellentesque interdum nibh, eget pretium mauris interdum non. Aenean nunc justo, elementum ac fringilla sagittis, elementum in augue. In in est vulputate, accumsan ante in, feugiat neque. In vulputate magna a tortor tincidunt sagittis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</text:p> - <text:p text:style-name="P2">Lorem Ipsum</text:p> - <text:p text:style-name="P3">"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."</text:p> - <text:h text:style-name="P4" text:outline-level="5">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</text:h> - <text:p text:style-name="P5">Cras eu leo sed justo gravida venenatis quis at justo. Quisque dignissim imperdiet metus. Morbi pellentesque nunc ut sagittis faucibus. Proin eu tortor sit amet massa laoreet varius. Phasellus consectetur dolor neque, in mattis magna venenatis eu. Etiam vitae cursus urna, vitae imperdiet enim. Maecenas ornare massa euismod, fermentum magna ac, fermentum lacus. Aliquam at nisl eu ligula euismod dictum sed et nibh. Phasellus venenatis cursus lectus, a aliquet libero viverra sit amet. Suspendisse nec venenatis mauris, sit amet porta ante. Sed at felis elit. Aliquam egestas porta nulla vehicula consequat. Aliquam mollis metus et aliquam pretium. Pellentesque viverra, nunc non venenatis fermentum, eros ipsum faucibus diam, ac blandit eros augue at justo. Sed in arcu erat.</text:p> - <text:h text:style-name="P6" text:outline-level="7">Curabitur at sodales leo. Sed scelerisque nisi eu interdum tristique.</text:h> - <text:p text:style-name="P5">Quisque gravida, felis a laoreet fringilla, ligula nisi vehicula magna, at varius nisl nibh nec libero. Fusce gravida velit luctus, facilisis urna ac, sollicitudin dui. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam pellentesque interdum nibh, eget pretium mauris interdum non. Aenean nunc justo, elementum ac fringilla sagittis, elementum in augue. In in est vulputate, accumsan ante in, feugiat neque. In vulputate magna a tortor tincidunt sagittis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</text:p> - <text:p text:style-name="P2">Lorem Ipsum</text:p> - <text:p text:style-name="P3">"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."</text:p> - <text:h text:style-name="P4" text:outline-level="5">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</text:h> - <text:p text:style-name="P5">Cras eu leo sed justo gravida venenatis quis at justo. Quisque dignissim imperdiet metus. Morbi pellentesque nunc ut sagittis faucibus. Proin eu tortor sit amet massa laoreet varius. Phasellus consectetur dolor neque, in mattis magna venenatis eu. Etiam vitae cursus urna, vitae imperdiet enim. Maecenas ornare massa euismod, fermentum magna ac, fermentum lacus. Aliquam at nisl eu ligula euismod dictum sed et nibh. Phasellus venenatis cursus lectus, a aliquet libero viverra sit amet. Suspendisse nec venenatis mauris, sit amet porta ante. Sed at felis elit. Aliquam egestas porta nulla vehicula consequat. Aliquam mollis metus et aliquam pretium. Pellentesque viverra, nunc non venenatis fermentum, eros ipsum faucibus diam, ac blandit eros augue at justo. Sed in arcu erat.</text:p> - <text:h text:style-name="P6" text:outline-level="7">Curabitur at sodales leo. Sed scelerisque nisi eu interdum tristique.</text:h> - <text:p text:style-name="P5">Quisque gravida, felis a laoreet fringilla, ligula nisi vehicula magna, at varius nisl nibh nec libero. Fusce gravida velit luctus, facilisis urna ac, sollicitudin dui. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam pellentesque interdum nibh, eget pretium mauris interdum non. Aenean nunc justo, elementum ac fringilla sagittis, elementum in augue. In in est vulputate, accumsan ante in, feugiat neque. In vulputate magna a tortor tincidunt sagittis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</text:p> </office:text> </office:body> </office:document> \ No newline at end of file diff --git a/sw/qa/extras/pagelinespacing/pagelinespacing.cxx b/sw/qa/extras/pagelinespacing/pagelinespacing.cxx index 5e989885285b..ca3429353d5a 100644 --- a/sw/qa/extras/pagelinespacing/pagelinespacing.cxx +++ b/sw/qa/extras/pagelinespacing/pagelinespacing.cxx @@ -424,17 +424,16 @@ CPPUNIT_TEST_FIXTURE(SwPageLineSpacingTest, testChangeReferenceStyle) checkTextAlignedToBaselineGrid(); } -/* This use case does not work properly (tdf#169922) CPPUNIT_TEST_FIXTURE(SwPageLineSpacingTest, testRemovePage) { + // tdf#169922: Text was not properly aligned to the baseline grid after removing a page. createSwDoc("removePage.fodt"); checkTextAlignedToBaselineGrid(); - // Remove the first, empty page + // Remove the first (empty) page. SwDocShell* pDocShell = getSwDocShell(); CPPUNIT_ASSERT(pDocShell); - SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); CPPUNIT_ASSERT(pWrtShell); pWrtShell->SttEndDoc(true); @@ -442,10 +441,10 @@ CPPUNIT_TEST_FIXTURE(SwPageLineSpacingTest, testRemovePage) checkTextAlignedToBaselineGrid(); } -*/ CPPUNIT_TEST_FIXTURE(SwPageLineSpacingTest, testVerticalTextInsideTable) { + // tdf#169821: Top-to-bottom vertical text disappeared from the table cell. createSwDoc("verticalTextInsideTable.fodt"); // The original size should not change after applying page line-spacing. @@ -455,7 +454,8 @@ CPPUNIT_TEST_FIXTURE(SwPageLineSpacingTest, testVerticalTextInsideTable) applyPageLineSpacing(1, true, u"Body Text"_ustr); const Size aNewTopToBottomSize = getTextFrameSize(2, u"TopToBottom"_ustr); - CPPUNIT_ASSERT(aNewTopToBottomSize.Width() > 0); // Width was negative (tdf#169821). + // The width was negative, so the text was invisible. + CPPUNIT_ASSERT(aNewTopToBottomSize.Width() > 0); CPPUNIT_ASSERT_EQUAL(aBottomToTopSize, getTextFrameSize(1, u"BottomToTop"_ustr)); CPPUNIT_ASSERT_EQUAL(aTopToBottomSize, aNewTopToBottomSize); diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx index 33a8bf620732..61abe2faee54 100644 --- a/sw/source/core/text/txtfrm.cxx +++ b/sw/source/core/text/txtfrm.cxx @@ -3244,6 +3244,15 @@ bool SwTextFrame::Prepare( const PrepareHint ePrep, const void* pVoid, } } } + if( !bFormat ) + { + // Without a valid print area, page line-spacing can't be applied incrementally. + // Do a full reformat. + if (GetTextNodeForParaProps()->GetSwAttrSet().GetRegister().GetValue()) + { + bFormat = !isFramePrintAreaValid(); + } + } } }
