[Libreoffice-commits] core.git: vcl/headless vcl/inc vcl/quartz vcl/source vcl/unx vcl/win

Chris Sherlock chris.sherlock79 at gmail.com
Thu Jan 14 10:10:13 PST 2016


 vcl/headless/svptext.cxx                       |    4 -
 vcl/inc/cairotextrender.hxx                    |    2 
 vcl/inc/fontinstance.hxx                       |    2 
 vcl/inc/headless/svpgdi.hxx                    |    2 
 vcl/inc/impfontmetricdata.hxx                  |   22 ++++++
 vcl/inc/quartz/salgdi.h                        |    4 -
 vcl/inc/salgdi.hxx                             |    2 
 vcl/inc/textrender.hxx                         |    2 
 vcl/inc/unx/genpspgraphics.h                   |    2 
 vcl/inc/unx/glyphcache.hxx                     |    2 
 vcl/inc/unx/salgdi.h                           |    2 
 vcl/inc/win/salgdi.h                           |    2 
 vcl/quartz/ctfonts.cxx                         |   18 ++---
 vcl/quartz/salgdi.cxx                          |    4 -
 vcl/source/font/fontinstance.cxx               |    3 
 vcl/source/font/fontmetric.cxx                 |    1 
 vcl/source/gdi/pdfwriter_impl.cxx              |   84 ++++++++++++------------
 vcl/source/gdi/print.cxx                       |    2 
 vcl/source/gdi/virdev.cxx                      |    5 -
 vcl/source/outdev/font.cxx                     |   77 ++++++++++------------
 vcl/source/outdev/text.cxx                     |    8 +-
 vcl/source/outdev/textline.cxx                 |   62 +++++++++---------
 vcl/unx/generic/gdi/cairotextrender.cxx        |    4 -
 vcl/unx/generic/gdi/salgdi3.cxx                |    4 -
 vcl/unx/generic/glyphs/freetype_glyphcache.cxx |   85 ++++++++++++-------------
 vcl/unx/generic/print/genpspgraphics.cxx       |   24 +++----
 vcl/win/gdi/salfont.cxx                        |    2 
 vcl/win/gdi/winlayout.cxx                      |    2 
 28 files changed, 226 insertions(+), 207 deletions(-)

New commits:
commit 659db7d705835b8676065fb4fe3babe39d938977
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date:   Fri Jan 15 03:06:18 2016 +1100

    vcl: change ImplFontMetricData to be reference counted via intrusive_ptr
    
    Change-Id: Ie9f5fbd21a6223520cbea3af6436beb407d7a88c
    Reviewed-on: https://gerrit.libreoffice.org/21477
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Chris Sherlock <chris.sherlock79 at gmail.com>

diff --git a/vcl/headless/svptext.cxx b/vcl/headless/svptext.cxx
index 4c40086..4346713 100644
--- a/vcl/headless/svptext.cxx
+++ b/vcl/headless/svptext.cxx
@@ -29,9 +29,9 @@ sal_uInt16 SvpSalGraphics::SetFont( FontSelectPattern* pIFSD, int nFallbackLevel
     return m_aTextRenderImpl.SetFont(pIFSD, nFallbackLevel);
 }
 
-void SvpSalGraphics::GetFontMetric( ImplFontMetricData* pFontMetric, int nFallbackLevel )
+void SvpSalGraphics::GetFontMetric( ImplFontMetricDataPtr& xFontMetric, int nFallbackLevel )
 {
-    m_aTextRenderImpl.GetFontMetric(pFontMetric, nFallbackLevel);
+    m_aTextRenderImpl.GetFontMetric(xFontMetric, nFallbackLevel);
 }
 
 const FontCharMapPtr SvpSalGraphics::GetFontCharMap() const
diff --git a/vcl/inc/cairotextrender.hxx b/vcl/inc/cairotextrender.hxx
index 027d885..1070ad8 100644
--- a/vcl/inc/cairotextrender.hxx
+++ b/vcl/inc/cairotextrender.hxx
@@ -90,7 +90,7 @@ public:
 
     virtual void                SetTextColor( SalColor nSalColor ) override;
     virtual sal_uInt16          SetFont( FontSelectPattern*, int nFallbackLevel ) override;
-    virtual void                GetFontMetric( ImplFontMetricData*, int nFallbackLevel ) override;
+    virtual void                GetFontMetric( ImplFontMetricDataPtr&, int nFallbackLevel ) override;
     virtual const FontCharMapPtr GetFontCharMap() const override;
     virtual bool                GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const override;
     virtual void                GetDevFontList( PhysicalFontCollection* ) override;
diff --git a/vcl/inc/fontinstance.hxx b/vcl/inc/fontinstance.hxx
index 84d82be..d57f101 100644
--- a/vcl/inc/fontinstance.hxx
+++ b/vcl/inc/fontinstance.hxx
@@ -39,7 +39,7 @@ public:
 public: // TODO: make data members private
     ImplFontCache * mpFontCache;
     FontSelectPattern  maFontSelData;       // FontSelectionData
-    ImplFontMetricData maFontMetric;        // Font attributes
+    ImplFontMetricDataPtr mxFontMetric;        // Font attributes
     const ConvertChar* mpConversion;        // used e.g. for StarBats->StarSymbol
 
     long            mnLineHeight;
diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx
index e88701d..d10b6fd 100644
--- a/vcl/inc/headless/svpgdi.hxx
+++ b/vcl/inc/headless/svpgdi.hxx
@@ -122,7 +122,7 @@ public:
 
     virtual void            SetTextColor( SalColor nSalColor ) override;
     virtual sal_uInt16      SetFont( FontSelectPattern*, int nFallbackLevel ) override;
-    virtual void            GetFontMetric( ImplFontMetricData*, int nFallbackLevel ) override;
+    virtual void            GetFontMetric( ImplFontMetricDataPtr&, int nFallbackLevel ) override;
     virtual const FontCharMapPtr GetFontCharMap() const override;
     virtual bool GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const override;
     virtual void            GetDevFontList( PhysicalFontCollection* ) override;
diff --git a/vcl/inc/impfontmetricdata.hxx b/vcl/inc/impfontmetricdata.hxx
index 8f0c0e9..5992643 100644
--- a/vcl/inc/impfontmetricdata.hxx
+++ b/vcl/inc/impfontmetricdata.hxx
@@ -24,6 +24,11 @@
 
 #include "fontattributes.hxx"
 
+#include <boost/intrusive_ptr.hpp>
+
+class ImplFontMetricData;
+typedef boost::intrusive_ptr< ImplFontMetricData > ImplFontMetricDataPtr;
+
 class OutputDevice;
 class FontSelectPattern;
 
@@ -124,6 +129,12 @@ public:
     void            ImplInitAboveTextLineSize();
 
 private:
+    friend class LogicalFontInstance;
+    friend void intrusive_ptr_add_ref(ImplFontMetricData* pImplFontMetricData);
+    friend void intrusive_ptr_release(ImplFontMetricData* pImplFontMetricData);
+
+    long            mnRefCount;
+
     // font instance attributes from the font request
     long            mnWidth;                    // Reference Width
     short           mnOrientation;              // Rotation in 1/10 degrees
@@ -172,6 +183,17 @@ private:
 
 };
 
+inline void intrusive_ptr_add_ref(ImplFontMetricData* pImplFontMetricData)
+{
+    ++pImplFontMetricData->mnRefCount;
+}
+
+inline void intrusive_ptr_release(ImplFontMetricData* pImplFontMetricData)
+{
+    if (--pImplFontMetricData->mnRefCount == 0)
+        delete pImplFontMetricData;
+}
+
 #endif // INCLUDED_VCL_INC_IMPFONTMETRICDATA_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h
index a9628459..73e9592 100644
--- a/vcl/inc/quartz/salgdi.h
+++ b/vcl/inc/quartz/salgdi.h
@@ -95,7 +95,7 @@ public:
 
     SalLayout* GetTextLayout( void ) const;
 
-    void       GetFontMetric( ImplFontMetricData& ) const;
+    void       GetFontMetric( ImplFontMetricDataPtr& ) const;
     bool       GetGlyphBoundRect( sal_GlyphId, Rectangle& ) const;
     bool       GetGlyphOutline( sal_GlyphId, basegfx::B2DPolyPolygon& ) const;
 
@@ -339,7 +339,7 @@ public:
     // set the font
     virtual sal_uInt16      SetFont( FontSelectPattern*, int nFallbackLevel ) override;
     // get the current font's metrics
-    virtual void            GetFontMetric( ImplFontMetricData*, int nFallbackLevel ) override;
+    virtual void            GetFontMetric( ImplFontMetricDataPtr&, int nFallbackLevel ) override;
     // get the repertoire of the current font
     virtual const FontCharMapPtr GetFontCharMap() const override;
     virtual bool            GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const override;
diff --git a/vcl/inc/salgdi.hxx b/vcl/inc/salgdi.hxx
index ca2251f..8c0ded7 100644
--- a/vcl/inc/salgdi.hxx
+++ b/vcl/inc/salgdi.hxx
@@ -147,7 +147,7 @@ public:
     void                        ReleaseFonts() { SetFont( nullptr, 0 ); }
 
     // get the current font's metrics
