[Libreoffice-commits] core.git: include/vcl vcl/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Oct 24 09:53:09 UTC 2018


 include/vcl/outdev.hxx            |   23 +--
 include/vcl/pdfwriter.hxx         |    6 
 vcl/source/gdi/pdfwriter.cxx      |    4 
 vcl/source/gdi/pdfwriter_impl.cxx |  282 +++++++++++++++++---------------------
 vcl/source/gdi/pdfwriter_impl.hxx |   17 --
 vcl/source/gdi/print2.cxx         |    6 
 vcl/source/outdev/font.cxx        |   13 +
 vcl/source/outdev/hatch.cxx       |    4 
 vcl/source/outdev/outdev.cxx      |   15 ++
 9 files changed, 187 insertions(+), 183 deletions(-)

New commits:
commit b85ff98383942360901b8242cf77366782400426
Author:     Jan-Marek Glogowski <glogow at fbihome.de>
AuthorDate: Mon Oct 22 18:34:06 2018 +0000
Commit:     Jan-Marek Glogowski <glogow at fbihome.de>
CommitDate: Wed Oct 24 11:52:43 2018 +0200

    Change PDFWriterImpl into an OutputDevice
    
    It actually changes it into a VirtualDevice and should just be a
    refactoring. We get rid of the crude stuff in a follow up patch,
    
    While at it unfriend PDFWriterImpl from OutputDevice.
    
    Change-Id: Id43731ad076690292c30f9f3e05ff0dd58edc5e5
    Reviewed-on: https://gerrit.libreoffice.org/62201
    Tested-by: Jenkins
    Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>

diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 72d5ae57dca9..4980757a4b1a 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -328,7 +328,6 @@ class VCL_DLLPUBLIC OutputDevice : public virtual VclReferenceBase
     friend class VirtualDevice;
     friend class vcl::Window;
     friend class WorkWindow;
-    friend class vcl::PDFWriterImpl;
     friend void ImplHandleResize( vcl::Window* pWindow, long nNewWidth, long nNewHeight );
 
 private:
@@ -347,7 +346,7 @@ private:
     std::unique_ptr<OutDevStateStack>               mpOutDevStateStack;
     std::unique_ptr<ImplOutDevData>                 mpOutDevData;
     std::vector< VCLXGraphics* >*   mpUnoGraphicsList;
-    vcl::PDFWriterImpl*             mpPDFWriter;
+    VclPtr<OutputDevice>            mpPDFWriter;
     vcl::ExtOutDevData*             mpExtOutDevData;
 
     // TEMP TEMP TEMP
@@ -550,7 +549,7 @@ public:
     */
     bool                        SupportsOperation( OutDevSupportType ) const;
 
-    vcl::PDFWriterImpl*         GetPDFWriter() const { return mpPDFWriter; }
+    vcl::PDFWriterImpl*         GetPDFWriter() const;
 
     void                        SetExtOutDevData( vcl::ExtOutDevData* pExtOutDevData ) { mpExtOutDevData = pExtOutDevData; }
     vcl::ExtOutDevData*         GetExtOutDevData() const { return mpExtOutDevData; }
@@ -1181,12 +1180,13 @@ public:
                                               vcl::TextLayoutCache const* = nullptr) const;
     std::shared_ptr<vcl::TextLayoutCache> CreateTextLayoutCache(OUString const&) const;
 
-private:
-    SAL_DLLPRIVATE void         ImplInitTextColor();
-
+protected:
     SAL_DLLPRIVATE void         ImplInitTextLineSize();
     SAL_DLLPRIVATE void         ImplInitAboveTextLineSize();
-
+    static
+    SAL_DLLPRIVATE long         ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, long nWidth, const OUString& rStr, DrawTextFlags nStyle, const vcl::ITextLayout& _rLayout );
+private:
+    SAL_DLLPRIVATE void         ImplInitTextColor();
 
     SAL_DLLPRIVATE void         ImplDrawTextDirect( SalLayout&, bool bTextLines);
     SAL_DLLPRIVATE void         ImplDrawSpecialText( SalLayout& );
@@ -1202,8 +1202,6 @@ private:
     SAL_DLLPRIVATE void         ImplDrawMnemonicLine( long nX, long nY, long nWidth );
 
 
-    static
-    SAL_DLLPRIVATE long         ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, long nWidth, const OUString& rStr, DrawTextFlags nStyle, const vcl::ITextLayout& _rLayout );
     ///@}
 
 
@@ -1289,12 +1287,15 @@ public:
     SAL_DLLPRIVATE static void  ImplUpdateAllFontData( bool bNewFontLists );
 
 protected:
+    SAL_DLLPRIVATE const LogicalFontInstance* GetFontInstance() const;
+    SAL_DLLPRIVATE long GetEmphasisAscent() const { return mnEmphasisAscent; }
+    SAL_DLLPRIVATE long GetEmphasisDescent() const { return mnEmphasisDescent; }
+    SAL_DLLPRIVATE void SetPDFWriter(vcl::PDFWriterImpl* pPDFWriter);
 
     virtual void                InitFont() const;
     virtual void                SetFontOrientation( LogicalFontInstance* const pFontInstance ) const;
     virtual long                GetFontExtLeading() const;
 
-
 private:
 
     typedef void ( OutputDevice::* FontUpdateHandler_t )( bool );
@@ -1809,8 +1810,6 @@ public:
 
     SAL_DLLPRIVATE DeviceCoordinate LogicWidthToDeviceCoordinate( long nWidth ) const;
 
