tdf#102914: fix artificial italic of fallback fonts in PDF export

Check the LogicalFontInstance that the glyphs actually use when
deciding whether to do artificial italic or not.

Change-Id: Iefb60cf512285b94ff56d48923c3c33c6a6fbc40
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143338
Tested-by: Jenkins
Reviewed-by: خالد حسني <khaled@aliftype.com>
diff --git a/vcl/inc/pdf/pdfwriter_impl.hxx b/vcl/inc/pdf/pdfwriter_impl.hxx
index b3222f4..6f68478 100644
--- a/vcl/inc/pdf/pdfwriter_impl.hxx
+++ b/vcl/inc/pdf/pdfwriter_impl.hxx
@@ -615,6 +615,7 @@ struct PDFGlyph
{
    DevicePoint const m_aPos;
    const GlyphItem* m_pGlyph;
    const LogicalFontInstance* m_pFont;
    sal_Int32 const   m_nNativeWidth;
    sal_Int32 const   m_nMappedFontId;
    sal_uInt8 const   m_nMappedGlyphId;
@@ -622,11 +623,12 @@ struct PDFGlyph

    PDFGlyph( const DevicePoint& rPos,
              const GlyphItem* pGlyph,
              const LogicalFontInstance* pFont,
              sal_Int32 nNativeWidth,
              sal_Int32 nFontId,
              sal_uInt8 nMappedGlyphId,
              int nCharPos )
    : m_aPos( rPos ), m_pGlyph(pGlyph), m_nNativeWidth( nNativeWidth ),
    : m_aPos( rPos ), m_pGlyph(pGlyph), m_pFont(pFont), m_nNativeWidth( nNativeWidth ),
      m_nMappedFontId( nFontId ), m_nMappedGlyphId( nMappedGlyphId ),
      m_nCharPos(nCharPos)
    {}
@@ -861,8 +863,8 @@ i12626

    /*  emits a text object according to the passed layout */
    /* TODO: remove rText as soon as SalLayout will change so that rText is not necessary anymore */
    void drawVerticalGlyphs( const std::vector<PDFGlyph>& rGlyphs, OStringBuffer& rLine, const Point& rAlignOffset, const Matrix3& rRotScale, double fAngle, double fXScale, double fSkew, sal_Int32 nFontHeight );
    void drawHorizontalGlyphs( const std::vector<PDFGlyph>& rGlyphs, OStringBuffer& rLine, const Point& rAlignOffset, bool bFirst, double fAngle, double fXScale, double fSkew, sal_Int32 nFontHeight, sal_Int32 nPixelFontHeight );
    void drawVerticalGlyphs( const std::vector<PDFGlyph>& rGlyphs, OStringBuffer& rLine, const Point& rAlignOffset, const Matrix3& rRotScale, double fAngle, double fXScale, sal_Int32 nFontHeight );
    void drawHorizontalGlyphs( const std::vector<PDFGlyph>& rGlyphs, OStringBuffer& rLine, const Point& rAlignOffset, bool bFirst, double fAngle, double fXScale, sal_Int32 nFontHeight, sal_Int32 nPixelFontHeight );
    void drawLayout( SalLayout& rLayout, const OUString& rText, bool bTextLines );
    void drawRelief( SalLayout& rLayout, const OUString& rText, bool bTextLines );
    void drawShadow( SalLayout& rLayout, const OUString& rText, bool bTextLines );
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index d107e89..34785e2 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -6315,7 +6315,6 @@ void PDFWriterImpl::drawVerticalGlyphs(
        const Matrix3& rRotScale,
        double fAngle,
        double fXScale,
        double fSkew,
        sal_Int32 nFontHeight)
{
    double nXOffset = 0;
@@ -6327,6 +6326,12 @@ void PDFWriterImpl::drawVerticalGlyphs(
        double fDeltaAngle = 0.0;
        double fYScale = 1.0;
        double fTempXScale = fXScale;

        // perform artificial italics if necessary
        double fSkew = 0.0;
        if (rGlyphs[i].m_pFont->NeedsArtificialItalic())
            fSkew = ARTIFICIAL_ITALIC_SKEW;

        double fSkewB = fSkew;
        double fSkewA = 0.0;

@@ -6381,7 +6386,6 @@ void PDFWriterImpl::drawHorizontalGlyphs(
        bool bFirst,
        double fAngle,
        double fXScale,
        double fSkew,
        sal_Int32 nFontHeight,
        sal_Int32 nPixelFontHeight)
{
@@ -6395,6 +6399,7 @@ void PDFWriterImpl::drawHorizontalGlyphs(
    for( size_t i = 1; i < rGlyphs.size(); i++ )
    {
        if( rGlyphs[i].m_nMappedFontId != rGlyphs[i-1].m_nMappedFontId ||
            rGlyphs[i].m_pFont != rGlyphs[i-1].m_pFont ||
            rGlyphs[i].m_aPos.getY() != rGlyphs[i-1].m_aPos.getY() )
        {
            aRunEnds.push_back(i);
@@ -6410,6 +6415,12 @@ void PDFWriterImpl::drawHorizontalGlyphs(
        // setup text matrix back transformed to current coordinate system
        Point aCurPos(SubPixelToLogic(rGlyphs[nBeginRun].m_aPos));
        aCurPos += rAlignOffset;

        // perform artificial italics if necessary
        double fSkew = 0.0;
        if (rGlyphs[nBeginRun].m_pFont->NeedsArtificialItalic())
            fSkew = ARTIFICIAL_ITALIC_SKEW;

        // the first run can be set with "Td" operator
        // subsequent use of that operator would move
        // the textline matrix relative to what was set before
@@ -6498,7 +6509,6 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool 
    bool bVertical = m_aCurrentPDFState.m_aFont.IsVertical();
    int nIndex = 0;
    double fXScale = 1.0;
    double fSkew = 0.0;
    sal_Int32 nPixelFontHeight = GetFontInstance()->GetFontSelectPattern().mnHeight;
    TextAlign eAlign = m_aCurrentPDFState.m_aFont.GetAlignment();

@@ -6518,10 +6528,6 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool 
        }
    }

    // perform artificial italics if necessary
    if (GetFontInstance()->NeedsArtificialItalic())
        fSkew = ARTIFICIAL_ITALIC_SKEW;

    // if the mapmode is distorted we need to adjust for that also
    if( m_aCurrentPDFState.m_aMapMode.GetScaleX() != m_aCurrentPDFState.m_aMapMode.GetScaleY() )
    {
@@ -6674,6 +6680,7 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool 

        aGlyphs.emplace_back(aPos,
                             pGlyph,
                             pGlyphFont,
                             XUnits(pFace->UnitsPerEm(), nGlyphWidth),
                             nMappedFontObject,
                             nMappedGlyph,
@@ -6763,9 +6770,9 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool 
            }

            if (bVertical)
                drawVerticalGlyphs(aRun, aLine, aAlignOffset, aRotScale, fAngle, fXScale, fSkew, nFontHeight);
                drawVerticalGlyphs(aRun, aLine, aAlignOffset, aRotScale, fAngle, fXScale, nFontHeight);
            else
                drawHorizontalGlyphs(aRun, aLine, aAlignOffset, nStart == 0, fAngle, fXScale, fSkew, nFontHeight, nPixelFontHeight);
                drawHorizontalGlyphs(aRun, aLine, aAlignOffset, nStart == 0, fAngle, fXScale, nFontHeight, nPixelFontHeight);

            if (nCharPos >= 0 && nCharCount)
                aLine.append( "EMC\n" );