sw/qa/extras/layout/data/tdf135991.odt |binary
 sw/qa/extras/layout/layout2.cxx        |    8 +++++
 sw/source/core/layout/calcmove.cxx     |   46 +++++++++++++++++----------------
 3 files changed, 33 insertions(+), 21 deletions(-)

New commits:
commit 1bf82b26aea3a403920a64cdfcb4671c947c7a01
Author:     Mark Hung <mark...@gmail.com>
AuthorDate: Sun Aug 14 15:23:14 2022 +0800
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Mon Aug 15 11:39:09 2022 +0200

    tdf#135991 fix unexpected hidden RTL sections.
    
    SwLayoutFrame::MakeAll tried to manipulate the height instead of the
    width for SwCellFrame and SwColumnFrame ( i.e. when IsNeghbourFrame()
    is true. ), by selecting a wrong SwRectFn.
    
    SwRectFn fnRect = bVert == IsNeighbourFrame() ? fnRectHori :
    ( IsVertLR() ? (IsVertLRBT() ? fnRectVertL2RB2T : fnRectVertL2R) : 
fnRectVert );
    
    It doesn't make sense to select among fnRectVertL2RBT, fnRectVertL2R,
    and fnRectVert if the layout is horizontal.
    The frame position got a negative top value and make the frame invisble.
    
    Check he following commit for reference:
    
    commit c90b6806d18c8ed25015eb2ecdff13c7bab2572d
    Author: Andreas Martens <a...@openoffice.org>
    Date:   Wed Sep 19 07:45:10 2001 +0000
    
        Chg: Moving vertical help functions from SwFrm to SwRect
    
    Change-Id: I2f6da9cdbc2947de95a6fb9ce8fa94a79360c83a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138250
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sw/qa/extras/layout/data/tdf135991.odt 
b/sw/qa/extras/layout/data/tdf135991.odt
new file mode 100644
index 000000000000..f490ee9fb28c
Binary files /dev/null and b/sw/qa/extras/layout/data/tdf135991.odt differ
diff --git a/sw/qa/extras/layout/layout2.cxx b/sw/qa/extras/layout/layout2.cxx
index c4d1a976fe7c..09e113fc4ed0 100644
--- a/sw/qa/extras/layout/layout2.cxx
+++ b/sw/qa/extras/layout/layout2.cxx
@@ -2301,6 +2301,14 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf124261)
 #endif
 }
 
+CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf135991)
+{
+    createSwDoc(DATA_DIRECTORY, "tdf135991.odt");
+    auto pDump = parseLayoutDump();
+    // There used to be negative values that made the column frames invisible.
+    assertXPath(pDump, "//bounds[@top<0]", 0);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/layout/calcmove.cxx 
b/sw/source/core/layout/calcmove.cxx
index 1bc2506a72f4..1869794300f6 100644
--- a/sw/source/core/layout/calcmove.cxx
+++ b/sw/source/core/layout/calcmove.cxx
@@ -949,7 +949,7 @@ void SwLayoutFrame::MakeAll(vcl::RenderContext* 
/*pRenderContext*/)
     const SwLayNotify aNotify( this );
     bool bVert = IsVertical();
 
-    SwRectFn fnRect = ( IsNeighbourFrame() == bVert )? fnRectHori : ( 
IsVertLR() ? (IsVertLRBT() ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert );
+    SwRectFn fnRect = bVert ? ( IsVertLR() ? (IsVertLRBT() ? fnRectVertL2RB2T 
: fnRectVertL2R) : fnRectVert ) : fnRectHori;
 
     std::optional<SwBorderAttrAccess> oAccess;
     const SwBorderAttrs*pAttrs = nullptr;
@@ -975,32 +975,36 @@ void SwLayoutFrame::MakeAll(vcl::RenderContext* 
/*pRenderContext*/)
                 {
                     // Set FixSize; VarSize is set by Format() after 
calculating the PrtArea
                     setFramePrintAreaValid(false);
-
-                    SwTwips nPrtWidth = 
(GetUpper()->getFramePrintArea().*fnRect->fnGetWidth)();
-                    if( bVert && ( IsBodyFrame() || IsFootnoteContFrame() ) )
-                    {
-                        SwFrame* pNxt = GetPrev();
-                        while( pNxt && !pNxt->IsHeaderFrame() )
-                            pNxt = pNxt->GetPrev();
-                        if( pNxt )
-                            nPrtWidth -= pNxt->getFrameArea().Height();
-                        pNxt = GetNext();
-                        while( pNxt && !pNxt->IsFooterFrame() )
-                            pNxt = pNxt->GetNext();
-                        if( pNxt )
-                            nPrtWidth -= pNxt->getFrameArea().Height();
-                    }
-
-                    const tools::Long nDiff = nPrtWidth - 
(getFrameArea().*fnRect->fnGetWidth)();
                     SwFrameAreaDefinition::FrameAreaWriteAccess aFrm(*this);
 
-                    if( IsNeighbourFrame() && IsRightToLeft() )
+                    if (IsNeighbourFrame())
                     {
-                        (aFrm.*fnRect->fnSubLeft)( nDiff );
+                        SwTwips nPrtHeight = 
(GetUpper()->getFramePrintArea().*fnRect->fnGetHeight)();
+                        const tools::Long nDiff = nPrtHeight - 
(getFrameArea().*fnRect->fnGetHeight)();
+                        (aFrm.*fnRect->fnAddBottom)( nDiff );
                     }
                     else
                     {
-                        (aFrm.*fnRect->fnAddRight)( nDiff );
+                        SwTwips nPrtWidth = 
(GetUpper()->getFramePrintArea().*fnRect->fnGetWidth)();
+                        if( bVert && ( IsBodyFrame() || IsFootnoteContFrame() 
) )
+                        {
+                            SwFrame* pNxt = GetPrev();
+                            while( pNxt && !pNxt->IsHeaderFrame() )
+                                pNxt = pNxt->GetPrev();
+                            if( pNxt )
+                                nPrtWidth -= pNxt->getFrameArea().Height();
+                            pNxt = GetNext();
+                            while( pNxt && !pNxt->IsFooterFrame() )
+                                pNxt = pNxt->GetNext();
+                            if( pNxt )
+                                nPrtWidth -= pNxt->getFrameArea().Height();
+                        }
+
+                        const tools::Long nDiff = nPrtWidth - 
(getFrameArea().*fnRect->fnGetWidth)();
+                        if(IsRightToLeft() )
+                            (aFrm.*fnRect->fnSubLeft)( nDiff );
+                        else
+                            (aFrm.*fnRect->fnAddRight)( nDiff );
                     }
                 }
                 else

Reply via email to