-    virtual void                GetFontMetric( ImplFontMetricData*, int nFallbackLevel = 0 ) = 0;
+    virtual void                GetFontMetric( ImplFontMetricDataPtr&, int nFallbackLevel = 0 ) = 0;
 
     // get the repertoire of the current font
     virtual const FontCharMapPtr GetFontCharMap() const = 0;
diff --git a/vcl/inc/textrender.hxx b/vcl/inc/textrender.hxx
index 2c0bf7f..f55619a 100644
--- a/vcl/inc/textrender.hxx
+++ b/vcl/inc/textrender.hxx
@@ -43,7 +43,7 @@ public:
 
     virtual void                    SetTextColor( SalColor nSalColor ) = 0;
     virtual sal_uInt16              SetFont( FontSelectPattern*, int nFallbackLevel ) = 0;
-    virtual void                    GetFontMetric( ImplFontMetricData*, int nFallbackLevel ) = 0;
+    virtual void                    GetFontMetric( ImplFontMetricDataPtr&, int nFallbackLevel ) = 0;
     virtual const FontCharMapPtr    GetFontCharMap() const = 0;
     virtual bool                    GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const = 0;
     virtual void                    GetDevFontList( PhysicalFontCollection* ) = 0;
diff --git a/vcl/inc/unx/genpspgraphics.h b/vcl/inc/unx/genpspgraphics.h
index 15f0041..6f6fa69 100644
--- a/vcl/inc/unx/genpspgraphics.h
+++ b/vcl/inc/unx/genpspgraphics.h
@@ -93,7 +93,7 @@ public:
 
     virtual void            SetTextColor( SalColor nSalColor ) override;
     virtual sal_uInt16      SetFont( FontSelectPattern*, int nFallbackLevel ) override;
-    virtual void            GetFontMetric( ImplFontMetricData*, int nFallbackLevel ) override;
+    virtual void            GetFontMetric( ImplFontMetricDataPtr&, int nFallbackLevel ) override;
     virtual const FontCharMapPtr GetFontCharMap() const override;
     virtual bool            GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const override;
     virtual void            GetDevFontList( PhysicalFontCollection* ) override;
diff --git a/vcl/inc/unx/glyphcache.hxx b/vcl/inc/unx/glyphcache.hxx
index ea756a5..f73c87b 100644
--- a/vcl/inc/unx/glyphcache.hxx
+++ b/vcl/inc/unx/glyphcache.hxx
@@ -162,7 +162,7 @@ public:
 
     const FontSelectPattern& GetFontSelData() const      { return maFontSelData; }
 
-    void                    GetFontMetric( ImplFontMetricData&, long& rFactor ) const;
+    void                    GetFontMetric( ImplFontMetricDataPtr&, long& rFactor ) const;
     const unsigned char*    GetTable( const char* pName, sal_uLong* pLength );
     int                     GetEmUnits() const { return maFaceFT->units_per_EM;}
     double                  GetStretch() { return mfStretch; }
diff --git a/vcl/inc/unx/salgdi.h b/vcl/inc/unx/salgdi.h
index 9f5b381..a8bbb04 100644
--- a/vcl/inc/unx/salgdi.h
+++ b/vcl/inc/unx/salgdi.h
@@ -112,7 +112,7 @@ public:
 
     virtual void                    SetTextColor( SalColor nSalColor ) override;
     virtual sal_uInt16              SetFont( FontSelectPattern*, int nFallbackLevel ) override;
-    virtual void                    GetFontMetric( ImplFontMetricData*, int nFallbackLevel ) override;
+    virtual void                    GetFontMetric( ImplFontMetricDataPtr&, int nFallbackLevel ) override;
     virtual const FontCharMapPtr    GetFontCharMap() const override;
     virtual bool                    GetFontCapabilities(vcl::FontCapabilities &rFontCapabilities) const override;
     virtual void                    GetDevFontList( PhysicalFontCollection* ) override;
diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index 8b89402..d90e429 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -362,7 +362,7 @@ public:
     // set the font
     virtual sal_uInt16      SetFont( FontSelectPattern*, int nFallbackLevel ) override;
     // get the current font's metrics
-    virtual void            GetFontMetric( ImplFontMetricData*, int nFallbackLevel ) override;
+    virtual void            GetFontMetric( ImplFontMetricDataPtr&, int nFallbackLevel ) override;
     // get the repertoire of the current font
     virtual const FontCharMapPtr GetFontCharMap() const override;
     // get the layout capabilities of the current font
diff --git a/vcl/quartz/ctfonts.cxx b/vcl/quartz/ctfonts.cxx
index ef8767f..573f8ef 100644
--- a/vcl/quartz/ctfonts.cxx
+++ b/vcl/quartz/ctfonts.cxx
@@ -117,7 +117,7 @@ CoreTextStyle::~CoreTextStyle()
         CFRelease( mpStyleDict );
 }
 
-void CoreTextStyle::GetFontMetric( ImplFontMetricData& rFontMetric ) const
+void CoreTextStyle::GetFontMetric( ImplFontMetricDataPtr& rxFontMetric ) const
 {
     // get the matching CoreText font handle
     // TODO: is it worth it to cache the CTFontRef in SetFont() and reuse it here?
@@ -125,20 +125,20 @@ void CoreTextStyle::GetFontMetric( ImplFontMetricData& rFontMetric ) const
 
     const CGFloat fAscent = CTFontGetAscent( aCTFontRef );
     const CGFloat fCapHeight = CTFontGetCapHeight( aCTFontRef );
-    rFontMetric.SetAscent( lrint( fAscent ) );
-    rFontMetric.SetDescent( lrint( CTFontGetDescent( aCTFontRef )) );
-    rFontMetric.SetExternalLeading( lrint( CTFontGetLeading( aCTFontRef )) );
-    rFontMetric.SetInternalLeading( lrint( fAscent - fCapHeight ) );
+    rxFontMetric->SetAscent( lrint( fAscent ) );
+    rxFontMetric->SetDescent( lrint( CTFontGetDescent( aCTFontRef )) );
+    rxFontMetric->SetExternalLeading( lrint( CTFontGetLeading( aCTFontRef )) );
+    rxFontMetric->SetInternalLeading( lrint( fAscent - fCapHeight ) );
 
     // since ImplFontMetricData::mnWidth is only used for stretching/squeezing fonts
     // setting this width to the pixel height of the fontsize is good enough
     // it also makes the calculation of the stretch factor simple
-    rFontMetric.SetWidth( lrint( CTFontGetSize( aCTFontRef ) * mfFontStretch) );
+    rxFontMetric->SetWidth( lrint( CTFontGetSize( aCTFontRef ) * mfFontStretch) );
 
     // all CoreText fonts are scalable
-    rFontMetric.SetScalableFlag( true );
-    rFontMetric.SetTrueTypeFlag( true ); // Not sure, but this field is used only for Windows so far
-    rFontMetric.SetKernableFlag( true );
+    rxFontMetric->SetScalableFlag( true );
+    rxFontMetric->SetTrueTypeFlag( true ); // Not sure, but this field is used only for Windows so far
+    rxFontMetric->SetKernableFlag( true );
 }
 
 bool CoreTextStyle::GetGlyphBoundRect( sal_GlyphId aGlyphId, Rectangle& rRect ) const
diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index fb9e8db..d4dd958 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -308,9 +308,9 @@ void AquaSalGraphics::SetTextColor( SalColor nSalColor )
     // SAL_ DEBUG(std::hex << nSalColor << std::dec << "={" << maTextColor.GetRed() << ", " << maTextColor.GetGreen() << ", " << maTextColor.GetBlue() << ", " << maTextColor.GetAlpha() << "}");
 }
 
-void AquaSalGraphics::GetFontMetric( ImplFontMetricData* pFontMetric, int /*nFallbackLevel*/ )
+void AquaSalGraphics::GetFontMetric( ImplFontMetricDataPtr& rxFontMetric, int /*nFallbackLevel*/ )
 {
-    mpTextStyle->GetFontMetric( *pFontMetric );
+    mpTextStyle->GetFontMetric( rxFontMetric );
 }
 
 static bool AddTempDevFont(const OUString& rFontFileURL)
diff --git a/vcl/source/font/fontinstance.cxx b/vcl/source/font/fontinstance.cxx
index 22fde5e..8415dd0 100644
--- a/vcl/source/font/fontinstance.cxx
+++ b/vcl/source/font/fontinstance.cxx
@@ -82,7 +82,7 @@ namespace std
 LogicalFontInstance::LogicalFontInstance( const FontSelectPattern& rFontSelData )
     : mpFontCache(nullptr)
     , maFontSelData( rFontSelData )
-    , maFontMetric( rFontSelData )
+    , mxFontMetric( new ImplFontMetricData( rFontSelData ))
     , mpConversion( nullptr )
     , mnLineHeight( 0 )
     , mnRefCount( 1 )
@@ -99,6 +99,7 @@ LogicalFontInstance::~LogicalFontInstance()
 {
     delete mpUnicodeFallbackList;
     mpFontCache = nullptr;
+    mxFontMetric = nullptr;
 }
 
 void LogicalFontInstance::AddFallbackForUnicode( sal_UCS4 cChar, FontWeight eWeight, const OUString& rFontName )
