[Libreoffice-commits] core.git: vcl/inc vcl/source
Chris Sherlock
chris.sherlock79 at gmail.com
Thu Dec 24 17:14:20 PST 2015
vcl/inc/PhysicalFontFace.hxx | 2
vcl/inc/PhysicalFontFamily.hxx | 5 -
vcl/source/font/PhysicalFontFace.cxx | 1
vcl/source/font/PhysicalFontFamily.cxx | 123 ++++++++++++++++-----------------
4 files changed, 65 insertions(+), 66 deletions(-)
New commits:
commit a20a52a2f47c67ab30bf764d420c663f7173f032
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date: Fri Dec 25 00:40:38 2015 +1100
vcl: PhysicalFontFamily now handles it's own list of font faces
The internal linked list has now been removed from PhysicalFontFace
and a std::vector is used within PhysicalFontFamily, which is the
class that actually should be managing the storage of font face
instances.
Change-Id: I4f0c5f8831c3f3b60b81b814ca8ea8e2f2e1e7a9
Reviewed-on: https://gerrit.libreoffice.org/20922
Reviewed-by: Chris Sherlock <chris.sherlock79 at gmail.com>
Tested-by: Chris Sherlock <chris.sherlock79 at gmail.com>
diff --git a/vcl/inc/PhysicalFontFace.hxx b/vcl/inc/PhysicalFontFace.hxx
index 4c3f04b..aed2f03 100644
--- a/vcl/inc/PhysicalFontFace.hxx
+++ b/vcl/inc/PhysicalFontFace.hxx
@@ -60,7 +60,6 @@ public:
int GetFontMagic() const { return mnMagic; }
bool IsScalable() const { return (mnHeight == 0); }
bool CheckMagic( int n ) const { return (n == mnMagic); }
- PhysicalFontFace* GetNextFace() const { return mpNext; }
bool IsBetterMatch( const FontSelectPattern&, FontMatchStatus& ) const;
sal_Int32 CompareWithSize( const PhysicalFontFace& ) const;
@@ -78,7 +77,6 @@ protected:
private:
friend class PhysicalFontFamily;
const int mnMagic; // poor man's RTTI
- PhysicalFontFace* mpNext;
};
#endif // INCLUDED_VCL_INC_PHYSICALFONTFACE_HXX
diff --git a/vcl/inc/PhysicalFontFamily.hxx b/vcl/inc/PhysicalFontFamily.hxx
index 8c38586..b3ba21b 100644
--- a/vcl/inc/PhysicalFontFamily.hxx
+++ b/vcl/inc/PhysicalFontFamily.hxx
@@ -52,7 +52,7 @@ public:
ImplFontAttrs GetMatchType() const { return mnMatchType ; }
FontWeight GetMatchWeight() const { return meMatchWeight ; }
FontWidth GetMatchWidth() const { return meMatchWidth ; }
- bool IsScalable() const { return mpFirst->IsScalable(); }
+ bool IsScalable() const { return maFontFaces[0]->IsScalable(); }
int GetMinQuality() const { return mnMinQuality; }
int GetTypeFaces() const { return mnTypeFaces; }
bool AddFontFace( PhysicalFontFace* );
@@ -69,7 +69,8 @@ static void CalcType( ImplFontAttrs& rType, FontWeight& rWeight, Fon
FontFamily eFamily, const utl::FontNameAttr* pFontAttr );
private:
- PhysicalFontFace* mpFirst; // linked list of physical font faces
+ std::vector< PhysicalFontFace* > maFontFaces;
+
OUString maName; // Fontname (original font family name)
OUString maSearchName; // normalized font family name
OUString maMapNames; // fontname aliases
diff --git a/vcl/source/font/PhysicalFontFace.cxx b/vcl/source/font/PhysicalFontFace.cxx
index b930223..d263cf8 100644
--- a/vcl/source/font/PhysicalFontFace.cxx
+++ b/vcl/source/font/PhysicalFontFace.cxx
@@ -30,7 +30,6 @@ PhysicalFontFace::PhysicalFontFace( const ImplDevFontAttributes& rDFA, int nMagi
, mnWidth(0)
, mnHeight(0)
, mnMagic( nMagic )
- , mpNext( nullptr )
{
// StarSymbol is a unicode font, but it still deserves the symbol flag
if( !IsSymbolFont() )
diff --git a/vcl/source/font/PhysicalFontFamily.cxx b/vcl/source/font/PhysicalFontFamily.cxx
index 83f2ab0..c58f38b 100644
--- a/vcl/source/font/PhysicalFontFamily.cxx
+++ b/vcl/source/font/PhysicalFontFamily.cxx
@@ -90,8 +90,7 @@ static ImplFontAttrs lcl_IsCJKFont( const OUString& rFontName )
}
PhysicalFontFamily::PhysicalFontFamily( const OUString& rSearchName )
-: mpFirst( nullptr ),
- maSearchName( rSearchName ),
+: maSearchName( rSearchName ),
mnTypeFaces( 0 ),
mnMatchType( ImplFontAttrs::None ),
meMatchWeight( WEIGHT_DONTKNOW ),
@@ -104,96 +103,90 @@ PhysicalFontFamily::PhysicalFontFamily( const OUString& rSearchName )
PhysicalFontFamily::~PhysicalFontFamily()
{
// release all physical font faces
- while( mpFirst )
+ for( std::vector< PhysicalFontFace* >::iterator it=maFontFaces.begin(); it != maFontFaces.end(); )
{
- PhysicalFontFace* pFace = mpFirst;
- mpFirst = pFace->GetNextFace();
- delete pFace;
+ delete *it;
+ it = maFontFaces.erase( it );
}
+
}
-bool PhysicalFontFamily::AddFontFace( PhysicalFontFace* pNewData )
+bool PhysicalFontFamily::AddFontFace( PhysicalFontFace* pNewFontFace )
{
- pNewData->mpNext = nullptr;
-
- if( !mpFirst )
+ if( maFontFaces.empty() )
{
- maName = pNewData->GetFamilyName();
- maMapNames = pNewData->maMapNames;
- meFamily = pNewData->GetFamilyType();
- mePitch = pNewData->GetPitch();
- mnMinQuality = pNewData->mnQuality;
+ maName = pNewFontFace->GetFamilyName();
+ maMapNames = pNewFontFace->maMapNames;
+ meFamily = pNewFontFace->GetFamilyType();
+ mePitch = pNewFontFace->GetPitch();
+ mnMinQuality = pNewFontFace->mnQuality;
}
else
{
if( meFamily == FAMILY_DONTKNOW )
- meFamily = pNewData->GetFamilyType();
+ meFamily = pNewFontFace->GetFamilyType();
if( mePitch == PITCH_DONTKNOW )
- mePitch = pNewData->GetPitch();
- if( mnMinQuality > pNewData->mnQuality )
- mnMinQuality = pNewData->mnQuality;
+ mePitch = pNewFontFace->GetPitch();
+ if( mnMinQuality > pNewFontFace->mnQuality )
+ mnMinQuality = pNewFontFace->mnQuality;
}
// set attributes for attribute based font matching
- if( pNewData->IsScalable() )
+ if( pNewFontFace->IsScalable() )
mnTypeFaces |= FONT_FAMILY_SCALABLE;
- if( pNewData->IsSymbolFont() )
+ if( pNewFontFace->IsSymbolFont() )
mnTypeFaces |= FONT_FAMILY_SYMBOL;
else
mnTypeFaces |= FONT_FAMILY_NONESYMBOL;
- if( pNewData->GetWeight() != WEIGHT_DONTKNOW )
+ if( pNewFontFace->GetWeight() != WEIGHT_DONTKNOW )
{
- if( pNewData->GetWeight() >= WEIGHT_SEMIBOLD )
+ if( pNewFontFace->GetWeight() >= WEIGHT_SEMIBOLD )
mnTypeFaces |= FONT_FAMILY_BOLD;
- else if( pNewData->GetWeight() <= WEIGHT_SEMILIGHT )
+ else if( pNewFontFace->GetWeight() <= WEIGHT_SEMILIGHT )
mnTypeFaces |= FONT_FAMILY_LIGHT;
else
mnTypeFaces |= FONT_FAMILY_NORMAL;
}
- if( pNewData->GetSlant() == ITALIC_NONE )
+ if( pNewFontFace->GetSlant() == ITALIC_NONE )
mnTypeFaces |= FONT_FAMILY_NONEITALIC;
- else if( (pNewData->GetSlant() == ITALIC_NORMAL)
- || (pNewData->GetSlant() == ITALIC_OBLIQUE) )
+ else if( (pNewFontFace->GetSlant() == ITALIC_NORMAL)
+ || (pNewFontFace->GetSlant() == ITALIC_OBLIQUE) )
mnTypeFaces |= FONT_FAMILY_ITALIC;
// reassign name (sharing saves memory)
- if( pNewData->GetFamilyName() == GetFamilyName() )
- pNewData->SetFamilyName( GetFamilyName() );
+ if( pNewFontFace->GetFamilyName() == GetFamilyName() )
+ pNewFontFace->SetFamilyName( GetFamilyName() );
// insert new physical font face into linked list
// TODO: get rid of linear search?
- PhysicalFontFace* pData;
- PhysicalFontFace** ppHere = &mpFirst;
- for(; (pData=*ppHere) != nullptr; ppHere=&pData->mpNext )
+ for(std::vector< PhysicalFontFace* >::iterator it=maFontFaces.begin(); it != maFontFaces.end(); ++it )
{
- sal_Int32 eComp = pNewData->CompareWithSize( *pData );
+ PhysicalFontFace* pFoundFontFace = *it;
+ sal_Int32 eComp = pNewFontFace->CompareWithSize( *pFoundFontFace );
if( eComp > 0 )
continue;
if( eComp < 0 )
break;
// ignore duplicate if its quality is worse
- if( pNewData->mnQuality < pData->mnQuality )
+ if( pNewFontFace->mnQuality < pFoundFontFace->mnQuality )
return false;
// keep the device font if its quality is good enough
- if( (pNewData->mnQuality == pData->mnQuality)
- && (pData->mbDevice || !pNewData->mbDevice) )
+ if( (pNewFontFace->mnQuality == pFoundFontFace->mnQuality) && (pFoundFontFace->mbDevice || !pNewFontFace->mbDevice) )
return false;
// replace existing font face with a better one
- pNewData->mpNext = pData->mpNext;
- *ppHere = pNewData;
- delete pData;
+ delete pFoundFontFace;
+ it = maFontFaces.erase( it );
+ maFontFaces.push_back( pNewFontFace );
return true;
}
- // insert into or append to list of physical font faces
- pNewData->mpNext = pData;
- *ppHere = pNewData;
+ maFontFaces.push_back( pNewFontFace );
return true;
}
@@ -218,16 +211,16 @@ void PhysicalFontFamily::InitMatchData( const utl::FontSubstConfiguration& rFont
PhysicalFontFace* PhysicalFontFamily::FindBestFontFace( const FontSelectPattern& rFSD ) const
{
- if( !mpFirst )
+ if( maFontFaces.empty() )
return nullptr;
- if( !mpFirst->GetNextFace() )
- return mpFirst;
+ if( maFontFaces.size() == 1)
+ return maFontFaces[0];
// FontName+StyleName should map to FamilyName+StyleName
const OUString& rSearchName = rFSD.maTargetName;
OUString aTargetStyleName;
const OUString* pTargetStyleName = nullptr;
- if( (rSearchName.getLength() > maSearchName.getLength())
+ if((rSearchName.getLength() > maSearchName.getLength())
&& rSearchName.startsWith( maSearchName ) )
{
aTargetStyleName = rSearchName.copy(maSearchName.getLength() + 1);
@@ -235,12 +228,14 @@ PhysicalFontFace* PhysicalFontFamily::FindBestFontFace( const FontSelectPattern&
}
// TODO: linear search improve!
- PhysicalFontFace* pFontFace = mpFirst;
- PhysicalFontFace* pBestFontFace = pFontFace;
+ PhysicalFontFace* pBestFontFace = maFontFaces[0];
FontMatchStatus aFontMatchStatus = {0,0,0, pTargetStyleName};
- for(; pFontFace; pFontFace = pFontFace->GetNextFace() )
- if( pFontFace->IsBetterMatch( rFSD, aFontMatchStatus ) )
- pBestFontFace = pFontFace;
+ for( std::vector< PhysicalFontFace* >::const_iterator it=maFontFaces.begin(); it != maFontFaces.end(); ++it )
+ {
+ PhysicalFontFace* pFoundFontFace = *it;
+ if( pFoundFontFace->IsBetterMatch( rFSD, aFontMatchStatus ) )
+ pBestFontFace = pFoundFontFace;
+ }
return pBestFontFace;
}
@@ -250,19 +245,23 @@ PhysicalFontFace* PhysicalFontFamily::FindBestFontFace( const FontSelectPattern&
void PhysicalFontFamily::UpdateDevFontList( ImplDeviceFontList& rDevFontList ) const
{
PhysicalFontFace* pPrevFace = nullptr;
- for( PhysicalFontFace* pFace = mpFirst; pFace; pFace = pFace->GetNextFace() )
+ for(std::vector< PhysicalFontFace* >::const_iterator it=maFontFaces.begin(); it != maFontFaces.end(); ++it )
{
- if( !pPrevFace || pFace->CompareIgnoreSize( *pPrevFace ) )
- rDevFontList.Add( pFace );
- pPrevFace = pFace;
+ PhysicalFontFace* pFoundFontFace = *it;
+ if( !pPrevFace || pFoundFontFace->CompareIgnoreSize( *pPrevFace ) )
+ rDevFontList.Add( pFoundFontFace );
+ pPrevFace = pFoundFontFace;
}
}
void PhysicalFontFamily::GetFontHeights( std::set<int>& rHeights ) const
{
// add all available font heights
- for( const PhysicalFontFace* pFace = mpFirst; pFace; pFace = pFace->GetNextFace() )
- rHeights.insert( pFace->GetHeight() );
+ for( std::vector< PhysicalFontFace* >::const_iterator it=maFontFaces.begin(); it != maFontFaces.end(); ++it )
+ {
+ PhysicalFontFace *pFoundFontFace = *it;
+ rHeights.insert( pFoundFontFace->GetHeight() );
+ }
}
void PhysicalFontFamily::UpdateCloneFontList( PhysicalFontCollection& rFontCollection,
@@ -272,14 +271,16 @@ void PhysicalFontFamily::UpdateCloneFontList( PhysicalFontCollection& rFontColle
OUString aFamilyName = GetEnglishSearchFontName( GetFamilyName() );
PhysicalFontFamily* pFamily = rFontCollection.FindOrCreateFontFamily( aFamilyName );
- for( PhysicalFontFace* pFace = mpFirst; pFace; pFace = pFace->GetNextFace() )
+ for( std::vector< PhysicalFontFace* >::const_iterator it=maFontFaces.begin(); it != maFontFaces.end(); ++it )
{
- if( bScalable && !pFace->IsScalable() )
+ PhysicalFontFace *pFoundFontFace = *it;
+
+ if( bScalable && !pFoundFontFace->IsScalable() )
continue;
- if( bEmbeddable && !pFace->IsEmbeddable() && !pFace->IsSubsettable() )
+ if( bEmbeddable && !pFoundFontFace->IsEmbeddable() && !pFoundFontFace->IsSubsettable() )
continue;
- PhysicalFontFace* pClonedFace = pFace->Clone();
+ PhysicalFontFace* pClonedFace = pFoundFontFace->Clone();
assert( pClonedFace->GetFamilyName().replaceAll("-", "").trim() == GetFamilyName().replaceAll("-", "").trim() );
assert( rFontCollection.FindOrCreateFontFamily( GetEnglishSearchFontName( pClonedFace->GetFamilyName() ) ) == pFamily );
More information about the Libreoffice-commits
mailing list