extensions/source/propctrlr/standardcontrol.cxx |    3 
 filter/source/msfilter/msdffimp.cxx             |   10 -
 filter/source/msfilter/svdfppt.cxx              |   13 -
 sc/source/ui/docshell/impex.cxx                 |    4 
 sd/source/filter/ppt/propread.cxx               |    6 
 sw/source/core/unocore/unochart.cxx             |    4 
 sw/source/core/unocore/unotbl.cxx               |   14 +-
 unusedcode.easy                                 |    2 
 vcl/generic/fontmanager/fontsubst.cxx           |   59 +++++++-
 vcl/inc/outfont.hxx                             |   43 ++++--
 vcl/source/gdi/outdev3.cxx                      |  165 ++++++++++++++++++------
 11 files changed, 239 insertions(+), 84 deletions(-)

New commits:
commit 81099135677ac6997473ca01a297c32025c58662
Author: Caolán McNamara <caol...@redhat.com>
Date:   Wed Jun 20 09:58:08 2012 +0100

    ditch last (?) uses of UniString::UniString(sal_Unicode, ...)
    
    Change-Id: Ie04a3465100d2f013f34168aaf136a20cd2f7e0d

diff --git a/extensions/source/propctrlr/standardcontrol.cxx 
b/extensions/source/propctrlr/standardcontrol.cxx
index 9fe02ca..0a42576 100644
--- a/extensions/source/propctrlr/standardcontrol.cxx
+++ b/extensions/source/propctrlr/standardcontrol.cxx
@@ -199,8 +199,7 @@ namespace pcr
             _rValue >>= nValue;
             if ( nValue )
             {
-                sal_Unicode nCharacter = nValue;
-                sText = String( &nCharacter, 1 );
+                sText = rtl::OUString(static_cast<sal_Unicode>(nValue));
             }
         }
         else
diff --git a/filter/source/msfilter/msdffimp.cxx 
b/filter/source/msfilter/msdffimp.cxx
index 865bcfd..fbcc445 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -3728,7 +3728,7 @@ void SvxMSDffManager::ReadObjText( const String& rText, 
SdrObject* pObj ) const
         rOutliner.SetVertical( pText->IsVerticalWriting() );
 
         sal_uInt16 nParaIndex = 0;
-        sal_uInt32 nParaSize;
+        sal_Int32 nParaSize;
         const sal_Unicode* pCurrent, *pBuf = rText.GetBuffer();
         const sal_Unicode* pEnd = rText.GetBuffer() + rText.Len();
 
@@ -3752,12 +3752,12 @@ void SvxMSDffManager::ReadObjText( const String& rText, 
SdrObject* pObj ) const
                     break;
                 }
                 else
-                    nParaSize++;
+                    ++nParaSize;
             }
             ESelection aSelection( nParaIndex, 0, nParaIndex, 0 );
-            String aParagraph( pCurrent, (sal_uInt16)nParaSize );
-            if ( !nParaIndex && !aParagraph.Len() )                 // SJ: we 
are crashing if the first paragraph is empty ?
-                aParagraph += (sal_Unicode)' ';                     // 
otherwise these two lines can be removed.
+            rtl::OUString aParagraph( pCurrent, nParaSize );
+            if ( !nParaIndex && aParagraph.isEmpty() )              // SJ: we 
are crashing if the first paragraph is empty ?
+                aParagraph += rtl::OUString(' ');                   // 
otherwise these two lines can be removed.
             rOutliner.Insert( aParagraph, nParaIndex, 0 );
             rOutliner.SetParaAttribs( nParaIndex, rOutliner.GetEmptyItemSet() 
);
 
diff --git a/filter/source/msfilter/svdfppt.cxx 
b/filter/source/msfilter/svdfppt.cxx
index d4988a0..5575ef4 100644
--- a/filter/source/msfilter/svdfppt.cxx
+++ b/filter/source/msfilter/svdfppt.cxx
@@ -442,7 +442,7 @@ SvStream& operator>>( SvStream& rIn, PptFontEntityAtom& 
rAtom )
         cData[ i ] = ( nTemp >> 8 ) | ( nTemp << 8 );
 #endif
     }
