summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vcl/headless/svptext.cxx4
-rw-r--r--vcl/inc/cairotextrender.hxx2
-rw-r--r--vcl/inc/fontinstance.hxx2
-rw-r--r--vcl/inc/headless/svpgdi.hxx2
-rw-r--r--vcl/inc/impfontmetricdata.hxx22
-rw-r--r--vcl/inc/quartz/salgdi.h4
-rw-r--r--vcl/inc/salgdi.hxx2
-rw-r--r--vcl/inc/textrender.hxx2
-rw-r--r--vcl/inc/unx/genpspgraphics.h2
-rw-r--r--vcl/inc/unx/glyphcache.hxx2
-rw-r--r--vcl/inc/unx/salgdi.h2
-rw-r--r--vcl/inc/win/salgdi.h2
-rw-r--r--vcl/quartz/ctfonts.cxx18
-rw-r--r--vcl/quartz/salgdi.cxx4
-rw-r--r--vcl/source/font/fontinstance.cxx3
-rw-r--r--vcl/source/font/fontmetric.cxx1
-rw-r--r--vcl/source/gdi/pdfwriter_impl.cxx84
-rw-r--r--vcl/source/gdi/print.cxx2
-rw-r--r--vcl/source/gdi/virdev.cxx5
-rw-r--r--vcl/source/outdev/font.cxx77
-rw-r--r--vcl/source/outdev/text.cxx8
-rw-r--r--vcl/source/outdev/textline.cxx62
-rw-r--r--vcl/unx/generic/gdi/cairotextrender.cxx4
-rw-r--r--vcl/unx/generic/gdi/salgdi3.cxx4
-rw-r--r--vcl/unx/generic/glyphs/freetype_glyphcache.cxx85
-rw-r--r--vcl/unx/generic/print/genpspgraphics.cxx24
-rw-r--r--vcl/win/gdi/salfont.cxx2
-rw-r--r--vcl/win/gdi/winlayout.cxx2
28 files changed, 226 insertions, 207 deletions
diff --git a/vcl/headless/svptext.cxx b/vcl/headless/svptext.cxx
index 4c40086484ee..4346713f6fb9 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 027d88570104..1070ad863078 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 84d82bedccbd..d57f1015d676 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 e88701d83d77..d10b6fd803e8 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 8f0c0e926420..59926438c705 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 a9628459edf6..73e959216ca4 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 ca2251f19be3..8c0ded73b3f0 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 2c0bf7fc9406..f55619a93c61 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 15f00418e6fe..6f6fa6940c9a 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 ea756a52ad32..f73c87b764c3 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 9f5b3819dc0e..a8bbb044802a 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 8b894020fa87..d90e429051bb 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 ef8767fbc587..573f8ef26a1a 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 fb9e8dbbe758..d4dd9582028e 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 22fde5e09056..8415dd0390e3 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 6cd5c31fce8e..3f27d62be13f 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 05cc9bc31f09..69d8b50720f3 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 fcb25d5f4f25..9ce0c72e3dba 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 8e426ea988e9..a83f88f1df63 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 f85fcc89d8ee..ce87da9b6244 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 912249a0eee8..1696ae2c3033 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 7e147d85e134..556004447776 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 4476a448da39..979202fccf57 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 c4e3037aa0c1..4796478987de 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 f2638f845b0f..16100a8793a7 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 931e87e376b7..19965a336f67 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 674eeaf3d28b..ef005381fff1 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 68c1eb2fdbb2..c41a2b88cdd6 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);