-private:
-
     /** Convert a logical X coordinate to a device pixel's X coordinate.
 
      To get the device's X coordinate, it must calculate the mapping offset
diff --git a/include/vcl/pdfwriter.hxx b/include/vcl/pdfwriter.hxx
index 04d3e472e649..751f698892f1 100644
--- a/include/vcl/pdfwriter.hxx
+++ b/include/vcl/pdfwriter.hxx
@@ -78,7 +78,11 @@ class VCL_DLLPUBLIC PDFOutputStream
 
 class VCL_DLLPUBLIC PDFWriter
 {
-    std::unique_ptr<PDFWriterImpl> xImplementation;
+    VclPtr<PDFWriterImpl> xImplementation;
+
+    PDFWriter(const PDFWriter&) = delete;
+    PDFWriter& operator=(const PDFWriter&) = delete;
+
 public:
     // extended line info
     enum CapType { capButt, capRound, capSquare };
diff --git a/vcl/source/gdi/pdfwriter.cxx b/vcl/source/gdi/pdfwriter.cxx
index 424f4fa71366..a50b0dd717a2 100644
--- a/vcl/source/gdi/pdfwriter.cxx
+++ b/vcl/source/gdi/pdfwriter.cxx
@@ -29,7 +29,7 @@ PDFWriter::AnyWidget::~AnyWidget()
 
 PDFWriter::PDFWriter( const PDFWriter::PDFWriterContext& rContext, const css::uno::Reference< css::beans::XMaterialHolder >& xEnc )
         :
-        xImplementation( new PDFWriterImpl( rContext, xEnc, *this ) )
+        xImplementation( VclPtr<PDFWriterImpl>::Create(rContext, xEnc, *this) )
 {
 }
 
@@ -39,7 +39,7 @@ PDFWriter::~PDFWriter()
 
 OutputDevice* PDFWriter::GetReferenceDevice()
 {
-    return xImplementation->getReferenceDevice();
+    return xImplementation.get();
 }
 
 void PDFWriter::NewPage( double nPageWidth, double nPageHeight, Orientation eOrientation )
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index badc1af9a11c..5d430e2a560d 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -1359,7 +1359,7 @@ void PDFWriterImpl::PDFPage::appendPoint( const Point& rPoint, OStringBuffer& rB
 {
     Point aPoint( lcl_convert( m_pWriter->m_aGraphicsStack.front().m_aMapMode,
                                m_pWriter->m_aMapMode,
-                               m_pWriter->getReferenceDevice(),
+                               m_pWriter,
                                rPoint ) );
 
     sal_Int32 nValue    = aPoint.X();
@@ -1397,12 +1397,12 @@ void PDFWriterImpl::PDFPage::convertRect( tools::Rectangle& rRect ) const
 {
     Point aLL = lcl_convert( m_pWriter->m_aGraphicsStack.front().m_aMapMode,
                              m_pWriter->m_aMapMode,
-                             m_pWriter->getReferenceDevice(),
+                             m_pWriter,
                              rRect.BottomLeft() + Point( 0, 1 )
                              );
     Size aSize = lcl_convert( m_pWriter->m_aGraphicsStack.front().m_aMapMode,
                               m_pWriter->m_aMapMode,
-                              m_pWriter->getReferenceDevice(),
+                              m_pWriter,
                               rRect.GetSize() );
     rRect.SetLeft( aLL.X() );
     rRect.SetRight( aLL.X() + aSize.Width() );
@@ -1459,7 +1459,7 @@ void PDFWriterImpl::PDFPage::appendPolygon( const basegfx::B2DPolygon& rPoly, OS
 {
     basegfx::B2DPolygon aPoly( lcl_convert( m_pWriter->m_aGraphicsStack.front().m_aMapMode,
                                             m_pWriter->m_aMapMode,
-                                            m_pWriter->getReferenceDevice(),
+                                            m_pWriter,
                                             rPoly ) );
 
     if( basegfx::utils::isRectangle( aPoly ) )
@@ -1553,7 +1553,7 @@ void PDFWriterImpl::PDFPage::appendMappedLength( sal_Int32 nLength, OStringBuffe
     }
     Size aSize( lcl_convert( m_pWriter->m_aGraphicsStack.front().m_aMapMode,
                              m_pWriter->m_aMapMode,
-                             m_pWriter->getReferenceDevice(),
+                             m_pWriter,
                              Size( nValue, nValue ) ) );
     nValue = bVertical ? aSize.Height() : aSize.Width();
     if( pOutLength )
@@ -1566,7 +1566,7 @@ void PDFWriterImpl::PDFPage::appendMappedLength( double fLength, OStringBuffer&
 {
     Size aSize( lcl_convert( m_pWriter->m_aGraphicsStack.front().m_aMapMode,
                              m_pWriter->m_aMapMode,
-                             m_pWriter->getReferenceDevice(),
+                             m_pWriter,
                              Size( 1000, 1000 ) ) );
     fLength *= pixelToPoint(static_cast<double>(bVertical ? aSize.Height() : aSize.Width()) / 1000.0);
     appendDouble( fLength, rBuffer, nPrecision );
@@ -1634,7 +1634,7 @@ bool PDFWriterImpl::PDFPage::appendLineInfo( const LineInfo& rInfo, OStringBuffe
     else if( rInfo.GetWidth() == 0 )
     {
         // "pixel" line
-        appendDouble( 72.0/double(m_pWriter->getReferenceDevice()->GetDPIX()), rBuffer );
+        appendDouble( 72.0/double(m_pWriter->GetDPIX()), rBuffer );
         rBuffer.append( " w\n" );
     }
 
@@ -1683,8 +1683,7 @@ void PDFWriterImpl::PDFPage::appendWaveLine( sal_Int32 nWidth, sal_Int32 nY, sal
  PDFWriterImpl::PDFWriterImpl( const PDFWriter::PDFWriterContext& rContext,
                                const css::uno::Reference< css::beans::XMaterialHolder >& xEnc,
                                PDFWriter& i_rOuterFace)
-        :
-        m_pReferenceDevice( nullptr ),
+        : VirtualDevice(DeviceFormat::DEFAULT),
         m_aMapMode( MapUnit::MapPoint, Point(), Fraction( 1, pointToPixel(1) ), Fraction( 1, pointToPixel(1) ) ),
         m_nCurrentStructElement( 0 ),
         m_bEmitStructure( true ),
@@ -1803,14 +1802,27 @@ void PDFWriterImpl::PDFPage::appendWaveLine( sal_Int32 nWidth, sal_Int32 nY, sal
     m_bIsPDF_A1 = (m_aContext.Version == PDFWriter::PDFVersion::PDF_A_1);
     if( m_bIsPDF_A1 )
         m_aContext.Version = PDFWriter::PDFVersion::PDF_1_4; //meaning we need PDF 1.4, PDF/A flavour
+
+    if( m_aContext.DPIx == 0 || m_aContext.DPIy == 0 )
+        SetReferenceDevice( VirtualDevice::RefDevMode::PDF1 );
+    else
+        SetReferenceDevice( m_aContext.DPIx, m_aContext.DPIy );
+
+    SetOutputSizePixel( Size( 640, 480 ) );
+    SetMapMode(MapMode(MapUnit::MapMM));
+    SetPDFWriter(this);
 }
 
 PDFWriterImpl::~PDFWriterImpl()
 {
-    m_pReferenceDevice.disposeAndClear();
+    disposeOnce();
+}
 
+void PDFWriterImpl::dispose()
+{
     if( m_aCipher )
         rtl_cipher_destroyARCFOUR( m_aCipher );
+    VirtualDevice::dispose();
 }
 
 void PDFWriterImpl::setupDocInfo()
@@ -2158,28 +2170,6 @@ bool PDFWriterImpl::writeBuffer( const void* pBuffer, sal_uInt64 nBytes )
     return nWritten == nBytes;
 }
 
-OutputDevice* PDFWriterImpl::getReferenceDevice()
-{
-    if( ! m_pReferenceDevice )
-    {
-        VclPtrInstance<VirtualDevice> pVDev(DeviceFormat::DEFAULT);
-
-        m_pReferenceDevice = pVDev;
-
-        if( m_aContext.DPIx == 0 || m_aContext.DPIy == 0 )
-            pVDev->SetReferenceDevice( VirtualDevice::RefDevMode::PDF1 );
-        else
-            pVDev->SetReferenceDevice( m_aContext.DPIx, m_aContext.DPIy );
-
-        pVDev->SetOutputSizePixel( Size( 640, 480 ) );
-        pVDev->SetMapMode(MapMode(MapUnit::MapMM));
-
-        m_pReferenceDevice->mpPDFWriter = this;
-        m_pReferenceDevice->ImplUpdateFontData();
-    }
-    return m_pReferenceDevice;
-}
-
 static FontAttributes GetDevFontAttributes( const PDFWriterImpl::BuiltinFont& rBuiltin )
 {
     FontAttributes aDFA;
@@ -2211,7 +2201,7 @@ void PDFWriterImpl::newPage( double nPageWidth, double nPageHeight, PDFWriter::O
     // setup global graphics state
     // linewidth is "1 pixel" by default
     OStringBuffer aBuf( 16 );
-    appendDouble( 72.0/double(getReferenceDevice()->GetDPIX()), aBuf );
+    appendDouble( 72.0/double(GetDPIX()), aBuf );
     aBuf.append( " w\n" );
     writeBuffer( aBuf.getStr(), aBuf.getLength() );
 }
@@ -2864,7 +2854,7 @@ std::map< sal_Int32, sal_Int32 > PDFWriterImpl::emitSystemFont( const PhysicalFo
     sal_Int32 pWidths[256];
     memset( pWidths, 0, sizeof(pWidths) );
 
-    SalGraphics *pGraphics = m_pReferenceDevice->GetGraphics();
+    SalGraphics *pGraphics = GetGraphics();
 
     assert(pGraphics);
 
@@ -3186,7 +3176,7 @@ void PDFWriterImpl::appendBuiltinFontsToDict( OStringBuffer& rDict ) const
 
 bool PDFWriterImpl::emitFonts()
 {
-    SalGraphics *pGraphics = m_pReferenceDevice->GetGraphics();
+    SalGraphics *pGraphics = GetGraphics();
 
     if (!pGraphics)
         return false;
@@ -4162,7 +4152,7 @@ Font PDFWriterImpl::drawFieldBorder( PDFWidget& rIntern,
     {
         if( rWidget.Border && rWidget.BorderColor == COL_TRANSPARENT )
         {
-            sal_Int32 nDelta = getReferenceDevice()->GetDPIX() / 500;
+            sal_Int32 nDelta = GetDPIX() / 500;
             if( nDelta < 1 )
                 nDelta = 1;
             setLineColor( COL_TRANSPARENT );
@@ -6029,7 +6019,7 @@ namespace vcl {
 class PDFStreamIf :
         public cppu::WeakImplHelper< css::io::XOutputStream >
 {
-    PDFWriterImpl*  m_pWriter;
+    VclPtr<PDFWriterImpl>  m_pWriter;
     bool            m_bWrite;
     public:
     explicit PDFStreamIf( PDFWriterImpl* pWriter ) : m_pWriter( pWriter ), m_bWrite( true ) {}
@@ -6183,11 +6173,11 @@ bool PDFWriterImpl::emit()
 
 sal_Int32 PDFWriterImpl::getSystemFont( const vcl::Font& i_rFont )
 {
-    getReferenceDevice()->Push();
-    getReferenceDevice()->SetFont( i_rFont );
-    getReferenceDevice()->ImplNewFont();
+    Push();
+
+    SetFont( i_rFont );
 
-    const PhysicalFontFace* pDevFont = m_pReferenceDevice->mpFontInstance->GetFontFace();
+    const PhysicalFontFace* pDevFont = GetFontInstance()->GetFontFace();
     sal_Int32 nFontID = 0;
     FontEmbedData::iterator it = m_aSystemFonts.find( pDevFont );
     if( it != m_aSystemFonts.end() )
@@ -6199,9 +6189,7 @@ sal_Int32 PDFWriterImpl::getSystemFont( const vcl::Font& i_rFont )
         m_aSystemFonts[ pDevFont ].m_nNormalFontID = nFontID;
     }
 
-    getReferenceDevice()->Pop();
-    getReferenceDevice()->ImplNewFont();
-
+    Pop();
     return nFontID;
 }
 
@@ -6276,7 +6264,7 @@ void PDFWriterImpl::drawRelief( SalLayout& rLayout, const OUString& rText, bool
     setTextLineColor( aReliefColor );
     setOverlineColor( aReliefColor );
     setFont( aSetFont );
-    long nOff = 1 + getReferenceDevice()->mnDPIX/300;
+    long nOff = 1 + GetDPIX()/300;
     if( eRelief == FontRelief::Engraved )
         nOff = -nOff;
 
@@ -6314,7 +6302,7 @@ void PDFWriterImpl::drawShadow( SalLayout& rLayout, const OUString& rText, bool
     setOverlineColor( rFont.GetColor() );
     updateGraphicsState();
 
-    long nOff = 1 + ((m_pReferenceDevice->mpFontInstance->mnLineHeight-24)/24);
+    long nOff = 1 + ((GetFontInstance()->mnLineHeight-24)/24);
     if( rFont.IsOutline() )
         nOff++;
     rLayout.DrawBase() += Point( nOff, nOff );
@@ -6339,7 +6327,7 @@ void PDFWriterImpl::drawVerticalGlyphs(
 {
     long nXOffset = 0;
     Point aCurPos( rGlyphs[0].m_aPos );
-    aCurPos = m_pReferenceDevice->PixelToLogic( aCurPos );
+    aCurPos = PixelToLogic( aCurPos );
     aCurPos += rAlignOffset;
     for( size_t i = 0; i < rGlyphs.size(); i++ )
     {
@@ -6354,14 +6342,14 @@ void PDFWriterImpl::drawVerticalGlyphs(
         if (rGlyphs[i].m_pGlyph->IsVertical())
         {
             fDeltaAngle = M_PI/2.0;
-            aDeltaPos.setX( m_pReferenceDevice->GetFontMetric().GetAscent() );
-            aDeltaPos.setY( static_cast<int>(static_cast<double>(m_pReferenceDevice->GetFontMetric().GetDescent()) * fXScale) );
+            aDeltaPos.setX( GetFontMetric().GetAscent() );
+            aDeltaPos.setY( static_cast<int>(static_cast<double>(GetFontMetric().GetDescent()) * fXScale) );
             fYScale = fXScale;
             fTempXScale = 1.0;
             fSkewA = -fSkewB;
             fSkewB = 0.0;
         }
-        aDeltaPos += (m_pReferenceDevice->PixelToLogic( Point( static_cast<int>(static_cast<double>(nXOffset)/fXScale), 0 ) ) - m_pReferenceDevice->PixelToLogic( Point() ) );
+        aDeltaPos += (PixelToLogic( Point( static_cast<int>(static_cast<double>(nXOffset)/fXScale), 0 ) ) - PixelToLogic( Point() ) );
         if( i < rGlyphs.size()-1 )
         // #i120627# the text on the Y axis is reversed when export ppt file to PDF format
         {
@@ -6433,7 +6421,7 @@ void PDFWriterImpl::drawHorizontalGlyphs(
         // setup text matrix
         Point aCurPos = rGlyphs[nBeginRun].m_aPos;
         // back transformation to current coordinate system
-        aCurPos = m_pReferenceDevice->PixelToLogic( aCurPos );
+        aCurPos = PixelToLogic( aCurPos );
         aCurPos += rAlignOffset;
         // the first run can be set with "Td" operator
         // subsequent use of that operator would move
@@ -6522,32 +6510,30 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
     int nIndex = 0;
     double fXScale = 1.0;
     double fSkew = 0.0;
-    sal_Int32 nPixelFontHeight = m_pReferenceDevice->mpFontInstance->GetFontSelectPattern().mnHeight;
+    sal_Int32 nPixelFontHeight = GetFontInstance()->GetFontSelectPattern().mnHeight;
     TextAlign eAlign = m_aCurrentPDFState.m_aFont.GetAlignment();
 
     // transform font height back to current units
     // note: the layout calculates in outdevs device pixel !!
-    sal_Int32 nFontHeight = m_pReferenceDevice->ImplDevicePixelToLogicHeight( nPixelFontHeight );
+    sal_Int32 nFontHeight = ImplDevicePixelToLogicHeight( nPixelFontHeight );
     if( m_aCurrentPDFState.m_aFont.GetAverageFontWidth() )
     {
         Font aFont( m_aCurrentPDFState.m_aFont );
         aFont.SetAverageFontWidth( 0 );
-        FontMetric aMetric = m_pReferenceDevice->GetFontMetric( aFont );
+        FontMetric aMetric = GetFontMetric( aFont );
         if( aMetric.GetAverageFontWidth() != m_aCurrentPDFState.m_aFont.GetAverageFontWidth() )
         {
             fXScale =
                 static_cast<double>(m_aCurrentPDFState.m_aFont.GetAverageFontWidth()) /
                 static_cast<double>(aMetric.GetAverageFontWidth());
         }
-        // force state before GetFontMetric
-        m_pReferenceDevice->ImplNewFont();
     }
 
     // perform artificial italics if necessary
     if( ( m_aCurrentPDFState.m_aFont.GetItalic() == ITALIC_NORMAL ||
           m_aCurrentPDFState.m_aFont.GetItalic() == ITALIC_OBLIQUE ) &&
-        !( m_pReferenceDevice->mpFontInstance->GetFontFace()->GetItalic() == ITALIC_NORMAL ||
-           m_pReferenceDevice->mpFontInstance->GetFontFace()->GetItalic() == ITALIC_OBLIQUE )
+        !( GetFontInstance()->GetFontFace()->GetItalic() == ITALIC_NORMAL ||
+           GetFontInstance()->GetFontFace()->GetItalic() == ITALIC_OBLIQUE )
         )
     {
         fSkew = M_PI/12.0;
@@ -6574,8 +6560,8 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
     bool bPop = false;
     bool bABold = false;
     // artificial bold necessary ?
-    if( m_pReferenceDevice->mpFontInstance->GetFontFace()->GetWeight() <= WEIGHT_MEDIUM &&
-        m_pReferenceDevice->mpFontInstance->GetFontSelectPattern().GetWeight() > WEIGHT_MEDIUM )
+    if( GetFontInstance()->GetFontFace()->GetWeight() <= WEIGHT_MEDIUM &&
+        GetFontInstance()->GetFontSelectPattern().GetWeight() > WEIGHT_MEDIUM )
     {
         if( ! bPop )
             aLine.append( "q " );
@@ -6635,8 +6621,8 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
         }
     }
 
-    FontMetric aRefDevFontMetric = m_pReferenceDevice->GetFontMetric();
-    const PhysicalFontFace* pDevFont = m_pReferenceDevice->mpFontInstance->GetFontFace();
+    FontMetric aRefDevFontMetric = GetFontMetric();
+    const PhysicalFontFace* pDevFont = GetFontInstance()->GetFontFace();
 
     // collect the glyphs into a single array
     std::vector< PDFGlyph > aGlyphs;
@@ -6704,15 +6690,12 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
         registerGlyph(pGlyph, pFont, aCodeUnits, nMappedGlyph, nMappedFontObject);
 
         sal_Int32 nGlyphWidth = 0;
-        if (m_pReferenceDevice->AcquireGraphics())
-        {
-            SalGraphics *pGraphics = m_pReferenceDevice->GetGraphics();
-            if (pGraphics)
-                nGlyphWidth = m_aFontCache.getGlyphWidth(pFont,
-                                                         pGlyph->maGlyphId,
-                                                         pGlyph->IsVertical(),
-                                                         pGraphics);
-        }
+        SalGraphics *pGraphics = GetGraphics();
+        if (pGraphics)
+            nGlyphWidth = m_aFontCache.getGlyphWidth(pFont,
+                                                     pGlyph->maGlyphId,
+                                                     pGlyph->IsVertical(),
+                                                     pGraphics);
 
         int nCharPos = -1;
         if (bUseActualText || pGlyph->IsInCluster())
@@ -6742,18 +6725,18 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
         // ascent / descent to match the on-screen rendering.
         tools::Rectangle aRectangle;
         // This is the top left of the text without ascent / descent.
-        aRectangle.SetPos(m_pReferenceDevice->PixelToLogic(rLayout.GetDrawPosition()));
+        aRectangle.SetPos(PixelToLogic(rLayout.GetDrawPosition()));
         aRectangle.setY(aRectangle.getY() - aRefDevFontMetric.GetAscent());
-        aRectangle.SetSize(m_pReferenceDevice->PixelToLogic(Size(rLayout.GetTextWidth(), 0)));
+        aRectangle.SetSize(PixelToLogic(Size(rLayout.GetTextWidth(), 0)));
         // This includes ascent / descent.
         aRectangle.setHeight(aRefDevFontMetric.GetLineHeight());
 
-        LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance.get();
+        const LogicalFontInstance* pFontInstance = GetFontInstance();
         if (pFontInstance->mnOrientation)
         {
             // Adapt rectangle for rotated text.
             tools::Polygon aPolygon(aRectangle);
-            aPolygon.Rotate(m_pReferenceDevice->PixelToLogic(rLayout.GetDrawPosition()), pFontInstance->mnOrientation);
+            aPolygon.Rotate(PixelToLogic(rLayout.GetDrawPosition()), pFontInstance->mnOrientation);
             drawPolygon(aPolygon);
         }
         else
@@ -6856,8 +6839,8 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
                 }
                 else if( nWidth > 0 )
                 {
-                    drawTextLine( m_pReferenceDevice->PixelToLogic( aStartPt ),
-                                  m_pReferenceDevice->ImplDevicePixelToLogicWidth( nWidth ),
+                    drawTextLine( PixelToLogic( aStartPt ),
+                                  ImplDevicePixelToLogicWidth( nWidth ),
                                   eStrikeout, eUnderline, eOverline, bUnderlineAbove );
                     nWidth = 0;
                 }
@@ -6865,8 +6848,8 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
 
             if( nWidth > 0 )
             {
-                drawTextLine( m_pReferenceDevice->PixelToLogic( aStartPt ),
-                              m_pReferenceDevice->ImplDevicePixelToLogicWidth( nWidth ),
+                drawTextLine( PixelToLogic( aStartPt ),
+                              ImplDevicePixelToLogicWidth( nWidth ),
                               eStrikeout, eUnderline, eOverline, bUnderlineAbove );
             }
         }
@@ -6874,8 +6857,8 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
         {
             Point aStartPt = rLayout.GetDrawPosition();
             int nWidth = rLayout.GetTextWidth() / rLayout.GetUnitsPerPixel();
-            drawTextLine( m_pReferenceDevice->PixelToLogic( aStartPt ),
-                          m_pReferenceDevice->ImplDevicePixelToLogicWidth( nWidth ),
+            drawTextLine( PixelToLogic( aStartPt ),
+                          ImplDevicePixelToLogicWidth( nWidth ),
                           eStrikeout, eUnderline, eOverline, bUnderlineAbove );
         }
     }
@@ -6900,17 +6883,17 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
 
     nEmphMark = OutputDevice::ImplGetEmphasisMarkStyle( m_aCurrentPDFState.m_aFont );
     if ( nEmphMark & FontEmphasisMark::PosBelow )
-        nEmphHeight = m_pReferenceDevice->mnEmphasisDescent;
+        nEmphHeight = GetEmphasisDescent();
     else
-        nEmphHeight = m_pReferenceDevice->mnEmphasisAscent;
-    m_pReferenceDevice->ImplGetEmphasisMark( aEmphPoly,
+        nEmphHeight = GetEmphasisAscent();
+    ImplGetEmphasisMark( aEmphPoly,
                                              bEmphPolyLine,
                                              aEmphRect1,
                                              aEmphRect2,
                                              nEmphYOff,
                                              nEmphWidth,
                                              nEmphMark,
-                                             m_pReferenceDevice->ImplDevicePixelToLogicWidth(nEmphHeight) );
+                                             ImplDevicePixelToLogicWidth(nEmphHeight) );
     if ( bEmphPolyLine )
     {
         setLineColor( m_aCurrentPDFState.m_aFont.GetColor() );
@@ -6926,18 +6909,18 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
     Point aOffset = Point(0,0);
 
     if ( nEmphMark & FontEmphasisMark::PosBelow )
-        aOffset.AdjustY(m_pReferenceDevice->mpFontInstance->mxFontMetric->GetDescent() + nEmphYOff );
+        aOffset.AdjustY(GetFontInstance()->mxFontMetric->GetDescent() + nEmphYOff );
     else
-        aOffset.AdjustY( -(m_pReferenceDevice->mpFontInstance->mxFontMetric->GetAscent() + nEmphYOff) );
+        aOffset.AdjustY( -(GetFontInstance()->mxFontMetric->GetAscent() + nEmphYOff) );
 
     long nEmphWidth2     = nEmphWidth / 2;
     long nEmphHeight2    = nEmphHeight / 2;
     aOffset += Point( nEmphWidth2, nEmphHeight2 );
 
     if ( eAlign == ALIGN_BOTTOM )
-        aOffset.AdjustY( -(m_pReferenceDevice->mpFontInstance->mxFontMetric->GetDescent()) );
+        aOffset.AdjustY( -(GetFontInstance()->mxFontMetric->GetDescent()) );
     else if ( eAlign == ALIGN_TOP )
-        aOffset.AdjustY(m_pReferenceDevice->mpFontInstance->mxFontMetric->GetAscent() );
+        aOffset.AdjustY(GetFontInstance()->mxFontMetric->GetAscent() );
 
     nIndex = 0;
     while (rLayout.GetNextGlyph(&pGlyph, aPos, nIndex))
@@ -6951,7 +6934,7 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
             aAdjOffset -= Point( nEmphWidth2, nEmphHeight2 );
 
             aPos += aAdjOffset;
-            aPos = m_pReferenceDevice->PixelToLogic( aPos );
+            aPos = PixelToLogic( aPos );
             drawEmphasisMark( aPos.X(), aPos.Y(),
                               aEmphPoly, bEmphPolyLine,
                               aEmphRect1, aEmphRect2 );
@@ -7010,7 +6993,7 @@ void PDFWriterImpl::drawText( const Point& rPos, const OUString& rText, sal_Int3
 
     // get a layout from the OutputDevice's SalGraphics
     // this also enforces font substitution and sets the font on SalGraphics
-    std::unique_ptr<SalLayout> pLayout = m_pReferenceDevice->ImplLayout( rText, nIndex, nLen, rPos );
+    std::unique_ptr<SalLayout> pLayout = ImplLayout( rText, nIndex, nLen, rPos );
     if( pLayout )
     {
         drawLayout( *pLayout, rText, bTextLines );
@@ -7025,7 +7008,7 @@ void PDFWriterImpl::drawTextArray( const Point& rPos, const OUString& rText, con
 
     // get a layout from the OutputDevice's SalGraphics
     // this also enforces font substitution and sets the font on SalGraphics
-    std::unique_ptr<SalLayout> pLayout = m_pReferenceDevice->ImplLayout( rText, nIndex, nLen, rPos, 0, pDXArray );
+    std::unique_ptr<SalLayout> pLayout = ImplLayout( rText, nIndex, nLen, rPos, 0, pDXArray );
     if( pLayout )
     {
         drawLayout( *pLayout, rText, true );
@@ -7040,7 +7023,7 @@ void PDFWriterImpl::drawStretchText( const Point& rPos, sal_uLong nWidth, const
 
     // get a layout from the OutputDevice's SalGraphics
     // this also enforces font substitution and sets the font on SalGraphics
-    std::unique_ptr<SalLayout> pLayout = m_pReferenceDevice->ImplLayout( rText, nIndex, nLen, rPos, nWidth );
+    std::unique_ptr<SalLayout> pLayout = ImplLayout( rText, nIndex, nLen, rPos, nWidth );
     if( pLayout )
     {
         drawLayout( *pLayout, rText, true );
@@ -7070,7 +7053,7 @@ void PDFWriterImpl::drawText( const tools::Rectangle& rRect, const OUString& rOr
 
     Point       aPos            = rRect.TopLeft();
 
-    long        nTextHeight     = m_pReferenceDevice->GetTextHeight();
+    long        nTextHeight     = GetTextHeight();
     sal_Int32   nMnemonicPos    = -1;
 
     OUString aStr = rOrigStr;
@@ -7089,7 +7072,7 @@ void PDFWriterImpl::drawText( const tools::Rectangle& rRect, const OUString& rOr
 
         if ( nTextHeight )
         {
-            vcl::DefaultTextLayout aLayout( *m_pReferenceDevice );
+            vcl::DefaultTextLayout aLayout( *this );
             OutputDevice::ImplGetTextLines( aMultiLineInfo, nWidth, aStr, nStyle, aLayout );
             nLines = nHeight/nTextHeight;
             nFormatLines = aMultiLineInfo.Count();
@@ -7106,7 +7089,7 @@ void PDFWriterImpl::drawText( const tools::Rectangle& rRect, const OUString& rOr
                     aLastLine = convertLineEnd(aStr.copy(pLineInfo->GetIndex()), LINEEND_LF);
                     // replace line feed by space
                     aLastLine = aLastLine.replace('\n', ' ');
-                    aLastLine = m_pReferenceDevice->GetEllipsisString( aLastLine, nWidth, nStyle );
+                    aLastLine = GetEllipsisString( aLastLine, nWidth, nStyle );
                     nStyle &= ~DrawTextFlags(DrawTextFlags::VCenter | DrawTextFlags::Bottom);
                     nStyle |= DrawTextFlags::Top;
                 }
@@ -7142,17 +7125,17 @@ void PDFWriterImpl::drawText( const tools::Rectangle& rRect, const OUString& rOr
     }
     else
     {
-        long nTextWidth = m_pReferenceDevice->GetTextWidth( aStr );
+        long nTextWidth = GetTextWidth( aStr );
 
         // Evt. Text kuerzen
         if ( nTextWidth > nWidth )
         {
             if ( nStyle & (DrawTextFlags::EndEllipsis | DrawTextFlags::PathEllipsis | DrawTextFlags::NewsEllipsis) )
             {
-                aStr = m_pReferenceDevice->GetEllipsisString( aStr, nWidth, nStyle );
+                aStr = GetEllipsisString( aStr, nWidth, nStyle );
                 nStyle &= ~DrawTextFlags(DrawTextFlags::Center | DrawTextFlags::Right);
                 nStyle |= DrawTextFlags::Left;
-                nTextWidth = m_pReferenceDevice->GetTextWidth( aStr );
+                nTextWidth = GetTextWidth( aStr );
             }
         }
 
@@ -7233,12 +7216,12 @@ void PDFWriterImpl::drawLine( const Point& rStart, const Point& rStop, const Lin
     }
 }
 
-#define HCONV( x ) m_pReferenceDevice->ImplDevicePixelToLogicHeight( x )
+#define HCONV( x ) ImplDevicePixelToLogicHeight( x )
 
 void PDFWriterImpl::drawWaveTextLine( OStringBuffer& aLine, long nWidth, FontLineStyle eTextLine, Color aColor, bool bIsAbove )
 {
     // note: units in pFontInstance are ref device pixel
-    LogicalFontInstance*  pFontInstance = m_pReferenceDevice->mpFontInstance.get();
+    const LogicalFontInstance*  pFontInstance = GetFontInstance();
     long            nLineHeight = 0;
     long            nLinePos = 0;
 
@@ -7248,21 +7231,21 @@ void PDFWriterImpl::drawWaveTextLine( OStringBuffer& aLine, long nWidth, FontLin
     if ( bIsAbove )
     {
         if ( !pFontInstance->mxFontMetric->GetAboveWavelineUnderlineSize() )
-            m_pReferenceDevice->ImplInitAboveTextLineSize();
+            ImplInitAboveTextLineSize();
         nLineHeight = HCONV( pFontInstance->mxFontMetric->GetAboveWavelineUnderlineSize() );
         nLinePos = HCONV( pFontInstance->mxFontMetric->GetAboveWavelineUnderlineOffset() );
     }
     else
     {
         if ( !pFontInstance->mxFontMetric->GetWavelineUnderlineSize() )
-            m_pReferenceDevice->ImplInitTextLineSize();
+            ImplInitTextLineSize();
         nLineHeight = HCONV( pFontInstance->mxFontMetric->GetWavelineUnderlineSize() );
         nLinePos = HCONV( pFontInstance->mxFontMetric->GetWavelineUnderlineOffset() );
     }
     if ( (eTextLine == LINESTYLE_SMALLWAVE) && (nLineHeight > 3) )
         nLineHeight = 3;
 
-    long nLineWidth = getReferenceDevice()->mnDPIX/450;
+    long nLineWidth = GetDPIX()/450;
     if ( ! nLineWidth )
         nLineWidth = 1;
 
@@ -7308,7 +7291,7 @@ void PDFWriterImpl::drawWaveTextLine( OStringBuffer& aLine, long nWidth, FontLin
 void PDFWriterImpl::drawStraightTextLine( OStringBuffer& aLine, long nWidth, FontLineStyle eTextLine, Color aColor, bool bIsAbove )
 {
     // note: units in pFontInstance are ref device pixel
-    LogicalFontInstance*  pFontInstance = m_pReferenceDevice->mpFontInstance.get();
+    const LogicalFontInstance*  pFontInstance = GetFontInstance();
     long            nLineHeight = 0;
     long            nLinePos  = 0;
     long            nLinePos2 = 0;
@@ -7327,14 +7310,14 @@ void PDFWriterImpl::drawStraightTextLine( OStringBuffer& aLine, long nWidth, Fon
             if ( bIsAbove )
             {
                 if ( !pFontInstance->mxFontMetric->GetAboveUnderlineSize() )
-                    m_pReferenceDevice->ImplInitAboveTextLineSize();
+                    ImplInitAboveTextLineSize();
                 nLineHeight = HCONV( pFontInstance->mxFontMetric->GetAboveUnderlineSize() );
                 nLinePos    = HCONV( pFontInstance->mxFontMetric->GetAboveUnderlineOffset() );
             }
             else
             {
                 if ( !pFontInstance->mxFontMetric->GetUnderlineSize() )
-                    m_pReferenceDevice->ImplInitTextLineSize();
+                    ImplInitTextLineSize();
                 nLineHeight = HCONV( pFontInstance->mxFontMetric->GetUnderlineSize() );
                 nLinePos    = HCONV( pFontInstance->mxFontMetric->GetUnderlineOffset() );
             }
@@ -7348,14 +7331,14 @@ void PDFWriterImpl::drawStraightTextLine( OStringBuffer& aLine, long nWidth, Fon
             if ( bIsAbove )
             {
                 if ( !pFontInstance->mxFontMetric->GetAboveBoldUnderlineSize() )
-                    m_pReferenceDevice->ImplInitAboveTextLineSize();
+                    ImplInitAboveTextLineSize();
                 nLineHeight = HCONV( pFontInstance->mxFontMetric->GetAboveBoldUnderlineSize() );
                 nLinePos    = HCONV( pFontInstance->mxFontMetric->GetAboveBoldUnderlineOffset() );
             }
             else
             {
                 if ( !pFontInstance->mxFontMetric->GetBoldUnderlineSize() )
-                    m_pReferenceDevice->ImplInitTextLineSize();
+                    ImplInitTextLineSize();
                 nLineHeight = HCONV( pFontInstance->mxFontMetric->GetBoldUnderlineSize() );
                 nLinePos    = HCONV( pFontInstance->mxFontMetric->GetBoldUnderlineOffset() );
                 nLinePos += nLineHeight/2;
@@ -7365,7 +7348,7 @@ void PDFWriterImpl::drawStraightTextLine( OStringBuffer& aLine, long nWidth, Fon
             if ( bIsAbove )
             {
                 if ( !pFontInstance->mxFontMetric->GetAboveDoubleUnderlineSize() )
-                    m_pReferenceDevice->ImplInitAboveTextLineSize();
+                    ImplInitAboveTextLineSize();
                 nLineHeight = HCONV( pFontInstance->mxFontMetric->GetAboveDoubleUnderlineSize() );
                 nLinePos    = HCONV( pFontInstance->mxFontMetric->GetAboveDoubleUnderlineOffset1() );
                 nLinePos2   = HCONV( pFontInstance->mxFontMetric->GetAboveDoubleUnderlineOffset2() );
@@ -7373,7 +7356,7 @@ void PDFWriterImpl::drawStraightTextLine( OStringBuffer& aLine, long nWidth, Fon
             else
             {
                 if ( !pFontInstance->mxFontMetric->GetDoubleUnderlineSize() )
-                    m_pReferenceDevice->ImplInitTextLineSize();
+                    ImplInitTextLineSize();
                 nLineHeight = HCONV( pFontInstance->mxFontMetric->GetDoubleUnderlineSize() );
                 nLinePos    = HCONV( pFontInstance->mxFontMetric->GetDoubleUnderlineOffset1() );
                 nLinePos2   = HCONV( pFontInstance->mxFontMetric->GetDoubleUnderlineOffset2() );
@@ -7500,7 +7483,7 @@ void PDFWriterImpl::drawStraightTextLine( OStringBuffer& aLine, long nWidth, Fon
 void PDFWriterImpl::drawStrikeoutLine( OStringBuffer& aLine, long nWidth, FontStrikeout eStrikeout, Color aColor )
 {
     // note: units in pFontInstance are ref device pixel
-    LogicalFontInstance*  pFontInstance = m_pReferenceDevice->mpFontInstance.get();
+    const LogicalFontInstance*  pFontInstance = GetFontInstance();
     long            nLineHeight = 0;
     long            nLinePos  = 0;
     long            nLinePos2 = 0;
@@ -7512,19 +7495,19 @@ void PDFWriterImpl::drawStrikeoutLine( OStringBuffer& aLine, long nWidth, FontSt
     {
         case STRIKEOUT_SINGLE:
             if ( !pFontInstance->mxFontMetric->GetStrikeoutSize() )
-                m_pReferenceDevice->ImplInitTextLineSize();
+                ImplInitTextLineSize();
             nLineHeight = HCONV( pFontInstance->mxFontMetric->GetStrikeoutSize() );
             nLinePos    = HCONV( pFontInstance->mxFontMetric->GetStrikeoutOffset() );
             break;
         case STRIKEOUT_BOLD:
             if ( !pFontInstance->mxFontMetric->GetBoldStrikeoutSize() )
-                m_pReferenceDevice->ImplInitTextLineSize();
+                ImplInitTextLineSize();
             nLineHeight = HCONV( pFontInstance->mxFontMetric->GetBoldStrikeoutSize() );
             nLinePos    = HCONV( pFontInstance->mxFontMetric->GetBoldStrikeoutOffset() );
             break;
         case STRIKEOUT_DOUBLE:
             if ( !pFontInstance->mxFontMetric->GetDoubleStrikeoutSize() )
-                m_pReferenceDevice->ImplInitTextLineSize();
+                ImplInitTextLineSize();
             nLineHeight = HCONV( pFontInstance->mxFontMetric->GetDoubleStrikeoutSize() );
             nLinePos    = HCONV( pFontInstance->mxFontMetric->GetDoubleStrikeoutOffset1() );
             nLinePos2   = HCONV( pFontInstance->mxFontMetric->GetDoubleStrikeoutOffset2() );
@@ -7569,11 +7552,11 @@ void PDFWriterImpl::drawStrikeoutChar( const Point& rPos, long nWidth, FontStrik
 
     OUString aStrikeoutChar = eStrikeout == STRIKEOUT_SLASH ? OUString( "/" ) : OUString( "X" );
     OUString aStrikeout = aStrikeoutChar;
-    while( m_pReferenceDevice->GetTextWidth( aStrikeout ) < nWidth )
+    while( GetTextWidth( aStrikeout ) < nWidth )
         aStrikeout += aStrikeout;
 
     // do not get broader than nWidth modulo 1 character
-    while( m_pReferenceDevice->GetTextWidth( aStrikeout ) >= nWidth )
+    while( GetTextWidth( aStrikeout ) >= nWidth )
         aStrikeout = aStrikeout.replaceAt( 0, 1, "" );
     aStrikeout += aStrikeoutChar;
     bool bShadow = m_aCurrentPDFState.m_aFont.IsShadow();
@@ -7586,18 +7569,18 @@ void PDFWriterImpl::drawStrikeoutChar( const Point& rPos, long nWidth, FontStrik
     }
 
     // strikeout string is left aligned non-CTL text
-    ComplexTextLayoutFlags nOrigTLM = m_pReferenceDevice->GetLayoutMode();
-    m_pReferenceDevice->SetLayoutMode(ComplexTextLayoutFlags::BiDiStrong);
+    ComplexTextLayoutFlags nOrigTLM = GetLayoutMode();
+    SetLayoutMode(ComplexTextLayoutFlags::BiDiStrong);
 
     push( PushFlags::CLIPREGION );
-    FontMetric aRefDevFontMetric = m_pReferenceDevice->GetFontMetric();
+    FontMetric aRefDevFontMetric = GetFontMetric();
     tools::Rectangle aRect;
     aRect.SetLeft( rPos.X() );
     aRect.SetRight( aRect.Left()+nWidth );
     aRect.SetBottom( rPos.Y()+aRefDevFontMetric.GetDescent() );
     aRect.SetTop( rPos.Y()-aRefDevFontMetric.GetAscent() );
 
-    LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance.get();
+    const LogicalFontInstance* pFontInstance = GetFontInstance();
     if (pFontInstance->mnOrientation)
     {
         tools::Polygon aPoly( aRect );
@@ -7609,7 +7592,7 @@ void PDFWriterImpl::drawStrikeoutChar( const Point& rPos, long nWidth, FontStrik
     drawText( rPos, aStrikeout, 0, aStrikeout.getLength(), false );
     pop();
 
-    m_pReferenceDevice->SetLayoutMode( nOrigTLM );
+    SetLayoutMode( nOrigTLM );
 
     if ( bShadow )
     {
@@ -7632,7 +7615,7 @@ void PDFWriterImpl::drawTextLine( const Point& rPos, long nWidth, FontStrikeout
     updateGraphicsState();
 
     // note: units in pFontInstance are ref device pixel
-    LogicalFontInstance* pFontInstance = m_pReferenceDevice->mpFontInstance.get();
+    const LogicalFontInstance* pFontInstance = GetFontInstance();
     Color           aUnderlineColor = m_aCurrentPDFState.m_aTextLineColor;
     Color           aOverlineColor  = m_aCurrentPDFState.m_aOverlineColor;
     Color           aStrikeoutColor = m_aCurrentPDFState.m_aFont.GetColor();
@@ -7871,7 +7854,7 @@ void PDFWriterImpl::beginRedirect( SvStream* pStream, const tools::Rectangle& rT
         m_aOutputStreams.front().m_aTargetRect =
             lcl_convert( m_aGraphicsStack.front().m_aMapMode,
                          m_aMapMode,
-                         getReferenceDevice(),
+                         this,
                          rTargetRect );
         Point aDelta = m_aOutputStreams.front().m_aTargetRect.BottomLeft();
         long nPageHeight = pointToPixel(m_aPages[m_nCurrentPage].getHeight());
@@ -8499,9 +8482,9 @@ void PDFWriterImpl::drawPixel( const Point& rPoint, const Color& rColor )
     OStringBuffer aLine( 20 );
     m_aPages.back().appendPoint( rPoint, aLine );
     aLine.append( ' ' );
-    appendDouble( 1.0/double(getReferenceDevice()->GetDPIX()), aLine );
+    appendDouble( 1.0/double(GetDPIX()), aLine );
     aLine.append( ' ' );
-    appendDouble( 1.0/double(getReferenceDevice()->GetDPIY()), aLine );
+    appendDouble( 1.0/double(GetDPIY()), aLine );
     aLine.append( " re f\n" );
     writeBuffer( aLine.getStr(), aLine.getLength() );
 
@@ -9156,13 +9139,13 @@ void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit)
 
     // Count /Matrix and /BBox.
     // vcl::ImportPDF() works with 96 DPI so use the same values here, too.
-    sal_Int32 nOldDPIX = getReferenceDevice()->GetDPIX();
-    getReferenceDevice()->SetDPIX(96);
-    sal_Int32 nOldDPIY = getReferenceDevice()->GetDPIY();
-    getReferenceDevice()->SetDPIY(96);
-    Size aSize = getReferenceDevice()->PixelToLogic(rEmit.m_aPixelSize, MapMode(m_aMapMode.GetMapUnit()));
-    getReferenceDevice()->SetDPIX(nOldDPIX);
-    getReferenceDevice()->SetDPIY(nOldDPIY);
+    sal_Int32 nOldDPIX = GetDPIX();
+    SetDPIX(96);
+    sal_Int32 nOldDPIY = GetDPIY();
+    SetDPIY(96);
+    Size aSize = PixelToLogic(rEmit.m_aPixelSize, MapMode(m_aMapMode.GetMapUnit()));
+    SetDPIX(nOldDPIX);
+    SetDPIY(nOldDPIY);
     double fScaleX = 1.0 / aSize.Width();
     double fScaleY = 1.0 / aSize.Height();
 
@@ -9943,7 +9926,7 @@ sal_Int32 PDFWriterImpl::createGradient( const Gradient& rGradient, const Size&
 {
     Size aPtSize( lcl_convert( m_aGraphicsStack.front().m_aMapMode,
                                MapMode( MapUnit::MapPoint ),
-                               getReferenceDevice(),
+                               this,
                                rSize ) );
     // check if we already have this gradient
     // rounding to point will generally lose some pixels
@@ -10028,7 +10011,7 @@ void PDFWriterImpl::drawHatch( const tools::PolyPolygon& rPolyPoly, const Hatch&
         aPolyPoly.Optimize( PolyOptimizeFlags::NO_SAME );
         push( PushFlags::LINECOLOR );
         setLineColor( rHatch.GetColor() );
-        getReferenceDevice()->DrawHatch( aPolyPoly, rHatch, false );
+        DrawHatch( aPolyPoly, rHatch, false );
         pop();
     }
 }
@@ -10049,7 +10032,7 @@ void PDFWriterImpl::drawWallpaper( const tools::Rectangle& rRect, const Wallpape
         aBitmap = rWall.GetBitmap();
         aBmpSize = lcl_convert( aBitmap.GetPrefMapMode(),
                                 getMapMode(),
-                                getReferenceDevice(),
+                                this,
                                 aBitmap.GetPrefSize() );
         tools::Rectangle aRect( rRect );
         if( rWall.IsRect() )
@@ -10230,7 +10213,7 @@ void PDFWriterImpl::updateGraphicsState(Mode const mode)
                 // clip region is always stored in private PDF mapmode
                 MapMode aNewMapMode = rNewState.m_aMapMode;
                 rNewState.m_aMapMode = m_aMapMode;
-                getReferenceDevice()->SetMapMode( rNewState.m_aMapMode );
+                SetMapMode( rNewState.m_aMapMode );
                 m_aCurrentPDFState.m_aMapMode = rNewState.m_aMapMode;
 
                 aLine.append("q ");
@@ -10241,7 +10224,7 @@ void PDFWriterImpl::updateGraphicsState(Mode const mode)
                 }
 
                 rNewState.m_aMapMode = aNewMapMode;
-                getReferenceDevice()->SetMapMode( rNewState.m_aMapMode );
+                SetMapMode( rNewState.m_aMapMode );
                 m_aCurrentPDFState.m_aMapMode = rNewState.m_aMapMode;
             }
         }
@@ -10250,26 +10233,25 @@ void PDFWriterImpl::updateGraphicsState(Mode const mode)
     if( rNewState.m_nUpdateFlags & GraphicsStateUpdateFlags::MapMode )
     {
         rNewState.m_nUpdateFlags &= ~GraphicsStateUpdateFlags::MapMode;
-        getReferenceDevice()->SetMapMode( rNewState.m_aMapMode );
+        SetMapMode( rNewState.m_aMapMode );
     }
 
     if( rNewState.m_nUpdateFlags & GraphicsStateUpdateFlags::Font )
     {
         rNewState.m_nUpdateFlags &= ~GraphicsStateUpdateFlags::Font;
-        getReferenceDevice()->SetFont( rNewState.m_aFont );
-        getReferenceDevice()->ImplNewFont();
+        SetFont( rNewState.m_aFont );
     }
 
     if( rNewState.m_nUpdateFlags & GraphicsStateUpdateFlags::LayoutMode )
     {
         rNewState.m_nUpdateFlags &= ~GraphicsStateUpdateFlags::LayoutMode;
-        getReferenceDevice()->SetLayoutMode( rNewState.m_nLayoutMode );
+        SetLayoutMode( rNewState.m_nLayoutMode );
     }
 
     if( rNewState.m_nUpdateFlags & GraphicsStateUpdateFlags::DigitLanguage )
     {
         rNewState.m_nUpdateFlags &= ~GraphicsStateUpdateFlags::DigitLanguage;
-        getReferenceDevice()->SetDigitLanguage( rNewState.m_aDigitLanguage );
+        SetDigitLanguage( rNewState.m_aDigitLanguage );
     }
 
     if( rNewState.m_nUpdateFlags & GraphicsStateUpdateFlags::LineColor )
@@ -10378,14 +10360,14 @@ void PDFWriterImpl::pop()
 void PDFWriterImpl::setMapMode( const MapMode& rMapMode )
 {
     m_aGraphicsStack.front().m_aMapMode = rMapMode;
-    getReferenceDevice()->SetMapMode( rMapMode );
+    SetMapMode( rMapMode );
     m_aCurrentPDFState.m_aMapMode = rMapMode;
 }
 
 void PDFWriterImpl::setClipRegion( const basegfx::B2DPolyPolygon& rRegion )
 {
-    basegfx::B2DPolyPolygon aRegion = getReferenceDevice()->LogicToPixel( rRegion, m_aGraphicsStack.front().m_aMapMode );
-    aRegion = getReferenceDevice()->PixelToLogic( aRegion, m_aMapMode );
+    basegfx::B2DPolyPolygon aRegion = LogicToPixel( rRegion, m_aGraphicsStack.front().m_aMapMode );
+    aRegion = PixelToLogic( aRegion, m_aMapMode );
     m_aGraphicsStack.front().m_aClipRegion = aRegion;
     m_aGraphicsStack.front().m_bClipRegion = true;
     m_aGraphicsStack.front().m_nUpdateFlags |= GraphicsStateUpdateFlags::ClipRegion;
@@ -10397,11 +10379,11 @@ void PDFWriterImpl::moveClipRegion( sal_Int32 nX, sal_Int32 nY )
     {
         Point aPoint( lcl_convert( m_aGraphicsStack.front().m_aMapMode,
                                    m_aMapMode,
-                                   getReferenceDevice(),
+                                   this,
                                    Point( nX, nY ) ) );
         aPoint -= lcl_convert( m_aGraphicsStack.front().m_aMapMode,
                                m_aMapMode,
-                               getReferenceDevice(),
+                               this,
                                Point() );
         basegfx::B2DHomMatrix aMat;
         aMat.translate( aPoint.X(), aPoint.Y() );
@@ -10419,8 +10401,8 @@ void PDFWriterImpl::intersectClipRegion( const tools::Rectangle& rRect )
 
 void PDFWriterImpl::intersectClipRegion( const basegfx::B2DPolyPolygon& rRegion )
 {
-    basegfx::B2DPolyPolygon aRegion( getReferenceDevice()->LogicToPixel( rRegion, m_aGraphicsStack.front().m_aMapMode ) );
-    aRegion = getReferenceDevice()->PixelToLogic( aRegion, m_aMapMode );
+    basegfx::B2DPolyPolygon aRegion( LogicToPixel( rRegion, m_aGraphicsStack.front().m_aMapMode ) );
+    aRegion = PixelToLogic( aRegion, m_aMapMode );
     m_aGraphicsStack.front().m_nUpdateFlags |= GraphicsStateUpdateFlags::ClipRegion;
     if( m_aGraphicsStack.front().m_bClipRegion )
     {
diff --git a/vcl/source/gdi/pdfwriter_impl.hxx b/vcl/source/gdi/pdfwriter_impl.hxx
index 755050730edf..ae1d3bdc07c1 100644
--- a/vcl/source/gdi/pdfwriter_impl.hxx
+++ b/vcl/source/gdi/pdfwriter_impl.hxx
@@ -36,7 +36,7 @@
 #include <vcl/bitmapex.hxx>
 #include <vcl/gradient.hxx>
 #include <vcl/hatch.hxx>
-#include <vcl/outdev.hxx>
+#include <vcl/virdev.hxx>
 #include <vcl/pdfwriter.hxx>
 #include <vcl/wall.hxx>
 #include <o3tl/typed_flags_set.hxx>
@@ -96,9 +96,10 @@ namespace filter
 class PDFObjectElement;
 }
 
-class PDFWriterImpl
+class PDFWriterImpl : public VirtualDevice
 {
     friend class PDFStreamIf;
+
 public:
     // definition of structs
     struct BuiltinFont
@@ -134,7 +135,7 @@ public:
 
     struct PDFPage
     {
-        PDFWriterImpl*              m_pWriter;
+        VclPtr<PDFWriterImpl>             m_pWriter;
         double const                      m_nPageWidth;           // in inch/72
         double const                      m_nPageHeight;          // in inch/72
         PDFWriter::Orientation const      m_eOrientation;
@@ -611,11 +612,10 @@ public:
     static bool compressStream( SvMemoryStream* );
 
     static void convertLineInfoToExtLineInfo( const LineInfo& rIn, PDFWriter::ExtLineInfo& rOut );
+
 private:
     static const BuiltinFont m_aBuiltinFonts[14];
 
-    VclPtr<OutputDevice>                m_pReferenceDevice;
-
     MapMode                             m_aMapMode; // PDFWriterImpl scaled units
     std::vector< PDFPage >              m_aPages;
     /* maps object numbers to file offsets (needed for xref) */