-    rAtom.aName = String( cData, i );
+    rAtom.aName = rtl::OUString(cData, i);
     OutputDevice* pDev = (OutputDevice*)Application::GetDefaultDevice();
     rAtom.bAvailable = pDev->IsFontAvailable( rAtom.aName );
     aHd.SeekToEndOfRecord( rIn );
@@ -2217,14 +2217,14 @@ SdrObject* SdrPowerPointImport::ApplyTextObj( 
PPTTextObj* pTextObj, SdrTextObj*
             {
                 PPTPortionObj* pPortion;
                 sal_Unicode* pParaText = new sal_Unicode[ nTextSize ];
-                sal_uInt32 nCurrentIndex = 0;
+                sal_Int32 nCurrentIndex = 0;
                 for ( pPortion = pPara->First(); pPortion; pPortion = 
pPara->Next() )
                 {
                     if ( pPortion->mpFieldItem )
                         pParaText[ nCurrentIndex++ ] = ' ';
                     else
                     {
-                        sal_uInt32 nCharacters = pPortion->Count();
+                        sal_Int32 nCharacters = pPortion->Count();
                         const sal_Unicode* pSource = 
pPortion->maString.GetBuffer();
                         sal_Unicode* pDest = pParaText + nCurrentIndex;
 
@@ -2233,9 +2233,8 @@ SdrObject* SdrPowerPointImport::ApplyTextObj( PPTTextObj* 
pTextObj, SdrTextObj*
                         PptFontEntityAtom* pFontEnityAtom = GetFontEnityAtom( 
nFont );
                         if ( pFontEnityAtom && ( pFontEnityAtom->eCharSet == 
RTL_TEXTENCODING_SYMBOL ) )
                         {
-                            sal_uInt32 i;
                             sal_Unicode nUnicode;
-                            for ( i = 0; i < nCharacters; i++ )
+                            for (sal_Int32 i = 0; i < nCharacters; i++ )
                             {
                                 nUnicode = pSource[ i ];
                                 if ( ! ( nUnicode & 0xff00 ) )
@@ -2253,7 +2252,7 @@ SdrObject* SdrPowerPointImport::ApplyTextObj( PPTTextObj* 
pTextObj, SdrTextObj*
 
                 ESelection aSelection( nParaIndex, 0, nParaIndex, 0 );
                 rOutliner.Insert( String(), nParaIndex, 
pPara->pParaSet->mnDepth );
-                rOutliner.QuickInsertText( String( pParaText, 
(sal_uInt16)nCurrentIndex ), aSelection );
+                rOutliner.QuickInsertText( rtl::OUString(pParaText, 
nCurrentIndex), aSelection );
                 rOutliner.SetParaAttribs( nParaIndex, 
rOutliner.GetEmptyItemSet() );
                 if ( pS )
                     rOutliner.SetStyleSheet( nParaIndex, pS );
@@ -5054,7 +5053,7 @@ void PPTStyleTextPropReader::Init( SvStream& rIn, 
SdrPowerPointImport& rMan, con
             }
         }
         if ( i )
-            aString = String( pBuf, (sal_uInt16)i );
+            aString = rtl::OUString(pBuf, i);
         delete[] pBuf;
     }
     else if( aTextHd.nRecType == PPT_PST_TextBytesAtom )
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index a0bb6cd..392d855 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -1881,8 +1881,8 @@ bool ScImportExport::Sylk2Doc( SvStream& rStrm )
                                 const sal_Unicode* p0 = p;
                                 while( *p && *p != ';' )
                                     p++;
-                                String aNumber( p0, 
sal::static_int_cast<xub_StrLen>( p - p0 ) );
-                                nFormat = aNumber.ToInt32();
+                                rtl::OUString aNumber(p0, p - p0);
+                                nFormat = aNumber.toInt32();
                             }
                             break;
                     }
diff --git a/sd/source/filter/ppt/propread.cxx 
b/sd/source/filter/ppt/propread.cxx
index 8ca34eb..52b9e5b 100644
--- a/sd/source/filter/ppt/propread.cxx
+++ b/sd/source/filter/ppt/propread.cxx
@@ -114,7 +114,7 @@ sal_Bool PropItem::Read( String& rString, sal_uInt32 
nStringType, sal_Bool bAlig
                             sal_Unicode* pWString = (sal_Unicode*)pString;
                             for ( i = 0; i < nItemSize; i++ )
                                 *this >> pWString[ i ];
-                            rString = String( pWString, 
lcl_getMaxSafeStrLen(nItemSize) );
+                            rString = rtl::OUString(pWString, 
lcl_getMaxSafeStrLen(nItemSize));
                         }
                         else
                             rString = String();
@@ -156,7 +156,7 @@ sal_Bool PropItem::Read( String& rString, sal_uInt32 
nStringType, sal_Bool bAlig
                     if ( pString[ i - 1 ] == 0 )
                     {
                         if ( (sal_uInt16)nItemSize > 1 )
-                            rString = String( pString, 
lcl_getMaxSafeStrLen(nItemSize) );
+                            rString = rtl::OUString(pString, 
lcl_getMaxSafeStrLen(nItemSize));
                         else
                             rString = String();
                         bRetValue = sal_True;
@@ -304,7 +304,7 @@ sal_Bool Section::GetDictionary( Dictionary& rDict )
                         sal_Unicode* pWString = (sal_Unicode*)pString;
                         for ( i = 0; i < nSize; i++ )
                             aStream >> pWString[ i ];
-                        aString = String( pWString, 
lcl_getMaxSafeStrLen(nSize) );
+                        aString = rtl::OUString(pWString, 
lcl_getMaxSafeStrLen(nSize));
                     }
                     else
                         aString = rtl::OUString(pString, 
lcl_getMaxSafeStrLen(nSize), mnTextEnc);
diff --git a/sw/source/core/unocore/unochart.cxx 
b/sw/source/core/unocore/unochart.cxx
index d5628f7..9ddee96 100644
--- a/sw/source/core/unocore/unochart.cxx
+++ b/sw/source/core/unocore/unochart.cxx
@@ -2190,12 +2190,12 @@ uno::Sequence< OUString > SAL_CALL 
SwChartDataSequence::generateLabel(
                             if (bUseCol)
                             {
                                 aRplc = String::CreateFromAscii( 
"%COLUMNLETTER" );
-                                aNew = String( aCellName.GetBuffer(), 
static_cast<xub_StrLen>(pBuf - aCellName.GetBuffer()) );
+                                aNew = rtl::OUString(aCellName.GetBuffer(), 
pBuf - aCellName.GetBuffer());
                             }
                             else
                             {
                                 aRplc = String::CreateFromAscii( "%ROWNUMBER" 
);
-                                aNew = String( pBuf, 
static_cast<xub_StrLen>((aCellName.GetBuffer() + nLen) - pBuf) );
+                                aNew = rtl::OUString(pBuf, 
(aCellName.GetBuffer() + nLen) - pBuf);
                             }
                             xub_StrLen nPos = aTxt.Search( aRplc );
                             if (nPos != STRING_NOTFOUND)
diff --git a/sw/source/core/unocore/unotbl.cxx 
b/sw/source/core/unocore/unotbl.cxx
index 7fd61af..78027ba 100644
--- a/sw/source/core/unocore/unotbl.cxx
+++ b/sw/source/core/unocore/unotbl.cxx
@@ -350,18 +350,18 @@ void lcl_GetCellPosition( const String &rCellName,
         // start of number found?
         if (pBuf < pEnd && ('0' <= *pBuf && *pBuf <= '9'))
         {
-            String aColTxt( rCellName.GetBuffer(), static_cast< xub_StrLen 
>(pBuf - rCellName.GetBuffer()) );
-            String aRowTxt( pBuf, static_cast< xub_StrLen 
>(rCellName.GetBuffer() + nLen - pBuf) );
-            if (aColTxt.Len() && aRowTxt.Len())
+            rtl::OUString aColTxt(rCellName.GetBuffer(), pBuf - 
rCellName.GetBuffer());
+            rtl::OUString aRowTxt(pBuf, (rCellName.GetBuffer() + nLen - pBuf));
+            if (!aColTxt.isEmpty() && !aRowTxt.isEmpty())
             {
                 sal_Int32 nColIdx = 0;
-                sal_Int32 nLength = aColTxt.Len();
-                for (xub_StrLen i = 0;  i < nLength;  ++i)
+                sal_Int32 nLength = aColTxt.getLength();
+                for (sal_Int32 i = 0;  i < nLength;  ++i)
                 {
                     nColIdx = 52 * nColIdx;
                     if (i < nLength - 1)
                         ++nColIdx;
-                    sal_Unicode cChar = aColTxt.GetBuffer()[i];
+                    sal_Unicode cChar = aColTxt[i];
                     if ('A' <= cChar && cChar <= 'Z')
                         nColIdx = nColIdx + (cChar - 'A');
                     else if ('a' <= cChar && cChar <= 'z')
@@ -374,7 +374,7 @@ void lcl_GetCellPosition( const String &rCellName,
                 }
 
                 rColumn = nColIdx;
-                rRow    = aRowTxt.ToInt32() - 1;    // - 1 because indices 
ought to be 0 based
+                rRow    = aRowTxt.toInt32() - 1;    // - 1 because indices 
ought to be 0 based
             }
         }
     }
diff --git a/unusedcode.easy b/unusedcode.easy
index d23ad1b..ffc27a2 100755
--- a/unusedcode.easy
+++ b/unusedcode.easy
@@ -206,7 +206,7 @@ VCLXPrinterServer::getImplementationId()
 VCLXPrinterServer::getTypes()
 VclEventListeners2::~VclEventListeners2()
 ViewShell::getIDocumentFieldsAccess() const
-VirtualDevice::SetOutputSizePixelAndBuffer(Size const&, 
boost::shared_array<unsigned char> const&)
+VirtualDevice::SetOutputSizePixelScaleOffsetAndBuffer(Size const&, Fraction 
const&, Point const&, boost::shared_array<unsigned char> const&)
 Window::PostUserEvent(unsigned long&, unsigned long, void*)
 X11SalGraphics::SetMask(int&, int&, unsigned int&, unsigned int&, int&, int&, 
unsigned long)
 
X509Certificate_NssImpl::getImplementation(com::sun::star::uno::Reference<com::sun::star::uno::XInterface>)
commit 8c023fd645c8b83637ffcde4055886b2e4f94393
Author: Caolán McNamara <caol...@redhat.com>
Date:   Tue Jun 19 22:23:33 2012 +0100

    Resolves: fdo#47636 cache fontconfig font substitutions
    
    But this time cache on *all* properties, not just the name, which doesn't 
cut
    it, given the things fontconfig can do, e.g. fdo#41556
    
    Change-Id: Idfc1dbac67b6912e4985570a0b7c6ccdf47fa4a5

diff --git a/vcl/generic/fontmanager/fontsubst.cxx 
b/vcl/generic/fontmanager/fontsubst.cxx
index 4f3ec48..3f51fe5 100644
--- a/vcl/generic/fontmanager/fontsubst.cxx
+++ b/vcl/generic/fontmanager/fontsubst.cxx
@@ -42,15 +42,27 @@
 #include "salprn.hxx"
 #include "region.h"
 
+#include <list>
+
 // ===========================================================================
 // platform specific font substitution hooks
 // ===========================================================================
 
+struct FontSelectPatternAttributesHash
+{
+    size_t operator()(const FontSelectPatternAttributes& rAttributes) const
+        { return rAttributes.hashCode(); }
+};
+
 class FcPreMatchSubstititution
 :   public ImplPreMatchFontSubstitution
 {
 public:
     bool FindFontSubstitute( FontSelectPattern& ) const;
+    typedef ::std::pair<FontSelectPatternAttributes, 
FontSelectPatternAttributes> value_type;
+private:
+    typedef ::std::list<value_type> CachedFontMapType;
+    mutable CachedFontMapType maCachedFontMap;
 };
 
 class FcGlyphFallbackSubstititution
@@ -135,6 +147,19 @@ namespace
             rOrig.meWidthType == rNew.meWidthType
           );
     }
+
+    class equal
+    {
+    private:
+        const FontSelectPatternAttributes& mrAttributes;
+    public:
+        equal(const FontSelectPatternAttributes& rAttributes)
+            : mrAttributes(rAttributes)
+        {
+        }
+        bool operator()(const FcPreMatchSubstititution::value_type& rOther) 
const
+            { return rOther.first == mrAttributes; }
+    };
 }
 
 //--------------------------------------------------------------------------
@@ -149,11 +174,26 @@ bool FcPreMatchSubstititution::FindFontSubstitute( 
FontSelectPattern &rFontSelDa
     ||  0 == rFontSelData.maSearchName.CompareIgnoreCaseToAscii( "opensymbol", 
10) )
         return false;
 
-    //Note: see fdo#41556 if you feel compelled to cache the results here,
-    //remember that fontconfig can return e.g. an italic font for a non-italic
-    //input and/or different fonts depending on fontsize, bold, etc settings so
-    //don't cache just on the name, cache on all the input and don't just
-    //return the original selection data with the fontname updated
+    //see fdo#41556 and fdo#47636
+    //fontconfig can return e.g. an italic font for a non-italic input and/or
+    //different fonts depending on fontsize, bold, etc settings so don't cache
+    //just on the name, cache map all the input and all the output not just map
+    //from original selection to output fontname
+    FontSelectPatternAttributes& rPatternAttributes = rFontSelData;
+    CachedFontMapType &rCachedFontMap = const_cast<CachedFontMapType 
&>(maCachedFontMap);
+    CachedFontMapType::iterator itr = std::find_if(rCachedFontMap.begin(), 
rCachedFontMap.end(), equal(rPatternAttributes));
+    if (itr != rCachedFontMap.end())
+    {
+        // Cached substitution
+        rFontSelData.copyAttributes(itr->second);
+        if (itr != rCachedFontMap.begin())
+        {
+            // MRU, move it to the front
+            rCachedFontMap.splice(rCachedFontMap.begin(), rCachedFontMap, itr);
+        }
+        return true;
+    }
+
     rtl::OUString aDummy;
     const FontSelectPattern aOut = GetFcSubstitute( rFontSelData, aDummy );
 
@@ -178,7 +218,14 @@ bool FcPreMatchSubstititution::FindFontSubstitute( 
FontSelectPattern &rFontSelDa
 #endif
 
     if( bHaveSubstitute )
+    {
+        rCachedFontMap.push_front(value_type(rFontSelData, aOut));
+        //fairly arbitrary limit in this case, but I recall measuring max 8
+        //fonts as the typical max amount of fonts in medium sized documents
+        if (rCachedFontMap.size() > 8)
+            rCachedFontMap.pop_back();
         rFontSelData = aOut;
+    }
 
     return bHaveSubstitute;
 }
@@ -190,7 +237,7 @@ bool FcGlyphFallbackSubstititution::FindFontSubstitute( 
FontSelectPattern& rFont
 {
     // We dont' actually want to talk to Fontconfig at all for symbol fonts
     if( rFontSelData.IsSymbolFont() )
-    return false;
+        return false;
     // StarSymbol is a unicode font, but it still deserves the symbol flag
     if( 0 == rFontSelData.maSearchName.CompareIgnoreCaseToAscii( "starsymbol", 
10)
     ||  0 == rFontSelData.maSearchName.CompareIgnoreCaseToAscii( "opensymbol", 
10) )
diff --git a/vcl/inc/outfont.hxx b/vcl/inc/outfont.hxx
index 70398d6..345ecc1 100644
--- a/vcl/inc/outfont.hxx
+++ b/vcl/inc/outfont.hxx
@@ -71,6 +71,12 @@ public: // TODO: create matching interface class
     FontWidth       GetWidthType() const    { return meWidthType; }
     bool            IsSymbolFont() const    { return mbSymbolFlag; }
 
+    bool operator==(const ImplFontAttributes& rOther) const;
+    bool operator!=(const ImplFontAttributes& rOther) const
+    {
+        return !(*this == rOther);
+    }
+
 public: // TODO: hide members behind accessor methods
     String          maName;         // Font Family Name
     String          maStyleName;    // Font Style Name
@@ -109,7 +115,6 @@ public: // TODO: hide members behind accessor methods
 // ----------------
 // - PhysicalFontFace -
 // ----------------
-// DONE: rename ImplFontData to PhysicalFontFace
 // TODO: no more direct access to members
 // TODO: add reference counting
 // TODO: get rid of height/width for scalable fonts
@@ -152,24 +157,27 @@ friend class ImplDevFontListData;
     PhysicalFontFace*       mpNext;
 };
 
-// ----------------------
-// - FontSelectPattern -
-// ----------------------
-
-class FontSelectPattern : public ImplFontAttributes
+class FontSelectPatternAttributes : public ImplFontAttributes
 {
 public:
-                        FontSelectPattern( const Font&, const String& 
rSearchName,
-                                           const Size&, float fExactHeight );
-                        FontSelectPattern( const PhysicalFontFace&, const 
Size&,
-                                           float fExactHeight, int 
nOrientation, bool bVertical );
+                        FontSelectPatternAttributes( const Font&, const 
String& rSearchName,
+                            const Size&, float fExactHeight );
+                        FontSelectPatternAttributes( const PhysicalFontFace&, 
const Size&,
+                            float fExactHeight, int nOrientation, bool 
bVertical );
+
+    size_t              hashCode() const;
+    bool operator==(const FontSelectPatternAttributes& rOther) const;
+    bool operator!=(const FontSelectPatternAttributes& rOther) const
+    {
+        return !(*this == rOther);
+    }
 
-public: // TODO: change to private
+public:
     String              maTargetName;       // name of the font name token 
that is chosen
     String              maSearchName;       // name of the font that matches 
best
     int                 mnWidth;            // width of font in pixel units
     int                 mnHeight;           // height of font in pixel units
-    float               mfExactHeight;       // requested height (in pixels 
with subpixel details)
+    float               mfExactHeight;      // requested height (in pixels 
with subpixel details)
     int                 mnOrientation;      // text orientation in 3600 system
     LanguageType        meLanguage;         // text language
     bool                mbVertical;         // vertical mode of requested font
@@ -177,9 +185,20 @@ public: // TODO: change to private
 
     bool                mbEmbolden;         // Force emboldening
     ItalicMatrix        maItalicMatrix;     // Force matrix for slant
+};
 
+class FontSelectPattern : public FontSelectPatternAttributes
+{
+public:
+                        FontSelectPattern( const Font&, const String& 
rSearchName,
+                            const Size&, float fExactHeight );
+                        FontSelectPattern( const PhysicalFontFace&, const 
Size&,
+                            float fExactHeight, int nOrientation, bool 
bVertical );
+
+public: // TODO: change to private
     const PhysicalFontFace* mpFontData;         // a matching PhysicalFontFace 
object
     ImplFontEntry*      mpFontEntry;        // pointer to the resulting 
FontCache entry
+    void copyAttributes(const FontSelectPatternAttributes &rAttributes);
 };
 
 // -------------------
diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx
index 3459afc..fc166ae 100644
--- a/vcl/source/gdi/outdev3.cxx
+++ b/vcl/source/gdi/outdev3.cxx
@@ -2139,21 +2139,17 @@ ImplGetDevSizeList* ImplDevFontList::GetDevSizeList( 
const String& rFontName ) c
     return pGetDevSizeList;
 }
 
-// =======================================================================
-
-FontSelectPattern::FontSelectPattern( const Font& rFont,
-    const String& rSearchName, const Size& rSize, float fExactHeight)
-:   maSearchName( rSearchName ),
-    mnWidth( rSize.Width() ),
-    mnHeight( rSize.Height() ),
-    mfExactHeight( fExactHeight),
-    mnOrientation( rFont.GetOrientation() ),
-    meLanguage( rFont.GetLanguage() ),
-    mbVertical( rFont.IsVertical() ),
-    mbNonAntialiased( false ),
-    mbEmbolden( false ),
-    mpFontData( NULL ),
-    mpFontEntry( NULL )
+FontSelectPatternAttributes::FontSelectPatternAttributes( const Font& rFont,
+    const String& rSearchName, const Size& rSize, float fExactHeight )
+    : maSearchName( rSearchName )
+    , mnWidth( rSize.Width() )
+    , mnHeight( rSize.Height() )
+    , mfExactHeight( fExactHeight)
+    , mnOrientation( rFont.GetOrientation() )
+    , meLanguage( rFont.GetLanguage() )
+    , mbVertical( rFont.IsVertical() )
+    , mbNonAntialiased( false )
+    , mbEmbolden( false )
 {
     maTargetName = maName;
 
@@ -2175,51 +2171,115 @@ FontSelectPattern::FontSelectPattern( const Font& 
rFont,
         mnWidth = -mnWidth;
 }
 
-// -----------------------------------------------------------------------
+FontSelectPattern::FontSelectPattern( const Font& rFont,
+    const String& rSearchName, const Size& rSize, float fExactHeight)
+    : FontSelectPatternAttributes(rFont, rSearchName, rSize, fExactHeight)
+    , mpFontData( NULL )
+    , mpFontEntry( NULL )
+{
+}
+
 // NOTE: this ctor is still used on Windows. Do not remove.
-FontSelectPattern::FontSelectPattern( const PhysicalFontFace& rFontData,
+FontSelectPatternAttributes::FontSelectPatternAttributes( const 
PhysicalFontFace& rFontData,
     const Size& rSize, float fExactHeight, int nOrientation, bool bVertical )
-:   ImplFontAttributes( rFontData ),
-    mnWidth( rSize.Width() ),
-    mnHeight( rSize.Height() ),
-    mfExactHeight( fExactHeight ),
-    mnOrientation( nOrientation ),
-    meLanguage( 0 ),
-    mbVertical( bVertical ),
-    mbNonAntialiased( false ),
-    mbEmbolden( false ),
-    mpFontData( &rFontData ),
-    mpFontEntry( NULL )
+    : ImplFontAttributes( rFontData )
+    , mnWidth( rSize.Width() )
+    , mnHeight( rSize.Height() )
+    , mfExactHeight( fExactHeight )
+    , mnOrientation( nOrientation )
+    , meLanguage( 0 )
+    , mbVertical( bVertical )
+    , mbNonAntialiased( false )
+    , mbEmbolden( false )
 {
     maTargetName = maSearchName = maName;
     // NOTE: no normalization for width/height/orientation
 }
 
+FontSelectPattern::FontSelectPattern( const PhysicalFontFace& rFontData,
+    const Size& rSize, float fExactHeight, int nOrientation, bool bVertical )
+    : FontSelectPatternAttributes(rFontData, rSize, fExactHeight, 
nOrientation, bVertical)
+    , mpFontData( &rFontData )
+    , mpFontEntry( NULL )
+{
+}
+
+void FontSelectPattern::copyAttributes(const FontSelectPatternAttributes 
&rAttributes)
+{
+    static_cast<FontSelectPatternAttributes&>(*this) = rAttributes;
+}
+
 // =======================================================================
 
 size_t ImplFontCache::IFSD_Hash::operator()( const FontSelectPattern& rFSD ) 
const
 {
+    return rFSD.hashCode();
+}
+
+size_t FontSelectPatternAttributes::hashCode() const
+{
     // TODO: does it pay off to improve this hash function?
     static FontNameHash aFontNameHash;
-    size_t nHash = aFontNameHash( rFSD.maSearchName );
+    size_t nHash = aFontNameHash( maSearchName );
 #ifdef ENABLE_GRAPHITE
     // check for features and generate a unique hash if necessary
-    if (rFSD.maTargetName.Search(grutils::GrFeatureParser::FEAT_PREFIX)
+    if (maTargetName.Search(grutils::GrFeatureParser::FEAT_PREFIX)
         != STRING_NOTFOUND)
     {
-        nHash = aFontNameHash( rFSD.maTargetName );
+        nHash = aFontNameHash( maTargetName );
     }
 #endif
-    nHash += 11 * rFSD.mnHeight;
-    nHash += 19 * rFSD.meWeight;
-    nHash += 29 * rFSD.meItalic;
-    nHash += 37 * rFSD.mnOrientation;
-    nHash += 41 * rFSD.meLanguage;
-    if( rFSD.mbVertical )
+    nHash += 11 * mnHeight;
+    nHash += 19 * meWeight;
+    nHash += 29 * meItalic;
+    nHash += 37 * mnOrientation;
+    nHash += 41 * meLanguage;
+    if( mbVertical )
         nHash += 53;
     return nHash;
 }
 
+bool FontSelectPatternAttributes::operator==(const 
FontSelectPatternAttributes& rOther) const
+{
+    if (static_cast<const ImplFontAttributes&>(*this) != static_cast<const 
ImplFontAttributes&>(rOther))
+        return false;
+
+    if (maTargetName != rOther.maTargetName)
+        return false;
+
+    if (maSearchName != rOther.maSearchName)
+        return false;
+
+    if (mnWidth != rOther.mnWidth)
+        return false;
+
+    if (mnHeight != rOther.mnHeight)
+        return false;
+
+    if (mfExactHeight != rOther.mfExactHeight)
+        return false;
+
+    if (mnOrientation != rOther.mnOrientation)
+        return false;
+
+    if (meLanguage != rOther.meLanguage)
+        return false;
+
+    if (mbVertical != rOther.mbVertical)
+        return false;
+
+    if (mbNonAntialiased != rOther.mbNonAntialiased)
+        return false;
+
+    if (mbEmbolden != rOther.mbEmbolden)
+        return false;
+
+    if (maItalicMatrix != rOther.maItalicMatrix)
+        return false;
+
+    return true;
+}
+
 // -----------------------------------------------------------------------
 
 bool ImplFontCache::IFSD_Equal::operator()(const FontSelectPattern& rA, const 
FontSelectPattern& rB) const
@@ -3332,6 +3392,37 @@ void OutputDevice::ImplInitAboveTextLineSize()
 
 // -----------------------------------------------------------------------
 
+bool ImplFontAttributes::operator==(const ImplFontAttributes& rOther) const
+{
+    if (maName != rOther.maName)
+        return false;
+
+    if (maStyleName != rOther.maStyleName)
+        return false;
+
+    if (meWeight != rOther.meWeight)
+        return false;
+
+    if (meItalic != rOther.meItalic)
+        return false;
+
+    if (meFamily != rOther.meFamily)
+        return false;
+
+    if (mePitch != rOther.mePitch)
+        return false;
+
+    if (meWidthType != rOther.meWidthType)
+        return false;
+
+    if (mbSymbolFlag != rOther.mbSymbolFlag)
+        return false;
+
+    return true;
+}
+
+// -----------------------------------------------------------------------
+
 ImplFontMetricData::ImplFontMetricData( const FontSelectPattern& rFontSelData )
 :   ImplFontAttributes( rFontSelData )
 {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to