sw/qa/extras/layout/layout2.cxx        |    2 -
 sw/source/core/txtnode/swfont.cxx      |   61 +++++++++++++++++++++++++++++++++
 vcl/qa/cppunit/pdfexport/pdfexport.cxx |    7 +++
 3 files changed, 69 insertions(+), 1 deletion(-)

New commits:
commit ef30d351da288b3513cfd30cb82bff7e0827fcb3
Author:     Khaled Hosny <kha...@libreoffice.org>
AuthorDate: Thu Jun 1 15:25:28 2023 +0300
Commit:     خالد حسني <kha...@libreoffice.org>
CommitDate: Thu Jun 1 15:49:39 2023 +0200

    tdf#155623: Revert "tdf#155557: Fix drawing mixed direction underlined text"
    
    This reverts commit 99d22fd79c5532fd6c1b167996e1c27216b92469.
    
    Lets revert and figure out a less radical fix for the original issue.
    
    Change-Id: If3025d32019e953b7946ebe4209daf74efc5e15a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152490
    Tested-by: Jenkins
    Reviewed-by: خالد حسني <kha...@libreoffice.org>

diff --git a/sw/qa/extras/layout/layout2.cxx b/sw/qa/extras/layout/layout2.cxx
index e9f2372c0d97..b4b004951bf0 100644
--- a/sw/qa/extras/layout/layout2.cxx
+++ b/sw/qa/extras/layout/layout2.cxx
@@ -875,7 +875,7 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineMoving2)
     // text and numbering colors show moving of the list item
     // These were 0 (other color, not COL_GREEN, color of the tracked text 
movement)
     assertXPath(pXmlDoc, 
"/metafile/push/push/push/textcolor[@color='#008000']", 5);
-    assertXPath(pXmlDoc, "/metafile/push/push/push/font[@color='#008000']", 9);
+    assertXPath(pXmlDoc, "/metafile/push/push/push/font[@color='#008000']", 
11);
 }
 
 CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineMovingDOCX)
diff --git a/sw/source/core/txtnode/swfont.cxx 
b/sw/source/core/txtnode/swfont.cxx
index a4ac4f675aea..c0149d9a6573 100644
--- a/sw/source/core/txtnode/swfont.cxx
+++ b/sw/source/core/txtnode/swfont.cxx
@@ -1099,6 +1099,16 @@ void SwSubFont::DrawText_( SwDrawTextInfo &rInf, const 
bool bGrey )
     if (TextFrameIndex(COMPLETE_STRING) == rInf.GetLen())
         rInf.SetLen( nLn );
 
+    FontLineStyle nOldUnder = LINESTYLE_NONE;
+    SwUnderlineFont* pUnderFnt = nullptr;
+
+    if( rInf.GetUnderFnt() )
+    {
+        nOldUnder = GetUnderline();
+        SetUnderline( LINESTYLE_NONE );
+        pUnderFnt = rInf.GetUnderFnt();
+    }
+
     if( !pLastFont || pLastFont->GetOwner() != m_nFontCacheId )
         ChgFnt( rInf.GetShell(), rInf.GetOut() );
 
@@ -1155,6 +1165,57 @@ void SwSubFont::DrawText_( SwDrawTextInfo &rInf, const 
bool bGrey )
         }
     }
 
+    if( pUnderFnt && nOldUnder != LINESTYLE_NONE )
+    {
+        Size aFontSize = GetTextSize_( rInf );
+        const OUString oldStr = rInf.GetText();
+
+        TextFrameIndex const nOldIdx = rInf.GetIdx();
+        TextFrameIndex const nOldLen = rInf.GetLen();
+        tools::Long nSpace = 0;
+        if( rInf.GetSpace() )
+        {
+            TextFrameIndex nTmpEnd = nOldIdx + nOldLen;
+            if (nTmpEnd > TextFrameIndex(oldStr.getLength()))
+                nTmpEnd = TextFrameIndex(oldStr.getLength());
+
+            const SwScriptInfo* pSI = rInf.GetScriptInfo();
+
+            const bool bAsianFont =
+                ( rInf.GetFont() && SwFontScript::CJK == 
rInf.GetFont()->GetActual() );
+            for (TextFrameIndex nTmp = nOldIdx; nTmp < nTmpEnd; ++nTmp)
+            {
+                if (CH_BLANK == oldStr[sal_Int32(nTmp)] || bAsianFont ||
+                    (nTmp + TextFrameIndex(1) < 
TextFrameIndex(oldStr.getLength())
+                     && pSI
+                     && i18n::ScriptType::ASIAN == pSI->ScriptType(nTmp + 
TextFrameIndex(1))))
+                {
+                    ++nSpace;
+                }
+            }
+
+            // if next portion if a hole portion we do not consider any
+            // extra space added because the last character was ASIAN
+            if ( nSpace && rInf.IsSpaceStop() && bAsianFont )
+                 --nSpace;
+
+            nSpace *= rInf.GetSpace() / SPACING_PRECISION_FACTOR;
+        }
+
+        rInf.SetWidth( sal_uInt16(aFontSize.Width() + nSpace) );
+        rInf.SetTextIdxLen( "  ", TextFrameIndex(0), TextFrameIndex(2) );
+        SetUnderline( nOldUnder );
+        rInf.SetUnderFnt( nullptr );
+
+        // set position for underline font
+        rInf.SetPos( pUnderFnt->GetPos() );
+
+        pUnderFnt->GetFont().DrawStretchText_( rInf );
+
+        rInf.SetUnderFnt( pUnderFnt );
+        rInf.SetTextIdxLen(oldStr, nOldIdx, nOldLen);
+    }
+
     rInf.SetPos(aOldPos);
 }
 
diff --git a/vcl/qa/cppunit/pdfexport/pdfexport.cxx 
b/vcl/qa/cppunit/pdfexport/pdfexport.cxx
index 5f8cce35e69e..0739cd25cd8a 100644
--- a/vcl/qa/cppunit/pdfexport/pdfexport.cxx
+++ b/vcl/qa/cppunit/pdfexport/pdfexport.cxx
@@ -1338,6 +1338,13 @@ CPPUNIT_TEST_FIXTURE(PdfExportTest, testTdf145274)
 
     int nPageObjectCount = pPage->getObjectCount();
 
+    // Without the fix in place, this test would have failed with
+    // - Expected: 6
+    // - Actual  : 4
+    CPPUNIT_ASSERT_EQUAL(6, nPageObjectCount);
+
+    auto pTextPage = pPage->getTextPage();
+
     for (int i = 0; i < nPageObjectCount; ++i)
     {
         std::unique_ptr<vcl::pdf::PDFiumPageObject> pPageObject = 
pPage->getObject(i);

Reply via email to