vcl/source/gdi/pdfwriter_impl.cxx |   29 ++++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)

New commits:
commit e0a461466846f64a39868ac921d4b9e1636f5e26
Author:     Khaled Hosny <kha...@libreoffice.org>
AuthorDate: Tue Jun 20 15:58:45 2023 +0300
Commit:     خالد حسني <kha...@libreoffice.org>
CommitDate: Tue Jun 20 18:31:58 2023 +0200

    tdf#115321: Fix PDF position of emphasis mark in vertical text
    
    This aligns the code in PDF writer with
    OutputDevice::ImplDrawEmphasisMarks().
    
    Change-Id: I404beda30ff0eb1d6c59d971a7daa59b559ef70f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153326
    Tested-by: Jenkins
    Reviewed-by: خالد حسني <kha...@libreoffice.org>

diff --git a/vcl/source/gdi/pdfwriter_impl.cxx 
b/vcl/source/gdi/pdfwriter_impl.cxx
index e9e7e32620cc..4ccbdc20bdde 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -7046,11 +7046,20 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, 
const OUString& rText, bool
     writeBuffer( aLine );
 
     Point aOffset(0,0);
+    Point aOffsetVert(0,0);
 
     if ( nEmphMark & FontEmphasisMark::PosBelow )
+    {
         aOffset.AdjustY(GetFontInstance()->mxFontMetric->GetDescent() + 
aEmphasisMark.GetYOffset() );
+        aOffsetVert = aOffset;
+    }
     else
+    {
         aOffset.AdjustY( -(GetFontInstance()->mxFontMetric->GetAscent() + 
aEmphasisMark.GetYOffset()) );
+        // Todo: use ideographic em-box or ideographic character face 
information.
+        aOffsetVert.AdjustY(-(GetFontInstance()->mxFontMetric->GetAscent() +
+                    GetFontInstance()->mxFontMetric->GetDescent() + 
aEmphasisMark.GetYOffset()));
+    }
 
     tools::Long nEmphWidth2 = aEmphasisMark.GetWidth() / 2;
     tools::Long nEmphHeight2 = nEmphHeight / 2;
@@ -7061,13 +7070,27 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, 
const OUString& rText, bool
     else if ( eAlign == ALIGN_TOP )
         aOffset.AdjustY(GetFontInstance()->mxFontMetric->GetAscent() );
 
+    tools::Rectangle aRectangle;
     nIndex = 0;
-    while (rLayout.GetNextGlyph(&pGlyph, aPos, nIndex))
+    while (rLayout.GetNextGlyph(&pGlyph, aPos, nIndex, &pGlyphFont))
     {
+        if (!pGlyph->GetGlyphBoundRect(pGlyphFont, aRectangle))
+            continue;
+
         if (!pGlyph->IsSpacing())
         {
-            DevicePoint aAdjOffset(aOffset.X(), aOffset.Y());
-            aAdjOffset.adjustX((pGlyph->newWidth() - aEmphasisMark.GetWidth()) 
/ 2);
+            DevicePoint aAdjOffset;
+            if (pGlyph->IsVertical())
+            {
+                aAdjOffset = DevicePoint(aOffsetVert.X(), aOffsetVert.Y());
+                aAdjOffset.adjustX((-pGlyph->origWidth() + 
aEmphasisMark.GetWidth()) / 2);
+            }
+            else
+            {
+                aAdjOffset = DevicePoint(aOffset.X(), aOffset.Y());
+                aAdjOffset.adjustX(aRectangle.Left() + (aRectangle.GetWidth() 
- aEmphasisMark.GetWidth()) / 2 );
+            }
+
             aAdjOffset = aRotScale.transform( aAdjOffset );
 
             aAdjOffset -= DevicePoint(nEmphWidth2, nEmphHeight2);

Reply via email to