diff --git a/vcl/source/font/fontmetric.cxx b/vcl/source/font/fontmetric.cxx
index 6cd5c31..3f27d62 100644
--- a/vcl/source/font/fontmetric.cxx
+++ b/vcl/source/font/fontmetric.cxx
@@ -66,6 +66,7 @@ using namespace ::utl;
 
 ImplFontMetricData::ImplFontMetricData( const FontSelectPattern& rFontSelData )
     : FontAttributes( rFontSelData )
+    , mnRefCount ( 0 )
     , mnWidth ( rFontSelData.mnWidth )
     , mnOrientation( (short)(rFontSelData.mnOrientation) )
     , mnAscent( 0 )
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index 05cc9bc..69d8b50 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -9168,18 +9168,18 @@ void PDFWriterImpl::drawLayout( SalLayout& rLayout, const OUString& rText, bool
         Point aOffset = Point(0,0);
 
         if ( nEmphMark & EMPHASISMARK_POS_BELOW )
-            aOffset.Y() += m_pReferenceDevice->mpFontInstance->maFontMetric.GetDescent() + nEmphYOff;
+            aOffset.Y() += m_pReferenceDevice->mpFontInstance->mxFontMetric->GetDescent() + nEmphYOff;
         else
-            aOffset.Y() -= m_pReferenceDevice->mpFontInstance->maFontMetric.GetAscent() + nEmphYOff;
+            aOffset.Y() -= m_pReferenceDevice->mpFontInstance->mxFontMetric->GetAscent() + nEmphYOff;
 
         long nEmphWidth2     = nEmphWidth / 2;
         long nEmphHeight2    = nEmphHeight / 2;
         aOffset += Point( nEmphWidth2, nEmphHeight2 );
 
         if ( eAlign == ALIGN_BOTTOM )
-            aOffset.Y() -= m_pReferenceDevice->mpFontInstance->maFontMetric.GetDescent();
+            aOffset.Y() -= m_pReferenceDevice->mpFontInstance->mxFontMetric->GetDescent();
         else if ( eAlign == ALIGN_TOP )
-            aOffset.Y() += m_pReferenceDevice->mpFontInstance->maFontMetric.GetAscent();
+            aOffset.Y() += m_pReferenceDevice->mpFontInstance->mxFontMetric->GetAscent();
 
         for( int nStart = 0;;)
         {
@@ -9497,17 +9497,17 @@ void PDFWriterImpl::drawWaveTextLine( OStringBuffer& aLine, long nWidth, FontUnd
 
     if ( bIsAbove )
     {
-        if ( !pFontInstance->maFontMetric.GetAboveWavelineUnderlineSize() )
+        if ( !pFontInstance->mxFontMetric->GetAboveWavelineUnderlineSize() )
             m_pReferenceDevice->ImplInitAboveTextLineSize();
-        nLineHeight = HCONV( pFontInstance->maFontMetric.GetAboveWavelineUnderlineSize() );
-        nLinePos = HCONV( pFontInstance->maFontMetric.GetAboveWavelineUnderlineOffset() );
+        nLineHeight = HCONV( pFontInstance->mxFontMetric->GetAboveWavelineUnderlineSize() );
+        nLinePos = HCONV( pFontInstance->mxFontMetric->GetAboveWavelineUnderlineOffset() );
     }
     else
     {
-        if ( !pFontInstance->maFontMetric.GetWavelineUnderlineSize() )
+        if ( !pFontInstance->mxFontMetric->GetWavelineUnderlineSize() )
             m_pReferenceDevice->ImplInitTextLineSize();
-        nLineHeight = HCONV( pFontInstance->maFontMetric.GetWavelineUnderlineSize() );
-        nLinePos = HCONV( pFontInstance->maFontMetric.GetWavelineUnderlineOffset() );
+        nLineHeight = HCONV( pFontInstance->mxFontMetric->GetWavelineUnderlineSize() );
+        nLinePos = HCONV( pFontInstance->mxFontMetric->GetWavelineUnderlineOffset() );
     }
     if ( (eTextLine == UNDERLINE_SMALLWAVE) && (nLineHeight > 3) )
         nLineHeight = 3;
@@ -9576,17 +9576,17 @@ void PDFWriterImpl::drawStraightTextLine( OStringBuffer& aLine, long nWidth, Fon
         case UNDERLINE_DASHDOTDOT:
             if ( bIsAbove )
             {
-                if ( !pFontInstance->maFontMetric.GetAboveUnderlineSize() )
+                if ( !pFontInstance->mxFontMetric->GetAboveUnderlineSize() )
                     m_pReferenceDevice->ImplInitAboveTextLineSize();
-                nLineHeight = HCONV( pFontInstance->maFontMetric.GetAboveUnderlineSize() );
-                nLinePos    = HCONV( pFontInstance->maFontMetric.GetAboveUnderlineOffset() );
+                nLineHeight = HCONV( pFontInstance->mxFontMetric->GetAboveUnderlineSize() );
+                nLinePos    = HCONV( pFontInstance->mxFontMetric->GetAboveUnderlineOffset() );
             }
             else
             {
-                if ( !pFontInstance->maFontMetric.GetUnderlineSize() )
+                if ( !pFontInstance->mxFontMetric->GetUnderlineSize() )
                     m_pReferenceDevice->ImplInitTextLineSize();
-                nLineHeight = HCONV( pFontInstance->maFontMetric.GetUnderlineSize() );
-                nLinePos    = HCONV( pFontInstance->maFontMetric.GetUnderlineOffset() );
+                nLineHeight = HCONV( pFontInstance->mxFontMetric->GetUnderlineSize() );
+                nLinePos    = HCONV( pFontInstance->mxFontMetric->GetUnderlineOffset() );
             }
             break;
         case UNDERLINE_BOLD:
@@ -9597,36 +9597,36 @@ void PDFWriterImpl::drawStraightTextLine( OStringBuffer& aLine, long nWidth, Fon
         case UNDERLINE_BOLDDASHDOTDOT:
             if ( bIsAbove )
             {
-                if ( !pFontInstance->maFontMetric.GetAboveBoldUnderlineSize() )
+                if ( !pFontInstance->mxFontMetric->GetAboveBoldUnderlineSize() )
                     m_pReferenceDevice->ImplInitAboveTextLineSize();
-                nLineHeight = HCONV( pFontInstance->maFontMetric.GetAboveBoldUnderlineSize() );
-                nLinePos    = HCONV( pFontInstance->maFontMetric.GetAboveBoldUnderlineOffset() );
+                nLineHeight = HCONV( pFontInstance->mxFontMetric->GetAboveBoldUnderlineSize() );
+                nLinePos    = HCONV( pFontInstance->mxFontMetric->GetAboveBoldUnderlineOffset() );
             }
             else
             {
-                if ( !pFontInstance->maFontMetric.GetBoldUnderlineSize() )
+                if ( !pFontInstance->mxFontMetric->GetBoldUnderlineSize() )
                     m_pReferenceDevice->ImplInitTextLineSize();
-                nLineHeight = HCONV( pFontInstance->maFontMetric.GetBoldUnderlineSize() );
-                nLinePos    = HCONV( pFontInstance->maFontMetric.GetBoldUnderlineOffset() );
+                nLineHeight = HCONV( pFontInstance->mxFontMetric->GetBoldUnderlineSize() );
+                nLinePos    = HCONV( pFontInstance->mxFontMetric->GetBoldUnderlineOffset() );
                 nLinePos += nLineHeight/2;
             }
             break;
         case UNDERLINE_DOUBLE:
             if ( bIsAbove )
             {
-                if ( !pFontInstance->maFontMetric.GetAboveDoubleUnderlineSize() )
+                if ( !pFontInstance->mxFontMetric->GetAboveDoubleUnderlineSize() )
                     m_pReferenceDevice->ImplInitAboveTextLineSize();
-                nLineHeight = HCONV( pFontInstance->maFontMetric.GetAboveDoubleUnderlineSize() );
-                nLinePos    = HCONV( pFontInstance->maFontMetric.GetAboveDoubleUnderlineOffset1() );
-                nLinePos2   = HCONV( pFontInstance->maFontMetric.GetAboveDoubleUnderlineOffset2() );
+                nLineHeight = HCONV( pFontInstance->mxFontMetric->GetAboveDoubleUnderlineSize() );
+                nLinePos    = HCONV( pFontInstance->mxFontMetric->GetAboveDoubleUnderlineOffset1() );
+                nLinePos2   = HCONV( pFontInstance->mxFontMetric->GetAboveDoubleUnderlineOffset2() );
             }
             else
             {
-                if ( !pFontInstance->maFontMetric.GetDoubleUnderlineSize() )
+                if ( !pFontInstance->mxFontMetric->GetDoubleUnderlineSize() )
                     m_pReferenceDevice->ImplInitTextLineSize();
-                nLineHeight = HCONV( pFontInstance->maFontMetric.GetDoubleUnderlineSize() );
-                nLinePos    = HCONV( pFontInstance->maFontMetric.GetDoubleUnderlineOffset1() );
-                nLinePos2   = HCONV( pFontInstance->maFontMetric.GetDoubleUnderlineOffset2() );
+                nLineHeight = HCONV( pFontInstance->mxFontMetric->GetDoubleUnderlineSize() );
+                nLinePos    = HCONV( pFontInstance->mxFontMetric->GetDoubleUnderlineOffset1() );
+                nLinePos2   = HCONV( pFontInstance->mxFontMetric->GetDoubleUnderlineOffset2() );
             }
             break;
         default:
@@ -9739,23 +9739,23 @@ void PDFWriterImpl::drawStrikeoutLine( OStringBuffer& aLine, long nWidth, FontSt
     switch ( eStrikeout )
     {
         case STRIKEOUT_SINGLE:
-            if ( !pFontInstance->maFontMetric.GetStrikeoutSize() )
+            if ( !pFontInstance->mxFontMetric->GetStrikeoutSize() )
                 m_pReferenceDevice->ImplInitTextLineSize();
-            nLineHeight = HCONV( pFontInstance->maFontMetric.GetStrikeoutSize() );
-            nLinePos    = HCONV( pFontInstance->maFontMetric.GetStrikeoutOffset() );
+            nLineHeight = HCONV( pFontInstance->mxFontMetric->GetStrikeoutSize() );
+            nLinePos    = HCONV( pFontInstance->mxFontMetric->GetStrikeoutOffset() );
             break;
         case STRIKEOUT_BOLD:
-            if ( !pFontInstance->maFontMetric.GetBoldStrikeoutSize() )
+            if ( !pFontInstance->mxFontMetric->GetBoldStrikeoutSize() )
                 m_pReferenceDevice->ImplInitTextLineSize();
-            nLineHeight = HCONV( pFontInstance->maFontMetric.GetBoldStrikeoutSize() );
-            nLinePos    = HCONV( pFontInstance->maFontMetric.GetBoldStrikeoutOffset() );
+            nLineHeight = HCONV( pFontInstance->mxFontMetric->GetBoldStrikeoutSize() );
+            nLinePos    = HCONV( pFontInstance->mxFontMetric->GetBoldStrikeoutOffset() );
             break;
         case STRIKEOUT_DOUBLE:
-            if ( !pFontInstance->maFontMetric.GetDoubleStrikeoutSize() )
+            if ( !pFontInstance->mxFontMetric->GetDoubleStrikeoutSize() )
                 m_pReferenceDevice->ImplInitTextLineSize();
-            nLineHeight = HCONV( pFontInstance->maFontMetric.GetDoubleStrikeoutSize() );
-            nLinePos    = HCONV( pFontInstance->maFontMetric.GetDoubleStrikeoutOffset1() );
-            nLinePos2   = HCONV( pFontInstance->maFontMetric.GetDoubleStrikeoutOffset2() );
+            nLineHeight = HCONV( pFontInstance->mxFontMetric->GetDoubleStrikeoutSize() );
+            nLinePos    = HCONV( pFontInstance->mxFontMetric->GetDoubleStrikeoutOffset1() );
+            nLinePos2   = HCONV( pFontInstance->mxFontMetric->GetDoubleStrikeoutOffset2() );
             break;
         default:
             break;
@@ -9876,9 +9876,9 @@ void PDFWriterImpl::drawTextLine( const Point& rPos, long nWidth, FontStrikeout
     Point aPos( rPos );
     TextAlign eAlign = m_aCurrentPDFState.m_aFont.GetAlign();
     if( eAlign == ALIGN_TOP )
-        aPos.Y() += HCONV( pFontInstance->maFontMetric.GetAscent() );
+        aPos.Y() += HCONV( pFontInstance->mxFontMetric->GetAscent() );
     else if( eAlign == ALIGN_BOTTOM )
-        aPos.Y() -= HCONV( pFontInstance->maFontMetric.GetDescent() );
+        aPos.Y() -= HCONV( pFontInstance->mxFontMetric->GetDescent() );
 
     OStringBuffer aLine( 512 );
     // save GS
diff --git a/vcl/source/gdi/print.cxx b/vcl/source/gdi/print.cxx
index fcb25d5..9ce0c72 100644
--- a/vcl/source/gdi/print.cxx
+++ b/vcl/source/gdi/print.cxx
@@ -1817,7 +1817,7 @@ void Printer::InitFont() const
 
 void Printer::SetFontOrientation( LogicalFontInstance* const pFontEntry ) const
 {
-    pFontEntry->mnOrientation = pFontEntry->maFontMetric.GetOrientation();
+    pFontEntry->mnOrientation = pFontEntry->mxFontMetric->GetOrientation();
 }
 
 void Printer::DrawImage( const Point&, const Image&, DrawImageFlags )
diff --git a/vcl/source/gdi/virdev.cxx b/vcl/source/gdi/virdev.cxx
index 8e426ea..a83f88f 100644
--- a/vcl/source/gdi/virdev.cxx
+++ b/vcl/source/gdi/virdev.cxx
@@ -564,10 +564,7 @@ long VirtualDevice::GetFontExtLeading() const
         return 0;
 #endif
 
-    LogicalFontInstance* pFontInstance = mpFontInstance;
-    ImplFontMetricData* pFontMetric = &(pFontInstance->maFontMetric);
-
-    return pFontMetric->GetExternalLeading();
+    return mpFontInstance->mxFontMetric->GetExternalLeading();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx
index f85fcc8..ce87da9 100644
--- a/vcl/source/outdev/font.cxx
+++ b/vcl/source/outdev/font.cxx
@@ -189,43 +189,45 @@ FontMetric OutputDevice::GetFontMetric() const
         return aMetric;
 
     LogicalFontInstance* pFontInstance = mpFontInstance;
-    ImplFontMetricData* pFontMetric = &(pFontInstance->maFontMetric);
+    ImplFontMetricDataPtr xFontMetric = pFontInstance->mxFontMetric;
 
     // prepare metric
     aMetric.Font::operator=( maFont );
 
     // set aMetric with info from font
     aMetric.SetName( maFont.GetName() );
-    aMetric.SetStyleName( pFontMetric->GetStyleName() );
-    aMetric.SetSize( PixelToLogic( Size( pFontMetric->GetWidth(), pFontMetric->GetAscent() + pFontMetric->GetDescent() - pFontMetric->GetInternalLeading() ) ) );
-    aMetric.SetCharSet( pFontMetric->IsSymbolFont() ? RTL_TEXTENCODING_SYMBOL : RTL_TEXTENCODING_UNICODE );
-    aMetric.SetFamily( pFontMetric->GetFamilyType() );
-    aMetric.SetPitch( pFontMetric->GetPitch() );
-    aMetric.SetWeight( pFontMetric->GetWeight() );
-    aMetric.SetItalic( pFontMetric->GetSlantType() );
-    aMetric.SetWidthType( pFontMetric->GetWidthType() );
+    aMetric.SetStyleName( xFontMetric->GetStyleName() );
+    aMetric.SetSize( PixelToLogic( Size( xFontMetric->GetWidth(), xFontMetric->GetAscent() + xFontMetric->GetDescent() - xFontMetric->GetInternalLeading() ) ) );
+    aMetric.SetCharSet( xFontMetric->IsSymbolFont() ? RTL_TEXTENCODING_SYMBOL : RTL_TEXTENCODING_UNICODE );
+    aMetric.SetFamily( xFontMetric->GetFamilyType() );
+    aMetric.SetPitch( xFontMetric->GetPitch() );
+    aMetric.SetWeight( xFontMetric->GetWeight() );
+    aMetric.SetItalic( xFontMetric->GetSlantType() );
+    aMetric.SetWidthType( xFontMetric->GetWidthType() );
     if ( pFontInstance->mnOwnOrientation )
         aMetric.SetOrientation( pFontInstance->mnOwnOrientation );
     else
-        aMetric.SetOrientation( pFontMetric->GetOrientation() );
-    if( !pFontInstance->maFontMetric.IsKernable() )
+        aMetric.SetOrientation( xFontMetric->GetOrientation() );
+    if( !pFontInstance->mxFontMetric->IsKernable() )
          aMetric.SetKerning( maFont.GetKerning() & ~FontKerning::FontSpecific );
 
     // set remaining metric fields
-    aMetric.SetBuiltInFontFlag( pFontMetric->IsBuiltInFont() );
-    aMetric.SetScalableFlag( pFontMetric->IsScalable() );
-    aMetric.SetFullstopCenteredFlag( pFontMetric->IsFullstopCentered() );
-    aMetric.SetBulletOffset( pFontMetric->GetBulletOffset() );
-    aMetric.SetAscent( ImplDevicePixelToLogicHeight( pFontMetric->GetAscent() + mnEmphasisAscent ) );
-    aMetric.SetDescent( ImplDevicePixelToLogicHeight( pFontMetric->GetDescent() + mnEmphasisDescent ) );
-    aMetric.SetInternalLeading( ImplDevicePixelToLogicHeight( pFontMetric->GetInternalLeading() + mnEmphasisAscent ) );
+    aMetric.SetBuiltInFontFlag( xFontMetric->IsBuiltInFont() );
+    aMetric.SetScalableFlag( xFontMetric->IsScalable() );
+    aMetric.SetFullstopCenteredFlag( xFontMetric->IsFullstopCentered() );
+    aMetric.SetBulletOffset( xFontMetric->GetBulletOffset() );
+    aMetric.SetAscent( ImplDevicePixelToLogicHeight( xFontMetric->GetAscent() + mnEmphasisAscent ) );
+    aMetric.SetDescent( ImplDevicePixelToLogicHeight( xFontMetric->GetDescent() + mnEmphasisDescent ) );
+    aMetric.SetInternalLeading( ImplDevicePixelToLogicHeight( xFontMetric->GetInternalLeading() + mnEmphasisAscent ) );
     // OutputDevice has its own external leading function due to #i60945#
     aMetric.SetExternalLeading( ImplDevicePixelToLogicHeight( GetFontExtLeading() ) );
-    aMetric.SetLineHeight( ImplDevicePixelToLogicHeight( pFontMetric->GetAscent() + pFontMetric->GetDescent() + mnEmphasisAscent + mnEmphasisDescent ) );
-    aMetric.SetSlant( ImplDevicePixelToLogicHeight( pFontMetric->GetSlant() ) );
+    aMetric.SetLineHeight( ImplDevicePixelToLogicHeight( xFontMetric->GetAscent() + xFontMetric->GetDescent() + mnEmphasisAscent + mnEmphasisDescent ) );
+    aMetric.SetSlant( ImplDevicePixelToLogicHeight( xFontMetric->GetSlant() ) );
 
     SAL_INFO("vcl.gdi.fontmetric", "OutputDevice::GetFontMetric:" << aMetric);
 
+    xFontMetric = nullptr;
+
     return aMetric;
 }
 
@@ -481,10 +483,7 @@ FontEmphasisMark OutputDevice::ImplGetEmphasisMarkStyle( const vcl::Font& rFont
 
 long OutputDevice::GetFontExtLeading() const
 {
-    LogicalFontInstance*      pFontInstance = mpFontInstance;
-    ImplFontMetricData* pFontMetric = &(pFontInstance->maFontMetric);
-
-    return pFontMetric->GetExternalLeading();
+    return mpFontInstance->mxFontMetric->GetExternalLeading();
 }
 
 void OutputDevice::ImplClearFontData( const bool bNewFontLists )
@@ -1099,13 +1098,13 @@ bool OutputDevice::ImplNewFont() const
         {
             pFontInstance->mbInit = true;
 
-            pFontInstance->maFontMetric.SetOrientation( sal::static_int_cast<short>(pFontInstance->maFontSelData.mnOrientation) );
-            pGraphics->GetFontMetric( &(pFontInstance->maFontMetric) );
+            pFontInstance->mxFontMetric->SetOrientation( sal::static_int_cast<short>(pFontInstance->maFontSelData.mnOrientation) );
+            pGraphics->GetFontMetric( pFontInstance->mxFontMetric );
 
-            pFontInstance->maFontMetric.ImplInitTextLineSize( this );
-            pFontInstance->maFontMetric.ImplInitAboveTextLineSize();
+            pFontInstance->mxFontMetric->ImplInitTextLineSize( this );
+            pFontInstance->mxFontMetric->ImplInitAboveTextLineSize();
 
-            pFontInstance->mnLineHeight = pFontInstance->maFontMetric.GetAscent() + pFontInstance->maFontMetric.GetDescent();
+            pFontInstance->mnLineHeight = pFontInstance->mxFontMetric->GetAscent() + pFontInstance->mxFontMetric->GetDescent();
 
             SetFontOrientation( pFontInstance );
         }
@@ -1115,7 +1114,7 @@ bool OutputDevice::ImplNewFont() const
     if ( maFont.GetKerning() & FontKerning::FontSpecific )
     {
         // TODO: test if physical font supports kerning and disable if not
-        if( pFontInstance->maFontMetric.IsKernable() )
+        if( pFontInstance->mxFontMetric->IsKernable() )
             mbKerning = true;
     }
     else
@@ -1151,7 +1150,7 @@ bool OutputDevice::ImplNewFont() const
     else if ( eAlign == ALIGN_TOP )
     {
         mnTextOffX = 0;
-        mnTextOffY = +pFontInstance->maFontMetric.GetAscent() + mnEmphasisAscent;
+        mnTextOffY = +pFontInstance->mxFontMetric->GetAscent() + mnEmphasisAscent;
         if ( pFontInstance->mnOrientation )
         {
             Point aOriginPt(0, 0);
@@ -1161,7 +1160,7 @@ bool OutputDevice::ImplNewFont() const
     else // eAlign == ALIGN_BOTTOM
     {
         mnTextOffX = 0;
-        mnTextOffY = -pFontInstance->maFontMetric.GetDescent() + mnEmphasisDescent;
+        mnTextOffY = -pFontInstance->mxFontMetric->GetDescent() + mnEmphasisDescent;
         if ( pFontInstance->mnOrientation )
         {
             Point aOriginPt(0, 0);
@@ -1179,7 +1178,7 @@ bool OutputDevice::ImplNewFont() const
     // #95414# fix for OLE objects which use scale factors very creatively
     if( mbMap && !aSize.Width() )
     {
-        int nOrigWidth = pFontInstance->maFontMetric.GetWidth();
+        int nOrigWidth = pFontInstance->mxFontMetric->GetWidth();
         float fStretch = (float)maMapRes.mnMapScNumX * maMapRes.mnMapScDenomY;
         fStretch /= (float)maMapRes.mnMapScNumY * maMapRes.mnMapScDenomX;
         int nNewWidth = (int)(nOrigWidth * fStretch + 0.5);
@@ -1200,14 +1199,14 @@ bool OutputDevice::ImplNewFont() const
 
 void OutputDevice::SetFontOrientation( LogicalFontInstance* const pFontInstance ) const
 {
-    if( pFontInstance->maFontSelData.mnOrientation && !pFontInstance->maFontMetric.GetOrientation() )
+    if( pFontInstance->maFontSelData.mnOrientation && !pFontInstance->mxFontMetric->GetOrientation() )
     {
         pFontInstance->mnOwnOrientation = sal::static_int_cast<short>(pFontInstance->maFontSelData.mnOrientation);
         pFontInstance->mnOrientation = pFontInstance->mnOwnOrientation;
     }
     else
     {
-        pFontInstance->mnOrientation = pFontInstance->maFontMetric.GetOrientation();
+        pFontInstance->mnOrientation = pFontInstance->mxFontMetric->GetOrientation();
     }
 }
 
@@ -1297,9 +1296,9 @@ void OutputDevice::ImplDrawEmphasisMarks( SalLayout& rSalLayout )
     Point aOffset = Point(0,0);
 
     if ( nEmphasisMark & EMPHASISMARK_POS_BELOW )
-        aOffset.Y() += mpFontInstance->maFontMetric.GetDescent() + nEmphasisYOff;
+        aOffset.Y() += mpFontInstance->mxFontMetric->GetDescent() + nEmphasisYOff;
     else
-        aOffset.Y() -= mpFontInstance->maFontMetric.GetAscent() + nEmphasisYOff;
+        aOffset.Y() -= mpFontInstance->mxFontMetric->GetAscent() + nEmphasisYOff;
 
     long nEmphasisWidth2  = nEmphasisWidth / 2;
     long nEmphasisHeight2 = nEmphasisHeight / 2;
@@ -1460,9 +1459,7 @@ long OutputDevice::GetMinKashida() const
     if( mbNewFont && !ImplNewFont() )
         return 0;
 
-    LogicalFontInstance* pFontInstance = mpFontInstance;
-    ImplFontMetricData* pFontMetric = &(pFontInstance->maFontMetric);
-    return ImplDevicePixelToLogicWidth( pFontMetric->GetMinKashida() );
+    return ImplDevicePixelToLogicWidth( mpFontInstance->mxFontMetric->GetMinKashida() );
 }
 
 sal_Int32 OutputDevice::ValidateKashidas ( const OUString& rTxt,
diff --git a/vcl/source/outdev/text.cxx b/vcl/source/outdev/text.cxx
index 912249a..1696ae2 100644
--- a/vcl/source/outdev/text.cxx
+++ b/vcl/source/outdev/text.cxx
@@ -177,7 +177,7 @@ void OutputDevice::ImplDrawTextBackground( const SalLayout& rSalLayout )
     mpGraphics->SetFillColor( ImplColorToSal( GetTextFillColor() ) );
     mbInitFillColor = true;
 
-    ImplDrawTextRect( nX, nY, 0, -(mpFontInstance->maFontMetric.GetAscent() + mnEmphasisAscent),
+    ImplDrawTextRect( nX, nY, 0, -(mpFontInstance->mxFontMetric->GetAscent() + mnEmphasisAscent),
                       nWidth,
                       mpFontInstance->mnLineHeight+mnEmphasisAscent+mnEmphasisDescent );
 }
@@ -191,7 +191,7 @@ Rectangle OutputDevice::ImplGetTextBoundRect( const SalLayout& rSalLayout )
     long nWidth = rSalLayout.GetTextWidth();
     long nHeight = mpFontInstance->mnLineHeight + mnEmphasisAscent + mnEmphasisDescent;
 
-    nY -= mpFontInstance->maFontMetric.GetAscent() + mnEmphasisAscent;
+    nY -= mpFontInstance->mxFontMetric->GetAscent() + mnEmphasisAscent;
 
     if ( mpFontInstance->mnOrientation )
     {
@@ -232,7 +232,7 @@ bool OutputDevice::ImplDrawRotateText( SalLayout& rSalLayout )
     {
         // guess vertical text extents if GetBoundRect failed
         int nRight = rSalLayout.GetTextWidth();
-        int nTop = mpFontInstance->maFontMetric.GetAscent() + mnEmphasisAscent;
+        int nTop = mpFontInstance->mxFontMetric->GetAscent() + mnEmphasisAscent;
         long nHeight = mpFontInstance->mnLineHeight + mnEmphasisAscent + mnEmphasisDescent;
         aBoundRect = Rectangle( 0, -nTop, nRight, nHeight - nTop );
     }
@@ -2621,7 +2621,7 @@ bool OutputDevice::GetTextBoundRect( Rectangle& rRect,
         Point aTopLeft( nLeft, nTop );
         aTopLeft -= aOffset;
         // adjust to text alignment
-        aTopLeft.Y()+= mnTextOffY - (mpFontInstance->maFontMetric.GetAscent() + mnEmphasisAscent);
+        aTopLeft.Y()+= mnTextOffY - (mpFontInstance->mxFontMetric->GetAscent() + mnEmphasisAscent);
         // convert to logical coordinates
         aSize = PixelToLogic( aSize );
         aTopLeft.X() = ImplDevicePixelToLogicWidth( aTopLeft.X() );
diff --git a/vcl/source/outdev/textline.cxx b/vcl/source/outdev/textline.cxx
index 7e147d8..5560044 100644
--- a/vcl/source/outdev/textline.cxx
+++ b/vcl/source/outdev/textline.cxx
@@ -56,12 +56,12 @@ bool OutputDevice::ImplIsUnderlineAbove( const vcl::Font& rFont )
 
 void OutputDevice::ImplInitTextLineSize()
 {
-    mpFontInstance->maFontMetric.ImplInitTextLineSize( this );
+    mpFontInstance->mxFontMetric->ImplInitTextLineSize( this );
 }
 
 void OutputDevice::ImplInitAboveTextLineSize()
 {
-    mpFontInstance->maFontMetric.ImplInitAboveTextLineSize();
+    mpFontInstance->mxFontMetric->ImplInitAboveTextLineSize();
 }
 
 void OutputDevice::ImplDrawWavePixel( long nOriginX, long nOriginY,
@@ -221,13 +221,13 @@ void OutputDevice::ImplDrawWaveTextLine( long nBaseX, long nBaseY,
 
     if ( bIsAbove )
     {
-        nLineHeight = pFontInstance->maFontMetric.GetAboveWavelineUnderlineSize();
-        nLinePos = pFontInstance->maFontMetric.GetAboveWavelineUnderlineOffset();
+        nLineHeight = pFontInstance->mxFontMetric->GetAboveWavelineUnderlineSize();
+        nLinePos = pFontInstance->mxFontMetric->GetAboveWavelineUnderlineOffset();
     }
     else
     {
-        nLineHeight = pFontInstance->maFontMetric.GetWavelineUnderlineSize();
-        nLinePos = pFontInstance->maFontMetric.GetWavelineUnderlineOffset();
+        nLineHeight = pFontInstance->mxFontMetric->GetWavelineUnderlineSize();
+        nLinePos = pFontInstance->mxFontMetric->GetWavelineUnderlineOffset();
     }
     if ( (eTextLine == UNDERLINE_SMALLWAVE) && (nLineHeight > 3) )
         nLineHeight = 3;
@@ -303,13 +303,13 @@ void OutputDevice::ImplDrawStraightTextLine( long nBaseX, long nBaseY,
     case UNDERLINE_DASHDOTDOT:
         if ( bIsAbove )
         {
-            nLineHeight = pFontInstance->maFontMetric.GetAboveUnderlineSize();
-            nLinePos    = nY + pFontInstance->maFontMetric.GetAboveUnderlineOffset();
+            nLineHeight = pFontInstance->mxFontMetric->GetAboveUnderlineSize();
+            nLinePos    = nY + pFontInstance->mxFontMetric->GetAboveUnderlineOffset();
         }
         else
         {
-            nLineHeight = pFontInstance->maFontMetric.GetUnderlineSize();
-            nLinePos    = nY + pFontInstance->maFontMetric.GetUnderlineOffset();
+            nLineHeight = pFontInstance->mxFontMetric->GetUnderlineSize();
+            nLinePos    = nY + pFontInstance->mxFontMetric->GetUnderlineOffset();
         }
         break;
     case UNDERLINE_BOLD:
@@ -320,27 +320,27 @@ void OutputDevice::ImplDrawStraightTextLine( long nBaseX, long nBaseY,
     case UNDERLINE_BOLDDASHDOTDOT:
         if ( bIsAbove )
         {
-            nLineHeight = pFontInstance->maFontMetric.GetAboveBoldUnderlineSize();
-            nLinePos    = nY + pFontInstance->maFontMetric.GetAboveBoldUnderlineOffset();
+            nLineHeight = pFontInstance->mxFontMetric->GetAboveBoldUnderlineSize();
+            nLinePos    = nY + pFontInstance->mxFontMetric->GetAboveBoldUnderlineOffset();
         }
         else
         {
-            nLineHeight = pFontInstance->maFontMetric.GetBoldUnderlineSize();
-            nLinePos    = nY + pFontInstance->maFontMetric.GetBoldUnderlineOffset();
+            nLineHeight = pFontInstance->mxFontMetric->GetBoldUnderlineSize();
+            nLinePos    = nY + pFontInstance->mxFontMetric->GetBoldUnderlineOffset();
         }
         break;
     case UNDERLINE_DOUBLE:
         if ( bIsAbove )
         {
-            nLineHeight = pFontInstance->maFontMetric.GetAboveDoubleUnderlineSize();
-            nLinePos    = nY + pFontInstance->maFontMetric.GetAboveDoubleUnderlineOffset1();
-            nLinePos2   = nY + pFontInstance->maFontMetric.GetAboveDoubleUnderlineOffset2();
+            nLineHeight = pFontInstance->mxFontMetric->GetAboveDoubleUnderlineSize();
+            nLinePos    = nY + pFontInstance->mxFontMetric->GetAboveDoubleUnderlineOffset1();
+            nLinePos2   = nY + pFontInstance->mxFontMetric->GetAboveDoubleUnderlineOffset2();
         }
         else
         {
-            nLineHeight = pFontInstance->maFontMetric.GetDoubleUnderlineSize();
-            nLinePos    = nY + pFontInstance->maFontMetric.GetDoubleUnderlineOffset1();
-            nLinePos2   = nY + pFontInstance->maFontMetric.GetDoubleUnderlineOffset2();
+            nLineHeight = pFontInstance->mxFontMetric->GetDoubleUnderlineSize();
+            nLinePos    = nY + pFontInstance->mxFontMetric->GetDoubleUnderlineOffset1();
+            nLinePos2   = nY + pFontInstance->mxFontMetric->GetDoubleUnderlineOffset2();
         }
         break;
     default:
@@ -538,17 +538,17 @@ void OutputDevice::ImplDrawStrikeoutLine( long nBaseX, long nBaseY,
     switch ( eStrikeout )
     {
     case STRIKEOUT_SINGLE:
-        nLineHeight = pFontInstance->maFontMetric.GetStrikeoutSize();
-        nLinePos    = nY + pFontInstance->maFontMetric.GetStrikeoutOffset();
+        nLineHeight = pFontInstance->mxFontMetric->GetStrikeoutSize();
+        nLinePos    = nY + pFontInstance->mxFontMetric->GetStrikeoutOffset();
         break;
     case STRIKEOUT_BOLD:
-        nLineHeight = pFontInstance->maFontMetric.GetBoldStrikeoutSize();
-        nLinePos    = nY + pFontInstance->maFontMetric.GetBoldStrikeoutOffset();
+        nLineHeight = pFontInstance->mxFontMetric->GetBoldStrikeoutSize();
+        nLinePos    = nY + pFontInstance->mxFontMetric->GetBoldStrikeoutOffset();
         break;
     case STRIKEOUT_DOUBLE:
-        nLineHeight = pFontInstance->maFontMetric.GetDoubleStrikeoutSize();
-        nLinePos    = nY + pFontInstance->maFontMetric.GetDoubleStrikeoutOffset1();
-        nLinePos2   = nY + pFontInstance->maFontMetric.GetDoubleStrikeoutOffset2();
+        nLineHeight = pFontInstance->mxFontMetric->GetDoubleStrikeoutSize();
+        nLinePos    = nY + pFontInstance->mxFontMetric->GetDoubleStrikeoutOffset1();
+        nLinePos2   = nY + pFontInstance->mxFontMetric->GetDoubleStrikeoutOffset2();
         break;
     default:
         break;
@@ -652,8 +652,8 @@ void OutputDevice::ImplDrawStrikeoutChar( long nBaseX, long nBaseY,
     Rectangle aPixelRect;
     aPixelRect.Left() = nBaseX+mnTextOffX;
     aPixelRect.Right() = aPixelRect.Left()+nWidth;
-    aPixelRect.Bottom() = nBaseY+mpFontInstance->maFontMetric.GetDescent();
-    aPixelRect.Top() = nBaseY-mpFontInstance->maFontMetric.GetAscent();
+    aPixelRect.Bottom() = nBaseY+mpFontInstance->mxFontMetric->GetDescent();
+    aPixelRect.Top() = nBaseY-mpFontInstance->mxFontMetric->GetAscent();
 
     if (mpFontInstance->mnOrientation)
     {
@@ -1043,9 +1043,9 @@ void OutputDevice::DrawWaveLine( const Point& rStartPos, const Point& rEndPos )
 
     // #109280# make sure the waveline does not exceed the descent to avoid paint problems
     LogicalFontInstance* pFontInstance = mpFontInstance;
-    if( nWaveHeight > pFontInstance->maFontMetric.GetWavelineUnderlineSize() )
+    if( nWaveHeight > pFontInstance->mxFontMetric->GetWavelineUnderlineSize() )
     {
-        nWaveHeight = pFontInstance->maFontMetric.GetWavelineUnderlineSize();
+        nWaveHeight = pFontInstance->mxFontMetric->GetWavelineUnderlineSize();
     }
     ImplDrawWaveLine(nStartX, nStartY, 0, 0,
                      nEndX-nStartX, nWaveHeight,
diff --git a/vcl/unx/generic/gdi/cairotextrender.cxx b/vcl/unx/generic/gdi/cairotextrender.cxx
index 4476a44..979202f 100644
--- a/vcl/unx/generic/gdi/cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/cairotextrender.cxx
@@ -455,7 +455,7 @@ FontConfigFontOptions* GetFCFontOptions( const FontAttributes& rFontAttributes,
 }
 
 void
-CairoTextRender::GetFontMetric( ImplFontMetricData *pFontMetric, int nFallbackLevel )
+CairoTextRender::GetFontMetric( ImplFontMetricDataPtr& xFontMetric, int nFallbackLevel )
 {
     if( nFallbackLevel >= MAX_FALLBACK )
         return;
@@ -463,7 +463,7 @@ CairoTextRender::GetFontMetric( ImplFontMetricData *pFontMetric, int nFallbackLe
     if( mpServerFont[nFallbackLevel] != nullptr )
     {
         long rDummyFactor;
-        mpServerFont[nFallbackLevel]->GetFontMetric( *pFontMetric, rDummyFactor );
+        mpServerFont[nFallbackLevel]->GetFontMetric( xFontMetric, rDummyFactor );
     }
 }
 
diff --git a/vcl/unx/generic/gdi/salgdi3.cxx b/vcl/unx/generic/gdi/salgdi3.cxx
index c4e3037..4796478 100644
--- a/vcl/unx/generic/gdi/salgdi3.cxx
+++ b/vcl/unx/generic/gdi/salgdi3.cxx
@@ -136,9 +136,9 @@ void X11SalGraphics::GetDevFontList( PhysicalFontCollection* pFontCollection )
 }
 
 void
-X11SalGraphics::GetFontMetric( ImplFontMetricData *pFontMetric, int nFallbackLevel )
+X11SalGraphics::GetFontMetric( ImplFontMetricDataPtr &xFontMetric, int nFallbackLevel )
 {
-    mxTextRenderImpl->GetFontMetric(pFontMetric, nFallbackLevel);
+    mxTextRenderImpl->GetFontMetric(xFontMetric, nFallbackLevel);
 }
 
 bool X11SalGraphics::GetGlyphBoundRect( sal_GlyphId aGlyphId, Rectangle& rRect )
diff --git a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
index f2638f8..16100a8 100644
--- a/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/freetype_glyphcache.cxx
@@ -614,19 +614,19 @@ ServerFont::~ServerFont()
 }
 
 
-void ServerFont::GetFontMetric( ImplFontMetricData& rTo, long& rFactor ) const
+void ServerFont::GetFontMetric( ImplFontMetricDataPtr& rTo, long& rFactor ) const
 {
-    static_cast< FontAttributes& >(rTo) = mpFontInfo->GetFontAttributes();
+    rTo->FontAttributes::operator =(mpFontInfo->GetFontAttributes());
 
-    rTo.SetScalableFlag( true ); // FIXME: Shouldn't this check FT_IS_SCALABLE( maFaceFT )?
-    rTo.SetTrueTypeFlag( FT_IS_SFNT( maFaceFT ) != 0 );
-    rTo.SetBuiltInFontFlag( true );
-    rTo.SetKernableFlag( FT_HAS_KERNING( maFaceFT ) != 0 );
-    rTo.SetOrientation( GetFontSelData().mnOrientation );
+    rTo->SetScalableFlag( true ); // FIXME: Shouldn't this check FT_IS_SCALABLE( maFaceFT )?
+    rTo->SetTrueTypeFlag( FT_IS_SFNT( maFaceFT ) != 0 );
+    rTo->SetBuiltInFontFlag( true );
+    rTo->SetKernableFlag( FT_HAS_KERNING( maFaceFT ) != 0 );
+    rTo->SetOrientation( GetFontSelData().mnOrientation );
 
     //Always consider [star]symbol as symbol fonts
-    if ( IsStarSymbol( rTo.GetFamilyName() ) )
-        rTo.SetSymbolFlag( true );
+    if ( IsStarSymbol( rTo->GetFamilyName() ) )
+        rTo->SetSymbolFlag( true );
 
     FT_Activate_Size( maSizeFT );
 
@@ -635,11 +635,11 @@ void ServerFont::GetFontMetric( ImplFontMetricData& rTo, long& rFactor ) const
     const TT_OS2* pOS2 = static_cast<const TT_OS2*>(FT_Get_Sfnt_Table( maFaceFT, ft_sfnt_os2 ));
     const double fScale = (double)GetFontSelData().mnHeight / maFaceFT->units_per_EM;
 
-    rTo.SetAscent( 0 );
-    rTo.SetDescent( 0 );
-    rTo.SetExternalLeading( 0 );
-    rTo.SetSlant( 0 );
-    rTo.SetWidth( mnWidth );
+    rTo->SetAscent( 0 );
+    rTo->SetDescent( 0 );
+    rTo->SetExternalLeading( 0 );
+    rTo->SetSlant( 0 );
+    rTo->SetWidth( mnWidth );
 
     // Calculating ascender and descender:
     // FreeType >= 2.4.6 does the right thing, so we just use what it gives us,
@@ -650,63 +650,63 @@ void ServerFont::GetFontMetric( ImplFontMetricData& rTo, long& rFactor ) const
     if (nFTVERSION >= 2406)
     {
         const FT_Size_Metrics& rMetrics = maFaceFT->size->metrics;
-        rTo.SetAscent( (rMetrics.ascender + 32) >> 6 );
-        rTo.SetDescent( (-rMetrics.descender + 32) >> 6 );
-        rTo.SetExternalLeading( ((rMetrics.height + 32) >> 6) - (rTo.GetAscent() + rTo.GetDescent()) );
+        rTo->SetAscent( (rMetrics.ascender + 32) >> 6 );
+        rTo->SetDescent( (-rMetrics.descender + 32) >> 6 );
+        rTo->SetExternalLeading( ((rMetrics.height + 32) >> 6) - (rTo->GetAscent() + rTo->GetDescent()) );
     }
     else
     {
         const TT_HoriHeader* pHHea = static_cast<const TT_HoriHeader*>(FT_Get_Sfnt_Table(maFaceFT, ft_sfnt_hhea));
         if (pHHea)
         {
-            rTo.SetAscent( pHHea->Ascender * fScale + 0.5 );
-            rTo.SetDescent( -pHHea->Descender * fScale + 0.5 );
-            rTo.SetExternalLeading( pHHea->Line_Gap * fScale + 0.5 );
+            rTo->SetAscent( pHHea->Ascender * fScale + 0.5 );
+            rTo->SetDescent( -pHHea->Descender * fScale + 0.5 );
+            rTo->SetExternalLeading( pHHea->Line_Gap * fScale + 0.5 );
         }
 
-        if (!(rTo.GetAscent() || rTo.GetDescent()))
+        if (!(rTo->GetAscent() || rTo->GetDescent()))
         {
             if (pOS2 && (pOS2->version != 0xFFFF))
             {
                 if (pOS2->sTypoAscender || pOS2->sTypoDescender)
                 {
-                    rTo.SetAscent( pOS2->sTypoAscender * fScale + 0.5 );
-                    rTo.SetDescent( -pOS2->sTypoDescender * fScale + 0.5 );
-                    rTo.SetExternalLeading( pOS2->sTypoLineGap * fScale + 0.5 );
+                    rTo->SetAscent( pOS2->sTypoAscender * fScale + 0.5 );
+                    rTo->SetDescent( -pOS2->sTypoDescender * fScale + 0.5 );
+                    rTo->SetExternalLeading( pOS2->sTypoLineGap * fScale + 0.5 );
                 }
                 else
                 {
-                    rTo.SetAscent( pOS2->usWinAscent * fScale + 0.5 );
-                    rTo.SetDescent( pOS2->usWinDescent * fScale + 0.5 );
-                    rTo.SetExternalLeading( 0 );
+                    rTo->SetAscent( pOS2->usWinAscent * fScale + 0.5 );
+                    rTo->SetDescent( pOS2->usWinDescent * fScale + 0.5 );
+                    rTo->SetExternalLeading( 0 );
                 }
             }
         }
 
-        if (!(rTo.GetAscent() || rTo.GetDescent()))
+        if (!(rTo->GetAscent() || rTo->GetDescent()))
         {
             const FT_Size_Metrics& rMetrics = maFaceFT->size->metrics;
-            rTo.SetAscent( (rMetrics.ascender + 32) >> 6 );
-            rTo.SetDescent( (-rMetrics.descender + 32) >> 6 );
-            rTo.SetExternalLeading( ((rMetrics.height + 32) >> 6) - (rTo.GetAscent() + rTo.GetDescent() ) );
+            rTo->SetAscent( (rMetrics.ascender + 32) >> 6 );
+            rTo->SetDescent( (-rMetrics.descender + 32) >> 6 );
+            rTo->SetExternalLeading( ((rMetrics.height + 32) >> 6) - (rTo->GetAscent() + rTo->GetDescent() ) );
         }
     }
 
-    rTo.SetInternalLeading( rTo.GetAscent() + rTo.GetDescent() - (maFaceFT->units_per_EM * fScale + 0.5) );
+    rTo->SetInternalLeading( rTo->GetAscent() + rTo->GetDescent() - (maFaceFT->units_per_EM * fScale + 0.5) );
 
     if( pOS2 && (pOS2->version != 0xFFFF) )
     {
         // map the panose info from the OS2 table to their VCL counterparts
         switch( pOS2->panose[0] )
         {
-            case 1: rTo.SetFamilyType( FAMILY_ROMAN ); break;
-            case 2: rTo.SetFamilyType( FAMILY_SWISS ); break;
-            case 3: rTo.SetFamilyType( FAMILY_MODERN ); break;
-            case 4: rTo.SetFamilyType( FAMILY_SCRIPT ); break;
-            case 5: rTo.SetFamilyType( FAMILY_DECORATIVE ); break;
+            case 1: rTo->SetFamilyType( FAMILY_ROMAN ); break;
+            case 2: rTo->SetFamilyType( FAMILY_SWISS ); break;
+            case 3: rTo->SetFamilyType( FAMILY_MODERN ); break;
+            case 4: rTo->SetFamilyType( FAMILY_SCRIPT ); break;
+            case 5: rTo->SetFamilyType( FAMILY_DECORATIVE ); break;
             // TODO: is it reasonable to override the attribute with DONTKNOW?
             case 0: // fall through
-            default: rTo.SetFamilyType( FAMILY_DONTKNOW ); break;
+            default: rTo->SetFamilyType( FAMILY_DONTKNOW ); break;
         }
 
         switch( pOS2->panose[3] )
@@ -717,12 +717,12 @@ void ServerFont::GetFontMetric( ImplFontMetricData& rTo, long& rFactor ) const
             case 5: // fall through
             case 6: // fall through
             case 7: // fall through
-            case 8: rTo.SetPitch( PITCH_VARIABLE ); break;
-            case 9: rTo.SetPitch( PITCH_FIXED ); break;
+            case 8: rTo->SetPitch( PITCH_VARIABLE ); break;
+            case 9: rTo->SetPitch( PITCH_FIXED ); break;
             // TODO: is it reasonable to override the attribute with DONTKNOW?
             case 0: // fall through
             case 1: // fall through
-            default: rTo.SetPitch( PITCH_DONTKNOW ); break;
+            default: rTo->SetPitch( PITCH_DONTKNOW ); break;
         }
     }
 
@@ -733,8 +733,9 @@ void ServerFont::GetFontMetric( ImplFontMetricData& rTo, long& rFactor ) const
     {
         GlyphData aGlyphData;
         InitGlyphData( nKashidaGlyphId, aGlyphData );
-        rTo.SetMinKashida( aGlyphData.GetMetric().GetCharWidth() );
+        rTo->SetMinKashida( aGlyphData.GetMetric().GetCharWidth() );
     }
+
 }
 
 static inline void SplitGlyphFlags( const ServerFont& rFont, sal_GlyphId& rGlyphId, int& nGlyphFlags )
diff --git a/vcl/unx/generic/print/genpspgraphics.cxx b/vcl/unx/generic/print/genpspgraphics.cxx
index 931e87e..19965a3 100644
--- a/vcl/unx/generic/print/genpspgraphics.cxx
+++ b/vcl/unx/generic/print/genpspgraphics.cxx
@@ -914,7 +914,7 @@ void GenPspGraphics::ClearDevFontCache()
     GlyphCache::GetInstance().ClearFontCache();
 }
 
-void GenPspGraphics::GetFontMetric( ImplFontMetricData *pFontMetric, int )
+void GenPspGraphics::GetFontMetric( ImplFontMetricDataPtr& rxFontMetric, int )
 {
     const psp::PrintFontManager& rMgr = psp::PrintFontManager::get();
     psp::PrintFontInfo aInfo;
@@ -922,24 +922,24 @@ void GenPspGraphics::GetFontMetric( ImplFontMetricData *pFontMetric, int )
     if (rMgr.getFontInfo (m_pPrinterGfx->GetFontID(), aInfo))
     {
         FontAttributes aDFA = Info2FontAttributes( aInfo );
-        static_cast< FontAttributes& >(*pFontMetric) = aDFA;
-        pFontMetric->SetBuiltInFontFlag( aDFA.IsBuiltInFont() );
-        pFontMetric->SetScalableFlag( true );
-        pFontMetric->SetTrueTypeFlag( false ); // FIXME, needed?
+        static_cast< FontAttributes& >(*rxFontMetric) = aDFA;
+        rxFontMetric->SetBuiltInFontFlag( aDFA.IsBuiltInFont() );
+        rxFontMetric->SetScalableFlag( true );
+        rxFontMetric->SetTrueTypeFlag( false ); // FIXME, needed?
 
-        pFontMetric->SetOrientation( m_pPrinterGfx->GetFontAngle() );
-        pFontMetric->SetSlant( 0 );
+        rxFontMetric->SetOrientation( m_pPrinterGfx->GetFontAngle() );
+        rxFontMetric->SetSlant( 0 );
 
         sal_Int32 nTextHeight   = m_pPrinterGfx->GetFontHeight();
         sal_Int32 nTextWidth    = m_pPrinterGfx->GetFontWidth();
         if( ! nTextWidth )
             nTextWidth = nTextHeight;
 
-        pFontMetric->SetWidth( nTextWidth );
-        pFontMetric->SetAscent( ( aInfo.m_nAscend * nTextHeight + 500 ) / 1000 );
-        pFontMetric->SetDescent( ( aInfo.m_nDescend * nTextHeight + 500 ) / 1000 );
-        pFontMetric->SetInternalLeading( ( aInfo.m_nLeading * nTextHeight + 500 ) / 1000 );
-        pFontMetric->SetExternalLeading( 0 );
+        rxFontMetric->SetWidth( nTextWidth );
+        rxFontMetric->SetAscent( ( aInfo.m_nAscend * nTextHeight + 500 ) / 1000 );
+        rxFontMetric->SetDescent( ( aInfo.m_nDescend * nTextHeight + 500 ) / 1000 );
+        rxFontMetric->SetInternalLeading( ( aInfo.m_nLeading * nTextHeight + 500 ) / 1000 );
+        rxFontMetric->SetExternalLeading( 0 );
     }
 }
 
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx
index 674eeaf..ef00538 100644
--- a/vcl/win/gdi/salfont.cxx
+++ b/vcl/win/gdi/salfont.cxx
@@ -1479,7 +1479,7 @@ sal_uInt16 WinSalGraphics::SetFont( FontSelectPattern* pFont, int nFallbackLevel
         return 0;
 }
 
-void WinSalGraphics::GetFontMetric( ImplFontMetricData* pFontMetric, int nFallbackLevel )
+void WinSalGraphics::GetFontMetric( ImplFontMetricDataPtr& pFontMetric, int nFallbackLevel )
 {
     // temporarily change the HDC to the font in the fallback level
     HFONT hOldFont = SelectFont( getHDC(), mhFonts[nFallbackLevel] );
diff --git a/vcl/win/gdi/winlayout.cxx b/vcl/win/gdi/winlayout.cxx
index 68c1eb2..c41a2b8 100644
--- a/vcl/win/gdi/winlayout.cxx
+++ b/vcl/win/gdi/winlayout.cxx
@@ -1846,7 +1846,7 @@ bool UniscribeLayout::CacheGlyphs(SalGraphics& rGraphics) const
 
     if (mbUseGLyphy)
     {
-        if (!mrWinFontEntry.maFontMetric.IsTrueTypeFont())
+        if (!mrWinFontEntry.mxFontMetric->IsTrueTypeFont())
             return false;
 
         mrWinFontEntry.setupGLyphy(mhDC);


More information about the Libreoffice-commits mailing list