sw/qa/core/layout/data/rtl-table.docx |binary
 sw/qa/core/layout/paintfrm.cxx        |   41 ++++++++++++++++++++++++++++++++++
 sw/source/core/layout/paintfrm.cxx    |    4 ++-
 3 files changed, 44 insertions(+), 1 deletion(-)

New commits:
commit 0721b09329f88c9206e02afaff832c71065618ee
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Thu Sep 21 20:21:07 2023 +0200
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Tue Sep 26 13:39:54 2023 +0200

    tdf#154198 sw: fix lost vertical table cell borders for WordTableCell + RTL
    
    This went wrong in commit 0dbecd2d2ebe18a262cfab96e105637840b5b7fe (sw:
    fix too long inner borders intersecting with outer borders for Word
    cells, 2022-01-06), the problem is that in its current form this assumes
    that the first cell is on the left and the last cell is on the right,
    which is not true for RTL, so only tweak the length of the borders in
    the LTR case.
    
    (cherry picked from commit 652ab50ce18d0ce7fa1209e6bcf3b10ac5c9a933)
    
    Change-Id: I513af974855496e507134cf156f9ee5a937a46db
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157166
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/sw/qa/core/layout/data/rtl-table.docx 
b/sw/qa/core/layout/data/rtl-table.docx
new file mode 100644
index 000000000000..a329229699e8
Binary files /dev/null and b/sw/qa/core/layout/data/rtl-table.docx differ
diff --git a/sw/qa/core/layout/paintfrm.cxx b/sw/qa/core/layout/paintfrm.cxx
index 2416c6b95f8c..ad09405fe3fb 100644
--- a/sw/qa/core/layout/paintfrm.cxx
+++ b/sw/qa/core/layout/paintfrm.cxx
@@ -68,6 +68,47 @@ CPPUNIT_TEST_FIXTURE(Test, testSplitTableBorder)
     // missing.
     CPPUNIT_ASSERT_EQUAL(4, nHorizontalBorders);
 }
+
+CPPUNIT_TEST_FIXTURE(Test, testRTLBorderMerge)
+{
+    // Given a document with an RTL table:
+    createSwDoc("rtl-table.docx");
+    SwXTextDocument* pTextDoc = 
dynamic_cast<SwXTextDocument*>(mxComponent.get());
+    SwDocShell* pShell = pTextDoc->GetDocShell();
+
+    // When rendering that document:
+    std::shared_ptr<GDIMetaFile> xMetaFile = pShell->GetPreviewMetaFile();
+
+    // Then make sure the 5 columns all have left and right vertical borders:
+    MetafileXmlDump aDumper;
+    xmlDocUniquePtr pXmlDoc = dumpAndParse(aDumper, *xMetaFile);
+    xmlXPathObjectPtr pXmlObj = getXPathNode(pXmlDoc, 
"//polyline[@style='solid']/point");
+    xmlNodeSetPtr pXmlNodes = pXmlObj->nodesetval;
+    int nVerticalBorders = 0;
+    // Count the vertical borders:
+    for (int i = 0; i < xmlXPathNodeSetGetLength(pXmlNodes); i += 2)
+    {
+        xmlNodePtr pStart = pXmlNodes->nodeTab[i];
+        xmlNodePtr pEnd = pXmlNodes->nodeTab[i + 1];
+        xmlChar* pStartY = xmlGetProp(pStart, BAD_CAST("y"));
+        xmlChar* pEndY = xmlGetProp(pEnd, BAD_CAST("y"));
+        sal_Int32 nStartY = o3tl::toInt32(reinterpret_cast<char 
const*>(pStartY));
+        sal_Int32 nEndY = o3tl::toInt32(reinterpret_cast<char const*>(pEndY));
+        if (nStartY == nEndY)
+        {
+            // Horizontal border.
+            continue;
+        }
+
+        ++nVerticalBorders;
+    }
+    xmlXPathFreeObject(pXmlObj);
+    // Without the accompanying fix in place, this test would have failed with:
+    // - Expected: 6
+    // - Actual  : 4
+    // i.e. the 2nd and 5th vertical border was missing.
+    CPPUNIT_ASSERT_EQUAL(6, nVerticalBorders);
+}
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/layout/paintfrm.cxx 
b/sw/source/core/layout/paintfrm.cxx
index 8f6347a2268e..bd07aa9e1675 100644
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -3123,11 +3123,13 @@ void SwTabFramePainter::Insert( SwLineEntry& rNew, bool 
bHori )
         const IDocumentSettingAccess& rIDSA = 
pShell->GetDoc()->getIDocumentSettingAccess();
         bWordTableCell = rIDSA.get(DocumentSettingId::TABLE_ROW_KEEP);
     }
+    bool bR2L = mrTabFrame.IsRightToLeft();
     while ( aIter != pLineSet->end() && rNew.mnStartPos < rNew.mnEndPos )
     {
         const SwLineEntry& rOld = *aIter;
 
-        if (rOld.mnLimitedEndPos || (bWordTableCell && (rOld.mbOuter != 
rNew.mbOuter)))
+        // The bWordTableCell code only works for LTR at the moment, avoid it 
for RTL.
+        if (rOld.mnLimitedEndPos || (bWordTableCell && (rOld.mbOuter != 
rNew.mbOuter) && !bR2L))
         {
             // Don't merge with this line entry as it ends sooner than 
mnEndPos.
             ++aIter;

Reply via email to