tdf#62525 vcl: use cow_wrapper for font

Change-Id: Ib08d2a20c7b8dab9772c568eb4ccb8e235a30eee
Reviewed-on: https://gerrit.libreoffice.org/24308
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
This commit is contained in:
Xisco Fauli 2016-04-22 23:43:52 +02:00 committed by Thorsten Behrens
parent 03124f5be5
commit 188439aac2
3 changed files with 18 additions and 141 deletions

View file

@ -28,6 +28,7 @@
#include <tools/gen.hxx>
#include <vcl/vclenum.hxx>
#include <vcl/fntstyle.hxx>
#include <o3tl/cow_wrapper.hxx>
class SvStream;
#define FontAlign TextAlign
@ -169,10 +170,10 @@ public:
static Font identifyFont( const void* pBuffer, sal_uInt32 nLen );
private:
ImplFont* mpImplFont;
void MakeUnique();
typedef o3tl::cow_wrapper< ImplFont > ImplType;
private:
ImplType mpImplFont;
};
}

View file

@ -102,8 +102,6 @@ private:
void AskConfig();
sal_uInt32 mnRefCount;
// Device independent variables
OUString maFamilyName;
OUString maStyleName;

View file

@ -34,85 +34,57 @@
#include <algorithm>
#include <rtl/instance.hxx>
using namespace vcl;
Font::Font()
namespace
{
static ImplFont aStaticImplFont;
// RefCount is zero for static objects
aStaticImplFont.mnRefCount = 0;
mpImplFont = &aStaticImplFont;
struct theGlobalDefault :
public rtl::Static< Font::ImplType, theGlobalDefault > {};
}
Font::Font( const vcl::Font& rFont )
Font::Font() : mpImplFont(theGlobalDefault::get())
{
bool bRefIncrementable = rFont.mpImplFont->mnRefCount < ::std::numeric_limits<sal_uInt32>::max();
DBG_ASSERT( bRefIncrementable, "Font: RefCount overflow" );
mpImplFont = rFont.mpImplFont;
// do not count static objects (where RefCount is zero)
if ( mpImplFont->mnRefCount && bRefIncrementable )
mpImplFont->mnRefCount++;
}
Font::Font( const OUString& rFamilyName, const Size& rSize )
Font::Font( const vcl::Font& rFont ) : mpImplFont( rFont.mpImplFont )
{
}
Font::Font( const OUString& rFamilyName, const Size& rSize ) : mpImplFont()
{
mpImplFont = new ImplFont;
mpImplFont->SetFamilyName( rFamilyName );
mpImplFont->SetFontSize( rSize );
}
Font::Font( const OUString& rFamilyName, const OUString& rStyleName, const Size& rSize )
Font::Font( const OUString& rFamilyName, const OUString& rStyleName, const Size& rSize ) : mpImplFont()
{
mpImplFont = new ImplFont;
mpImplFont->SetFamilyName( rFamilyName );
mpImplFont->SetStyleName( rStyleName );
mpImplFont->SetFontSize( rSize );
}
Font::Font( FontFamily eFamily, const Size& rSize )
Font::Font( FontFamily eFamily, const Size& rSize ) : mpImplFont()
{
mpImplFont = new ImplFont;
mpImplFont->SetFamilyType( eFamily );
mpImplFont->SetFontSize( rSize );
}
Font::~Font()
{
// decrement reference counter and delete if last reference
// if the object is not static (Refcounter==0)
if ( mpImplFont->mnRefCount )
{
if ( mpImplFont->mnRefCount == 1 )
delete mpImplFont;
else
mpImplFont->mnRefCount--;
}
}
void Font::MakeUnique()
{
// create a copy if others still reference it
if ( mpImplFont->mnRefCount != 1 )
{
if ( mpImplFont->mnRefCount )
mpImplFont->mnRefCount--;
mpImplFont = new ImplFont( *mpImplFont );
}
}
void Font::SetColor( const Color& rColor )
{
if( mpImplFont->maColor != rColor )
{
MakeUnique();
mpImplFont->maColor = rColor;
}
}
void Font::SetFillColor( const Color& rColor )
{
MakeUnique();
mpImplFont->maFillColor = rColor;
if ( rColor.GetTransparency() )
mpImplFont->mbTransparent = true;
@ -121,56 +93,41 @@ void Font::SetFillColor( const Color& rColor )
void Font::SetTransparent( bool bTransparent )
{
if( mpImplFont->mbTransparent != bTransparent )
{
MakeUnique();
mpImplFont->mbTransparent = bTransparent;
}
}
void Font::SetAlignment( FontAlign eAlign )
{
if( mpImplFont->meAlign != eAlign )
{
MakeUnique();
mpImplFont->SetAlignment(eAlign);
}
}
void Font::SetFamilyName( const OUString& rFamilyName )
{
MakeUnique();
mpImplFont->SetFamilyName( rFamilyName );
}
void Font::SetStyleName( const OUString& rStyleName )
{
MakeUnique();
mpImplFont->maStyleName = rStyleName;
}
void Font::SetFontSize( const Size& rSize )
{
if( mpImplFont->GetFontSize() != rSize )
{
MakeUnique();
mpImplFont->SetFontSize( rSize );
}
}
void Font::SetFamily( FontFamily eFamily )
{
if( mpImplFont->GetFamilyType() != eFamily )
{
MakeUnique();
mpImplFont->SetFamilyType( eFamily );
}
}
void Font::SetCharSet( rtl_TextEncoding eCharSet )
{
if( mpImplFont->GetCharSet() != eCharSet )
{
MakeUnique();
mpImplFont->SetCharSet( eCharSet );
if ( eCharSet == RTL_TEXTENCODING_SYMBOL )
@ -203,73 +160,49 @@ void Font::SetSymbolFlag( bool bSymbol )
void Font::SetLanguageTag( const LanguageTag& rLanguageTag )
{
if( mpImplFont->maLanguageTag != rLanguageTag )
{
MakeUnique();
mpImplFont->maLanguageTag = rLanguageTag;
}
}
void Font::SetCJKContextLanguageTag( const LanguageTag& rLanguageTag )
{
if( mpImplFont->maCJKLanguageTag != rLanguageTag )
{
MakeUnique();
mpImplFont->maCJKLanguageTag = rLanguageTag;
}
}
void Font::SetLanguage( LanguageType eLanguage )
{
if( mpImplFont->maLanguageTag.getLanguageType( false) != eLanguage )
{
MakeUnique();
mpImplFont->maLanguageTag.reset( eLanguage);
}
}
void Font::SetCJKContextLanguage( LanguageType eLanguage )
{
if( mpImplFont->maCJKLanguageTag.getLanguageType( false) != eLanguage )
{
MakeUnique();
mpImplFont->maCJKLanguageTag.reset( eLanguage);
}
}
void Font::SetPitch( FontPitch ePitch )
{
if( mpImplFont->GetPitchNoAsk() != ePitch )
{
MakeUnique();
mpImplFont->SetPitch( ePitch );
}
}
void Font::SetOrientation( short nOrientation )
{
if( mpImplFont->mnOrientation != nOrientation )
{
MakeUnique();
mpImplFont->mnOrientation = nOrientation;
}
}
void Font::SetVertical( bool bVertical )
{
if( mpImplFont->mbVertical != bVertical )
{
MakeUnique();
mpImplFont->mbVertical = bVertical;
}
}
void Font::SetKerning( FontKerning eKerning )
{
if( mpImplFont->meKerning != eKerning )
{
MakeUnique();
mpImplFont->meKerning = eKerning;
}
}
bool Font::IsKerning() const
@ -280,130 +213,78 @@ bool Font::IsKerning() const
void Font::SetWeight( FontWeight eWeight )
{
if( mpImplFont->GetWeightNoAsk() != eWeight )
{
MakeUnique();
mpImplFont->SetWeight( eWeight );
}
}
void Font::SetWidthType( FontWidth eWidth )
{
if( mpImplFont->GetWidthTypeNoAsk() != eWidth )
{
MakeUnique();
mpImplFont->SetWidthType( eWidth );
}
}
void Font::SetItalic( FontItalic eItalic )
{
if( mpImplFont->GetItalicNoAsk() != eItalic )
{
MakeUnique();
mpImplFont->SetItalic( eItalic );
}
}
void Font::SetOutline( bool bOutline )
{
if( mpImplFont->mbOutline != bOutline )
{
MakeUnique();
mpImplFont->mbOutline = bOutline;
}
}
void Font::SetShadow( bool bShadow )
{
if( mpImplFont->mbShadow != bShadow )
{
MakeUnique();
mpImplFont->mbShadow = bShadow;
}
}
void Font::SetUnderline( FontLineStyle eUnderline )
{
if( mpImplFont->meUnderline != eUnderline )
{
MakeUnique();
mpImplFont->meUnderline = eUnderline;
}
}
void Font::SetOverline( FontLineStyle eOverline )
{
if( mpImplFont->meOverline != eOverline )
{
MakeUnique();
mpImplFont->meOverline = eOverline;
}
}
void Font::SetStrikeout( FontStrikeout eStrikeout )
{
if( mpImplFont->meStrikeout != eStrikeout )
{
MakeUnique();
mpImplFont->meStrikeout = eStrikeout;
}
}
void Font::SetRelief( FontRelief eRelief )
{
if( mpImplFont->meRelief != eRelief )
{
MakeUnique();
mpImplFont->meRelief = eRelief;
}
}
void Font::SetEmphasisMark( FontEmphasisMark eEmphasisMark )
{
if( mpImplFont->meEmphasisMark != eEmphasisMark )
{
MakeUnique();
mpImplFont->meEmphasisMark = eEmphasisMark;
}
}
void Font::SetWordLineMode( bool bWordLine )
{
if( mpImplFont->mbWordLine != bWordLine )
{
MakeUnique();
mpImplFont->mbWordLine = bWordLine;
}
}
Font& Font::operator=( const vcl::Font& rFont )
{
bool bRefIncrementable = rFont.mpImplFont->mnRefCount < ::std::numeric_limits<sal_uInt32>::max();
DBG_ASSERT( bRefIncrementable, "Font: RefCount overflow" );
// Increment RefCount first, so that we can reference ourselves
// RefCount == 0 for static objects
if ( rFont.mpImplFont->mnRefCount && bRefIncrementable )
rFont.mpImplFont->mnRefCount++;
// If it's not static ImplData and if it's the last reference, delete it
// else decrement RefCount
if ( mpImplFont->mnRefCount )
{
if ( mpImplFont->mnRefCount == 1 )
delete mpImplFont;
else
mpImplFont->mnRefCount--;
}
mpImplFont = rFont.mpImplFont;
return *this;
}
bool Font::operator==( const vcl::Font& rFont ) const
{
return mpImplFont == rFont.mpImplFont || *mpImplFont == *rFont.mpImplFont;
return mpImplFont == rFont.mpImplFont;
}
void Font::Merge( const vcl::Font& rFont )
@ -553,7 +434,6 @@ SvStream& WriteImplFont( SvStream& rOStm, const ImplFont& rImplFont )
SvStream& ReadFont( SvStream& rIStm, vcl::Font& rFont )
{
rFont.MakeUnique();
return ReadImplFont( rIStm, *rFont.mpImplFont );
}
@ -838,7 +718,6 @@ bool Font::IsSameInstance( const vcl::Font& rFont ) const { return (mpImplFont =
ImplFont::ImplFont() :
mnRefCount( 1 ),
meWeight( WEIGHT_DONTKNOW ),
meFamily( FAMILY_DONTKNOW ),
mePitch( PITCH_DONTKNOW ),
@ -872,7 +751,6 @@ ImplFont::ImplFont() :
{}
ImplFont::ImplFont( const ImplFont& rImplFont ) :
mnRefCount( 1 ),
maFamilyName( rImplFont.maFamilyName ),
maStyleName( rImplFont.maStyleName ),
meWeight( rImplFont.meWeight ),