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">&quot;Neque porro quisquam est qui dolorem 
ipsum quia dolor sit amet, consectetur, adipisci velit...&quot;</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">&quot;Neque porro quisquam est qui dolorem 
ipsum quia dolor sit amet, consectetur, adipisci velit...&quot;</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();
+                        }
+                    }
                 }
             }
 

Reply via email to