@@ -1049,16 +1049,13 @@ i12626
     void appendNonStrokingColor( const Color& rColor, OStringBuffer& rBuffer );
 public:
     PDFWriterImpl( const PDFWriter::PDFWriterContext& rContext, const css::uno::Reference< css::beans::XMaterialHolder >&, PDFWriter& );
-    ~PDFWriterImpl();
+    ~PDFWriterImpl() override;
+    void dispose() override;
 
     static css::uno::Reference< css::beans::XMaterialHolder >
            initEncryption( const OUString& i_rOwnerPassword,
                            const OUString& i_rUserPassword );
 
-    /* for documentation of public functions please see pdfwriter.hxx */
-
-    OutputDevice* getReferenceDevice();
-
     /* document structure */
     void newPage( double nPageWidth , double nPageHeight, PDFWriter::Orientation eOrientation );
     bool emit();
diff --git a/vcl/source/gdi/print2.cxx b/vcl/source/gdi/print2.cxx
index dc72c5533e4b..0baf00099ac0 100644
--- a/vcl/source/gdi/print2.cxx
+++ b/vcl/source/gdi/print2.cxx
@@ -1096,13 +1096,13 @@ bool OutputDevice::RemoveTransparenciesFromMetaFile( const GDIMetaFile& rInMtf,
 
         Point aPageOffset;
         Size aTmpSize( GetOutputSizePixel() );
-        if( mpPDFWriter )
+        if( GetPDFWriter() )
         {
-            aTmpSize = mpPDFWriter->getCurPageSize();
+            aTmpSize = GetPDFWriter()->getCurPageSize();
             aTmpSize = LogicToPixel( aTmpSize, MapMode( MapUnit::MapPoint ) );
 
             // also add error code to PDFWriter
-            mpPDFWriter->insertError( vcl::PDFWriter::Warning_Transparency_Converted );
+            GetPDFWriter()->insertError( vcl::PDFWriter::Warning_Transparency_Converted );
         }
         else if( meOutDevType == OUTDEV_PRINTER )
         {
diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx
index e3b7f1a2acaa..981e087e8330 100644
--- a/vcl/source/outdev/font.cxx
+++ b/vcl/source/outdev/font.cxx
@@ -542,7 +542,7 @@ void OutputDevice::ImplClearFontData( const bool bNewFontLists )
                 if (mxFontCollection && mxFontCollection != pSVData->maGDIData.mxScreenFontList)
                     mxFontCollection->Clear();
 
-                if( mpPDFWriter )
+                if( GetPDFWriter() )
                 {
                     mxFontCollection.reset();
                     mxFontCache.reset();
@@ -579,7 +579,7 @@ void OutputDevice::ImplRefreshFontData( const bool bNewFontLists )
             // we need a graphics
             if ( AcquireGraphics() )
             {
-                if( mpPDFWriter )
+                if( GetPDFWriter() )
                 {
                     mxFontCollection = pSVData->maGDIData.mxScreenFontList->Clone();
                     mxFontCache.reset(new ImplFontCache);
@@ -1005,12 +1005,19 @@ void OutputDevice::InitFont() const
     mbInitFont = false;
 }
 
+const LogicalFontInstance* OutputDevice::GetFontInstance() const
+{
+    if (ImplNewFont())
+        InitFont();
+    return mpFontInstance.get();
+}
+
 bool OutputDevice::ImplNewFont() const
 {
     DBG_TESTSOLARMUTEX();
 
     // get correct font list on the PDF writer if necessary
-    if( mpPDFWriter )
+    if( GetPDFWriter() )
     {
         const ImplSVData* pSVData = ImplGetSVData();
         if( mxFontCollection == pSVData->maGDIData.mxScreenFontList
diff --git a/vcl/source/outdev/hatch.cxx b/vcl/source/outdev/hatch.cxx
index 79b2c7e7f83a..00ec13562d46 100644
--- a/vcl/source/outdev/hatch.cxx
+++ b/vcl/source/outdev/hatch.cxx
@@ -401,9 +401,9 @@ void OutputDevice::DrawHatchLine( const tools::Line& rLine, const tools::PolyPol
         {
             for( long i = 0; i < nPCounter; i += 2 )
             {
-                if( mpPDFWriter )
+                if( GetPDFWriter() )
                 {
-                    mpPDFWriter->drawLine( pPtBuffer[ i ], pPtBuffer[ i+1 ] );
+                    GetPDFWriter()->drawLine( pPtBuffer[ i ], pPtBuffer[ i+1 ] );
                 }
                 else
                 {
diff --git a/vcl/source/outdev/outdev.cxx b/vcl/source/outdev/outdev.cxx
index 2be0140182c6..98af9d0ba0ce 100644
--- a/vcl/source/outdev/outdev.cxx
+++ b/vcl/source/outdev/outdev.cxx
@@ -34,6 +34,8 @@
 #include <outdevstatestack.hxx>
 #include <PhysicalFontCollection.hxx>
 
+#include "../gdi/pdfwriter_impl.hxx"
+
 #ifdef DISABLE_DYNLOADING
 // Linking all needed LO code into one .so/executable, these already
 // exist in the tools library, so put them in the anonymous namespace
@@ -142,6 +144,8 @@ OutputDevice::~OutputDevice()
 
 void OutputDevice::dispose()
 {
+    mpPDFWriter.disposeAndClear();
+
     if ( GetUnoGraphicsList() )
     {
         UnoWrapperBase* pWrapper = UnoWrapperBase::GetUnoWrapper( false );
@@ -758,4 +762,15 @@ bool OutputDevice::DrawEPS( const Point& rPoint, const Size& rSize,
     return bDrawn;
 }
 
+vcl::PDFWriterImpl* OutputDevice::GetPDFWriter() const
+{
+    return static_cast<vcl::PDFWriterImpl*>(mpPDFWriter.get());
+}
+
+void OutputDevice::SetPDFWriter(vcl::PDFWriterImpl* pPDFWriter)
+{
+    mpPDFWriter = pPDFWriter;
+    ImplUpdateFontData();
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list