Sophie

Sophie

distrib > Fedora > 13 > i386 > media > updates-src > by-pkgid > cd8ce32c919af60229fca1d7f792c60e > files > 103

openoffice.org-3.2.0-12.35.fc13.src.rpm

diff -r 458049042e56 -r c28e2e0d774b vcl/inc/vcl/fontmanager.hxx
--- a/vcl/inc/vcl/fontmanager.hxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/inc/vcl/fontmanager.hxx	Fri Feb 12 17:12:55 2010 +0100
@@ -35,6 +35,7 @@
 
 #include "vcl/dllapi.h"
 #include "vcl/helper.hxx"
+#include "vcl/impfont.hxx"
 
 #include "com/sun/star/lang/Locale.hpp"
 
@@ -162,8 +163,6 @@
     weight::type            			m_eWeight;
     pitch::type             			m_ePitch;
     rtl_TextEncoding        			m_aEncoding;
-    fcstatus::type                      m_eEmbeddedbitmap;
-    fcstatus::type                      m_eAntialias;
     bool                                m_bSubsettable;
     bool                                m_bEmbeddable;
 
@@ -175,9 +174,7 @@
             m_eWidth( width::Unknown ),
             m_eWeight( weight::Unknown ),
             m_ePitch( pitch::Unknown ),
-            m_aEncoding( RTL_TEXTENCODING_DONTKNOW ),
-            m_eEmbeddedbitmap( fcstatus::isunset ),
-            m_eAntialias( fcstatus::isunset )
+            m_aEncoding( RTL_TEXTENCODING_DONTKNOW )
     {}
 };
 
@@ -294,9 +291,6 @@
         bool										m_bHaveVerticalSubstitutedGlyphs;
         bool                                        m_bUserOverride;
 
-        fcstatus::type                              m_eEmbeddedbitmap;
-        fcstatus::type                              m_eAntialias;
-
         std::map< sal_Unicode, sal_Int32 >			m_aEncodingVector;
         std::map< sal_Unicode, rtl::OString >		m_aNonEncoded;
 
@@ -736,10 +730,11 @@
     false else
      */
     bool matchFont( FastPrintFontInfo& rInfo, const com::sun::star::lang::Locale& rLocale );
+    bool getFontOptions( const FastPrintFontInfo&, int nSize, void (*subcallback)(void*), ImplFontOptions& rResult ) const;
 
     rtl::OUString Substitute( const rtl::OUString& rFontName, rtl::OUString& rMissingCodes, 
-        const rtl::OString& rLangAttrib, italic::type eItalic, weight::type eWeight, 
-        width::type eWidth, pitch::type ePitch) const;
+        const rtl::OString& rLangAttrib, italic::type& rItalic, weight::type& rWeight, 
+        width::type& rWidth, pitch::type& rPitch) const;
     bool hasFontconfig() const { return m_bFontconfigSuccess; }
 
     int FreeTypeCharIndex( void *pFace, sal_uInt32 aChar );
diff -r 458049042e56 -r c28e2e0d774b vcl/inc/vcl/glyphcache.hxx
--- a/vcl/inc/vcl/glyphcache.hxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/inc/vcl/glyphcache.hxx	Fri Feb 12 17:12:55 2010 +0100
@@ -42,6 +41,7 @@
 class ServerFontLayout;
 class ExtraKernInfo;
 struct ImplKernPairData;
+class ImplFontOptions;
 
 #include <tools/gen.hxx>
 #include <hash_map>
@@ -99,8 +99,9 @@
     struct IFSD_Hash{ size_t operator()( const ImplFontSelectData& ) const; };
     typedef ::std::hash_map<ImplFontSelectData,ServerFont*,IFSD_Hash,IFSD_Equal > FontList;
     FontList                    maFontList;
-
+public:
     ULONG                       mnMaxSize;      // max overall cache size in bytes
+private:
     mutable ULONG               mnBytesUsed;
     mutable long                mnLruIndex;
     mutable int                 mnGlyphCount;
@@ -182,8 +183,9 @@
     virtual bool                TestFont() const            { return true; }
     virtual void*               GetFtFace() const { return 0; }
     virtual int                 GetLoadFlags() const { return 0; }
+    virtual void                SetFontOptions( const ImplFontOptions&) {}
     virtual bool                NeedsArtificialBold() const { return false; }
-    virtual bool		        NeedsArtificialItalic() const { return false; }
+    virtual bool                NeedsArtificialItalic() const { return false; }
 
     const ImplFontSelectData&   GetFontSelData() const      { return maFontSelData; }
 
@@ -211,7 +213,7 @@
 protected:
     friend class GlyphCache;
     friend class ServerFontLayout;
-                                ServerFont( const ImplFontSelectData& );
+    explicit                    ServerFont( const ImplFontSelectData& );
     virtual                     ~ServerFont();
 
     void                        AddRef() const      { ++mnRefCount; }
diff -r 458049042e56 -r c28e2e0d774b vcl/inc/vcl/impfont.hxx
--- a/vcl/inc/vcl/impfont.hxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/inc/vcl/impfont.hxx	Fri Feb 12 17:12:55 2010 +0100
@@ -133,6 +133,41 @@
     bool    operator==( const ImplFontMetric& ) const;
 };
 
+// ------------------
+// - ImplFontHints -
+// ------------------
+
+class ImplFontOptions
+{
+public:
+    FontEmbeddedBitmap meEmbeddedBitmap; // whether the embedded bitmaps should be used
+    FontAntiAlias      meAntiAlias;      // whether the font should be antialiased
+    FontAutoHint       meAutoHint;       // whether the font should be autohinted
+    FontHinting        meHinting;        // whether the font should be hinted
+    FontHintStyle      meHintStyle;      // type of font hinting to be used
+public:
+    ImplFontOptions() :
+        meEmbeddedBitmap(EMBEDDEDBITMAP_DONTKNOW), 
+        meAntiAlias(ANTIALIAS_DONTKNOW), 
+        meAutoHint(AUTOHINT_DONTKNOW), 
+        meHinting(HINTING_DONTKNOW), 
+        meHintStyle(HINT_SLIGHT)
+    {}
+    ImplFontOptions( FontEmbeddedBitmap eEmbeddedBitmap, FontAntiAlias eAntiAlias, 
+        FontAutoHint eAutoHint, FontHinting eHinting, FontHintStyle eHintStyle) :
+        meEmbeddedBitmap(eEmbeddedBitmap), 
+        meAntiAlias(eAntiAlias), 
+        meAutoHint(eAutoHint), 
+        meHinting(eHinting), 
+        meHintStyle(eHintStyle)
+    {}
+    FontAutoHint GetUseAutoHint() const { return meAutoHint; }
+    FontHintStyle GetHintStyle() const { return meHintStyle; }
+    bool DontUseEmbeddedBitmaps() const { return meEmbeddedBitmap == EMBEDDEDBITMAP_FALSE; }
+    bool DontUseAntiAlias() const { return meAntiAlias == ANTIALIAS_FALSE; }
+    bool DontUseHinting() const { return (meHinting == HINTING_FALSE) || (GetHintStyle() == HINT_NONE); }
+};
+
 // -------------------
 // - ImplFontCharMap -
 // -------------------
diff -r 458049042e56 -r c28e2e0d774b vcl/inc/vcl/outdev.hxx
--- a/vcl/inc/vcl/outdev.hxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/inc/vcl/outdev.hxx	Fri Feb 12 17:12:55 2010 +0100
@@ -80,6 +79,7 @@
 class FontCharMap;
 class SalLayout;
 class ImplLayoutArgs;
+class ImplFontAttributes;
 class VirtualDevice;
 
 namespace com {
@@ -543,8 +543,7 @@
 
     SAL_DLLPRIVATE static FontEmphasisMark ImplGetEmphasisMarkStyle( const Font& rFont );
     SAL_DLLPRIVATE static BOOL ImplIsUnderlineAbove( const Font& );
-    
-    
+ 
     // tells whether this output device is RTL in an LTR UI or LTR in a RTL UI
     SAL_DLLPRIVATE bool ImplIsAntiparallel() const ;
 
diff -r 458049042e56 -r c28e2e0d774b vcl/inc/vcl/outfont.hxx
--- a/vcl/inc/vcl/outfont.hxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/inc/vcl/outfont.hxx	Fri Feb 12 17:12:55 2010 +0100
@@ -94,8 +94,6 @@
     bool               IsDeviceFont() const      { return mbDevice; }
     bool               IsEmbeddable() const      { return mbEmbeddable; }
     bool               IsSubsettable() const     { return mbSubsettable; }
-    FontEmbeddedBitmap UseEmbeddedBitmap() const { return meEmbeddedBitmap; }
-    FontAntiAlias      UseAntiAlias() const      { return meAntiAlias; }
 
 public: // TODO: hide members behind accessor methods
     String             maMapNames;       // List of family name aliass separated with ';'
@@ -104,8 +102,6 @@
     bool               mbDevice;         // true: built in font
     bool               mbSubsettable;    // true: a subset of the font can be created
     bool               mbEmbeddable;     // true: the font can be embedded
-    FontEmbeddedBitmap meEmbeddedBitmap; // whether the embedded bitmaps should be used
-    FontAntiAlias      meAntiAlias;      // whether the font should be antialiased
 };
 
 // ----------------
diff -r 458049042e56 -r c28e2e0d774b vcl/inc/vcl/salgdi.hxx
--- a/vcl/inc/vcl/salgdi.hxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/inc/vcl/salgdi.hxx	Fri Feb 12 17:12:55 2010 +0100
@@ -237,9 +236,10 @@
     void                   ReleaseFonts() { SetFont( NULL, 0 ); }
     // get the current font's metrics
     virtual void			GetFontMetric( ImplFontMetricData* ) = 0;
+
     // get kernign pairs of the current font
     // return only PairCount if (pKernPairs == NULL)
-    virtual ULONG			GetKernPairs( ULONG nPairs, ImplKernPairData* pKernPairs ) = 0;
+    virtual ULONG			GetKernPairs( ULONG nMaxPairCount, ImplKernPairData* ) = 0;
     // get the repertoire of the current font
     virtual ImplFontCharMap* GetImplFontCharMap() const = 0;
     // graphics must fill supplied font list
diff -r 458049042e56 -r c28e2e0d774b vcl/inc/vcl/settings.hxx
--- a/vcl/inc/vcl/settings.hxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/inc/vcl/settings.hxx	Fri Feb 12 17:12:55 2010 +0100
@@ -440,6 +440,7 @@
     ULONG                           mnPreferredSymbolsStyle;
     USHORT                          mnSkipDisabledInMenus;
     Wallpaper                       maWorkspaceGradient;
+    const void*                     mpFontOptions;
 };
 
 #define DEFAULT_WORKSPACE_GRADIENT_START_COLOR Color( 0xa3, 0xae, 0xb8 )
@@ -757,6 +758,11 @@
     BOOL							GetSkipDisabledInMenus() const
                                         { return (BOOL) mpData->mnSkipDisabledInMenus; }
 
+    void                            SetCairoFontOptions( const void *pOptions )
+                                        { CopyData(); mpData->mpFontOptions = pOptions;  }
+    const void*                     GetCairoFontOptions() const
+                                        { return mpData->mpFontOptions; }
+
     void                            SetAppFont( const Font& rFont )
                                         { CopyData(); mpData->maAppFont = rFont; }
     const Font&                     GetAppFont() const
diff -r 458049042e56 -r c28e2e0d774b vcl/inc/vcl/vclenum.hxx
--- a/vcl/inc/vcl/vclenum.hxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/inc/vcl/vclenum.hxx	Fri Feb 12 17:12:55 2010 +0100
@@ -284,6 +284,27 @@
 
 #endif
 
+#ifndef ENUM_FONTAUTOHINT_DECLARED
+#define ENUM_FONTAUTOHINT_DECLARED
+
+enum FontAutoHint { AUTOHINT_DONTKNOW, AUTOHINT_FALSE, AUTOHINT_TRUE };
+
+#endif
+
+#ifndef ENUM_FONTHINTING_DECLARED
+#define ENUM_FONTHINTING_DECLARED
+
+enum FontHinting { HINTING_DONTKNOW, HINTING_FALSE, HINTING_TRUE };
+
+#endif
+
+#ifndef ENUM_FONTHINTSTYLE_DECLARED
+#define ENUM_FONTHINTSTYLE_DECLARED
+
+enum FontHintStyle { HINT_NONE, HINT_SLIGHT, HINT_MEDIUM, HINT_FULL };
+
+#endif
+
 // ------------------------------------------------------------
 
 #ifndef ENUM_KEYFUNCTYPE_DECLARED
diff -r 458049042e56 -r c28e2e0d774b vcl/source/app/settings.cxx
--- a/vcl/source/app/settings.cxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/source/app/settings.cxx	Fri Feb 12 17:12:55 2010 +0100
@@ -436,6 +436,7 @@
     mnToolbarIconSize			= STYLE_TOOLBAR_ICONSIZE_UNKNOWN;
     mnSymbolsStyle				= STYLE_SYMBOLS_AUTO;
     mnPreferredSymbolsStyle			= STYLE_SYMBOLS_AUTO;
+    mpFontOptions              = NULL;
 
     SetStandardStyles();
 }
@@ -542,6 +543,7 @@
     mnToolbarIconSize			= rData.mnToolbarIconSize;
     mnSymbolsStyle				= rData.mnSymbolsStyle;
     mnPreferredSymbolsStyle			= rData.mnPreferredSymbolsStyle;
+    mpFontOptions               = rData.mpFontOptions;
 }
 
 // -----------------------------------------------------------------------
diff -r 458049042e56 -r c28e2e0d774b vcl/source/glyphs/gcach_ftyp.cxx
--- a/vcl/source/glyphs/gcach_ftyp.cxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/source/glyphs/gcach_ftyp.cxx	Fri Feb 12 17:12:55 2010 +0100
@@ -38,8 +38,6 @@
 #include "vcl/svapp.hxx"
 #include "vcl/outfont.hxx"
 #include "vcl/impfont.hxx"
-#include "vcl/bitmap.hxx"
-#include "vcl/bmpacc.hxx"
 
 #include "tools/poly.hxx"
 #include "basegfx/matrix/b2dhommatrix.hxx"
@@ -79,7 +77,7 @@
 // TODO: move file mapping stuff to OSL
 #if defined(UNX)
     #if !defined(HPUX)
-        // PORTERS: dlfcn is used for code dependend on FT version
+        // PORTERS: dlfcn is used for getting symbols from FT versions newer than baseline
         #include <dlfcn.h>
     #endif
     #include <unistd.h>
@@ -92,10 +90,6 @@
     #define strncasecmp strnicmp
 #endif
 
-#include "vcl/svapp.hxx"
-#include "vcl/settings.hxx"
-#include "i18npool/lang.h"
-
 typedef const unsigned char* CPU8;
 inline sal_uInt16 NEXT_U16( CPU8& p ) { p+=2; return (p[-2]<<8)|p[-1]; }
 inline sal_Int16  NEXT_S16( CPU8& p ) { return (sal_Int16)NEXT_U16(p); }
@@ -622,9 +616,6 @@
             aDFA.mbSubsettable= false;
             aDFA.mbEmbeddable = false;
 
-            aDFA.meEmbeddedBitmap = EMBEDDEDBITMAP_DONTKNOW;
-            aDFA.meAntiAlias = ANTIALIAS_DONTKNOW;
-
             FT_Done_Face( aFaceFT );
             AddFontFile( aCFileName, nFaceNum, ++mnNextFontId, aDFA, NULL );
             ++nCount;
@@ -704,6 +695,7 @@
 :   ServerFont( rFSD ),
     mnPrioEmbedded(nDefaultPrioEmbedded),
     mnPrioAntiAlias(nDefaultPrioAntiAlias),
+    mnPrioAutoHint(nDefaultPrioAutoHint),
     mpFontInfo( pFI ),
     maFaceFT( NULL ),
     maSizeFT( NULL ),
@@ -837,46 +829,71 @@
 
     mbArtItalic = (rFSD.meItalic != ITALIC_NONE && pFI->GetFontAttributes().GetSlant() == ITALIC_NONE);
     mbArtBold = (rFSD.meWeight > WEIGHT_MEDIUM && pFI->GetFontAttributes().GetWeight() <= WEIGHT_MEDIUM);
+    mbUseGamma = false;
+    if( mbArtBold )
+    {
+	    //static const int TT_CODEPAGE_RANGE_874  = (1L << 16); // Thai
+	    //static const int TT_CODEPAGE_RANGE_932  = (1L << 17); // JIS/Japan
+	    //static const int TT_CODEPAGE_RANGE_936  = (1L << 18); // Chinese: Simplified
+	    //static const int TT_CODEPAGE_RANGE_949  = (1L << 19); // Korean Wansung
+	    //static const int TT_CODEPAGE_RANGE_950  = (1L << 20); // Chinese: Traditional
+	    //static const int TT_CODEPAGE_RANGE_1361 = (1L << 21); // Korean Johab
+	    static const int TT_CODEPAGE_RANGES1_CJKT = 0x3F0000; // all of the above
+	    const TT_OS2* pOs2 = (const TT_OS2*)FT_Get_Sfnt_Table( maFaceFT, ft_sfnt_os2 );
+	    if ((pOs2) && (pOs2->ulCodePageRange1 & TT_CODEPAGE_RANGES1_CJKT )
+		&& rFSD.mnHeight < 20)
+		mbUseGamma = true;
+    }
 
-    //static const int TT_CODEPAGE_RANGE_874  = (1L << 16); // Thai
-    //static const int TT_CODEPAGE_RANGE_932  = (1L << 17); // JIS/Japan
-    //static const int TT_CODEPAGE_RANGE_936  = (1L << 18); // Chinese: Simplified
-    //static const int TT_CODEPAGE_RANGE_949  = (1L << 19); // Korean Wansung
-    //static const int TT_CODEPAGE_RANGE_950  = (1L << 20); // Chinese: Traditional
-    //static const int TT_CODEPAGE_RANGE_1361 = (1L << 21); // Korean Johab
-    static const int TT_CODEPAGE_RANGES1_CJKT = 0x3F0000; // all of the above
-    const TT_OS2* pOs2 = (const TT_OS2*)FT_Get_Sfnt_Table( maFaceFT, ft_sfnt_os2 );
-    if ((pOs2) && (pOs2->ulCodePageRange1 & TT_CODEPAGE_RANGES1_CJKT )
-        && rFSD.mnHeight < 20)
-        mbUseGamma = true;
-    else
-        mbUseGamma = false;
+    if( ((mnCos != 0) && (mnSin != 0)) || (mnPrioEmbedded <= 0) )
+        mnLoadFlags |= FT_LOAD_NO_BITMAP;
+}
 
-    if (mbUseGamma)
+void FreetypeServerFont::SetFontOptions( const ImplFontOptions& rFontOptions)
+{
+    FontAutoHint eHint = rFontOptions.GetUseAutoHint();
+    if( eHint == AUTOHINT_DONTKNOW )
+        eHint = mbUseGamma ? AUTOHINT_TRUE : AUTOHINT_FALSE;
+
+    if( eHint == AUTOHINT_TRUE )
         mnLoadFlags |= FT_LOAD_FORCE_AUTOHINT;
 
     if( (mnSin != 0) && (mnCos != 0) ) // hinting for 0/90/180/270 degrees only
         mnLoadFlags |= FT_LOAD_NO_HINTING;
     mnLoadFlags |= FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH; //#88334#
 
-    if (mpFontInfo->DontUseAntiAlias())
-        mnPrioAntiAlias = 0;
-    if (mpFontInfo->DontUseEmbeddedBitmaps())
-        mnPrioEmbedded = 0;
+    if( rFontOptions.DontUseAntiAlias() )
+      mnPrioAntiAlias = 0;
+    if( rFontOptions.DontUseEmbeddedBitmaps() )
+      mnPrioEmbedded = 0;
+    if( rFontOptions.DontUseHinting() )
+      mnPrioAutoHint = 0;
 
 #if (FTVERSION >= 2005) || defined(TT_CONFIG_OPTION_BYTECODE_INTERPRETER)
-    if( nDefaultPrioAutoHint <= 0 )
+    if( mnPrioAutoHint <= 0 )
 #endif
         mnLoadFlags |= FT_LOAD_NO_HINTING;
 
-#ifdef FT_LOAD_TARGET_LIGHT
-    // enable "light hinting" if available
+#if defined(FT_LOAD_TARGET_LIGHT) && defined(FT_LOAD_TARGET_NORMAL)
     if( !(mnLoadFlags & FT_LOAD_NO_HINTING) && (nFTVERSION >= 2103))
-        mnLoadFlags |= FT_LOAD_TARGET_LIGHT;
+    {
+       mnLoadFlags |= FT_LOAD_TARGET_NORMAL;
+       switch( rFontOptions.GetHintStyle() )
+       {
+           case HINT_NONE:
+                mnLoadFlags |= FT_LOAD_NO_HINTING;
+                break;
+           case HINT_SLIGHT:
+                mnLoadFlags |= FT_LOAD_TARGET_LIGHT;
+                break;
+           case HINT_MEDIUM:
+                break;
+           case HINT_FULL:
+           default:
+                break;
+       }
+    }
 #endif
-
-    if( ((mnCos != 0) && (mnSin != 0)) || (mnPrioEmbedded <= 0) )
-        mnLoadFlags |= FT_LOAD_NO_BITMAP;
 }
 
 // -----------------------------------------------------------------------
@@ -1230,13 +1247,15 @@
         }
     }
 
-#if !defined(TT_CONFIG_OPTION_BYTECODE_INTERPRETER)
+#if 0
     // #95556# autohinting not yet optimized for non-western glyph styles
     if( !(mnLoadFlags & (FT_LOAD_NO_HINTING | FT_LOAD_FORCE_AUTOHINT) )
     &&  ( (aChar >= 0x0600 && aChar < 0x1E00)   // south-east asian + arabic
         ||(aChar >= 0x2900 && aChar < 0xD800)   // CJKV
         ||(aChar >= 0xF800) ) )                 // presentation + symbols
+    {
         nGlyphFlags |= GF_UNHINTED;
+    }
 #endif
 
     if( nGlyphIndex != 0 )
@@ -1376,13 +1395,13 @@
         nLoadFlags |= FT_LOAD_NO_BITMAP;
 
 #if (FTVERSION >= 2002)
-    // for 0/90/180/270 degree fonts enable autohinting even if not advisable
+    // for 0/90/180/270 degree fonts enable hinting even if not advisable
     // non-hinted and non-antialiased bitmaps just look too ugly
-    if( (mnCos==0 || mnSin==0) && (nDefaultPrioAutoHint > 0) )
+    if( (mnCos==0 || mnSin==0) && (mnPrioAutoHint > 0) )
         nLoadFlags &= ~FT_LOAD_NO_HINTING;
 #endif
 
-    if( mnPrioEmbedded <= nDefaultPrioAutoHint )
+    if( mnPrioEmbedded <= mnPrioAutoHint )
         nLoadFlags |= FT_LOAD_NO_BITMAP;
 
     FT_Error rc = -1;
@@ -1547,7 +1566,7 @@
     // autohinting in FT<=2.0.4 makes antialiased glyphs look worse
     nLoadFlags |= FT_LOAD_NO_HINTING;
 #else
-    if( (nGlyphFlags & GF_UNHINTED) || (nDefaultPrioAutoHint < mnPrioAntiAlias) )
+    if( (nGlyphFlags & GF_UNHINTED) || (mnPrioAutoHint < mnPrioAntiAlias) )
         nLoadFlags |= FT_LOAD_NO_HINTING;
 #endif
 
diff -r 458049042e56 -r c28e2e0d774b vcl/source/glyphs/gcach_ftyp.hxx
--- a/vcl/source/glyphs/gcach_ftyp.hxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/source/glyphs/gcach_ftyp.hxx	Fri Feb 12 17:12:55 2010 +0100
@@ -33,6 +33,7 @@
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
+
 class FreetypeServerFont;
 struct FT_GlyphRec_;
 
@@ -85,10 +86,6 @@
     int                   GetFaceNum() const        { return mnFaceNum; }
     int                   GetSynthetic() const      { return mnSynthetic; }
     sal_IntPtr            GetFontId() const         { return mnFontId; }
-    bool                  DontUseAntiAlias() const  
-        { return maDevFontAttributes.UseAntiAlias() == ANTIALIAS_FALSE; }
-    bool                  DontUseEmbeddedBitmaps() const 
-        { return maDevFontAttributes.UseEmbeddedBitmap() == EMBEDDEDBITMAP_FALSE; }
     bool                  IsSymbolFont() const      { return maDevFontAttributes.IsSymbolFont(); }
     const ImplFontAttributes& GetFontAttributes() const { return maDevFontAttributes; }
 
@@ -178,7 +175,8 @@
     virtual int                 GetFontFaceNum() const { return mpFontInfo->GetFaceNum(); }
     virtual bool                TestFont() const;
     virtual void*               GetFtFace() const;
-    virtual int               	GetLoadFlags() const { return (mnLoadFlags & ~FT_LOAD_IGNORE_TRANSFORM); }
+    virtual void                SetFontOptions( const ImplFontOptions&);
+    virtual int                 GetLoadFlags() const { return (mnLoadFlags & ~FT_LOAD_IGNORE_TRANSFORM); }
     virtual bool                NeedsArtificialBold() const { return mbArtBold; }
     virtual bool                NeedsArtificialItalic() const { return mbArtItalic; }
 
@@ -213,6 +211,7 @@
     int                         mnWidth;
     int                         mnPrioEmbedded;
     int                         mnPrioAntiAlias;
+    int                         mnPrioAutoHint;
     FtFontInfo*                 mpFontInfo;
     FT_Int                      mnLoadFlags;
     double                      mfStretch;
diff -r 458049042e56 -r c28e2e0d774b vcl/source/window/winproc.cxx
--- a/vcl/source/window/winproc.cxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/source/window/winproc.cxx	Fri Feb 12 17:12:55 2010 +0100
@@ -64,6 +64,7 @@
 #include <vcl/dockwin.hxx>
 #include <vcl/salgdi.hxx>
 #include <vcl/menu.hxx>
+#include <vcl/glyphcache.hxx>
 
 #include <dndlcon.hxx>
 #include <com/sun/star/datatransfer/dnd/XDragSource.hpp>
@@ -2227,9 +2228,14 @@
                 nType = DATACHANGED_DISPLAY;
                 break;
             case SALEVENT_FONTCHANGED:
+            {
+                ULONG nOldSize = GlyphCache::GetInstance().mnMaxSize;
+                GlyphCache::GetInstance().mnMaxSize = 0;
                 OutputDevice::ImplUpdateAllFontData( TRUE );
+                GlyphCache::GetInstance().mnMaxSize = nOldSize;
                 nType = DATACHANGED_FONTS;
                 break;
+            }
             case SALEVENT_DATETIMECHANGED:
                 nType = DATACHANGED_DATETIME;
                 break;
diff -r 458049042e56 -r c28e2e0d774b vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx
--- a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx	Fri Feb 12 17:12:55 2010 +0100
@@ -48,6 +48,8 @@
 #include "saldisp.hxx"
 #include "vcl/svapp.hxx"
 
+#include "cairo/cairo.h"
+
 // initialize statics
 BOOL GtkSalGraphics::bThemeChanged = TRUE;
 BOOL GtkSalGraphics::bNeedPixmapPaint = FALSE;
@@ -3459,12 +3461,24 @@
     // preferred icon style
     gchar* pIconThemeName = NULL;
     g_object_get( gtk_settings_get_default(), "gtk-icon-theme-name", &pIconThemeName, (char *)NULL );
-    aStyleSet.SetPreferredSymbolsStyleName( OUString::createFromAscii(pIconThemeName) );
-    g_free (pIconThemeName);
+    aStyleSet.SetPreferredSymbolsStyleName( OUString::createFromAscii( pIconThemeName ) );
+    g_free( pIconThemeName );
 
     //  FIXME: need some way of fetching toolbar icon size.
 //	aStyleSet.SetToolbarIconSize( STYLE_TOOLBAR_ICONSIZE_SMALL );
 
+    const cairo_font_options_t* pNewOptions = NULL;
+    if( GdkScreen* pScreen = gdk_display_get_screen( gdk_display_get_default(), m_nScreen ) )
+    {
+#if !GTK_CHECK_VERSION(2,8,1)
+	static cairo_font_options_t* (*gdk_screen_get_font_options)(GdkScreen*) = 
+		(cairo_font_options_t*(*)(GdkScreen*))osl_getAsciiFunctionSymbol( GetSalData()->m_pPlugin, "gdk_screen_get_font_options" );
+	if( gdk_screen_get_font_options != NULL )
+#endif
+		pNewOptions = gdk_screen_get_font_options( pScreen );
+    }
+    aStyleSet.SetCairoFontOptions( pNewOptions );
+
     // finally update the collected settings
     rSettings.SetStyleSettings( aStyleSet );
 
diff -r 458049042e56 -r c28e2e0d774b vcl/unx/gtk/window/gtkframe.cxx
--- a/vcl/unx/gtk/window/gtkframe.cxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/unx/gtk/window/gtkframe.cxx	Fri Feb 12 17:12:55 2010 +0100
@@ -3127,10 +3127,13 @@
     // redraw itself to adjust to the new style
     // where there IS no new style resulting in tremendous unnecessary flickering
     if( pPrevious != NULL )
+    {
         // signalStyleSet does NOT usually have the gdk lock
         // so post user event to safely dispatch the SALEVENT_SETTINGSCHANGED
         // note: settings changed for multiple frames is avoided in winproc.cxx ImplHandleSettings
         pThis->getDisplay()->SendInternalEvent( pThis, NULL, SALEVENT_SETTINGSCHANGED );
+        pThis->getDisplay()->SendInternalEvent( pThis, NULL, SALEVENT_FONTCHANGED );
+    }
 
     /* #i64117# gtk sets a nice background pixmap
     *  but we actually don't really want that, so save
diff -r 458049042e56 -r c28e2e0d774b vcl/unx/headless/svpgdi.hxx
--- a/vcl/unx/headless/svpgdi.hxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/unx/headless/svpgdi.hxx	Fri Feb 12 17:12:55 2010 +0100
@@ -173,3 +172,4 @@
 };
 
 #endif
+
diff -r 458049042e56 -r c28e2e0d774b vcl/unx/headless/svppspgraphics.cxx
--- a/vcl/unx/headless/svppspgraphics.cxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/unx/headless/svppspgraphics.cxx	Fri Feb 12 17:12:55 2010 +0100
@@ -1160,32 +1160,6 @@
     aDFA.mePitch        = ToFontPitch (rInfo.m_ePitch);
     aDFA.mbSymbolFlag   = (rInfo.m_aEncoding == RTL_TEXTENCODING_SYMBOL);
 
-    switch (rInfo.m_eEmbeddedbitmap)
-    {
-        default:
-            aDFA.meEmbeddedBitmap = EMBEDDEDBITMAP_DONTKNOW;
-            break;
-        case psp::fcstatus::istrue:
-            aDFA.meEmbeddedBitmap = EMBEDDEDBITMAP_TRUE;
-            break;
-        case psp::fcstatus::isfalse:
-            aDFA.meEmbeddedBitmap = EMBEDDEDBITMAP_FALSE;
-            break;
-    }
-
-    switch (rInfo.m_eAntialias)
-    {
-        default:
-            aDFA.meAntiAlias = ANTIALIAS_DONTKNOW;
-            break;
-        case psp::fcstatus::istrue:
-            aDFA.meAntiAlias = ANTIALIAS_TRUE;
-            break;
-        case psp::fcstatus::isfalse:
-            aDFA.meAntiAlias = ANTIALIAS_FALSE;
-            break;
-    }
-
     switch( rInfo.m_eType )
     {
         case psp::fonttype::Builtin:
diff -r 458049042e56 -r c28e2e0d774b vcl/unx/inc/pspgraphics.h
--- a/vcl/unx/inc/pspgraphics.h	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/unx/inc/pspgraphics.h	Fri Feb 12 17:12:55 2010 +0100
@@ -103,7 +103,7 @@
     virtual void			SetTextColor( SalColor nSalColor );
     virtual USHORT          SetFont( ImplFontSelectData*, int nFallbackLevel );
     virtual void			GetFontMetric( ImplFontMetricData* );
-    virtual ULONG			GetKernPairs( ULONG nPairs, ImplKernPairData* pKernPairs );
+    virtual ULONG			GetKernPairs( ULONG nMaxPairs, ImplKernPairData* );
     virtual ImplFontCharMap* GetImplFontCharMap() const;
     virtual void			GetDevFontList( ImplDevFontList* );
     virtual void			GetDevFontSubstList( OutputDevice* );
diff -r 458049042e56 -r c28e2e0d774b vcl/unx/inc/salgdi.h
--- a/vcl/unx/inc/salgdi.h	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/unx/inc/salgdi.h	Fri Feb 12 17:12:55 2010 +0100
@@ -253,7 +252,7 @@
     virtual void			SetTextColor( SalColor nSalColor );
     virtual USHORT			SetFont( ImplFontSelectData*, int nFallbackLevel );
     virtual void			GetFontMetric( ImplFontMetricData* );
-    virtual ULONG			GetKernPairs( ULONG nPairs, ImplKernPairData* pKernPairs );
+    virtual ULONG			GetKernPairs( ULONG nMaxPairs, ImplKernPairData* );
     virtual ImplFontCharMap* GetImplFontCharMap() const;
     virtual void			GetDevFontList( ImplDevFontList* );
     virtual void			GetDevFontSubstList( OutputDevice* );
diff -r 458049042e56 -r c28e2e0d774b vcl/unx/source/fontmanager/fontcache.cxx
--- a/vcl/unx/source/fontmanager/fontcache.cxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/unx/source/fontmanager/fontcache.cxx	Fri Feb 12 17:12:55 2010 +0100
@@ -214,9 +214,9 @@
                 aLine.Append( ';' );
                 aLine.Append( (*it)->m_bUserOverride ? "1" : "0" );
                 aLine.Append( ';' );
-                aLine.Append( ByteString::CreateFromInt32( (*it)->m_eEmbeddedbitmap ) );
+                aLine.Append( ByteString::CreateFromInt32( 0 ) );
                 aLine.Append( ';' );
-                aLine.Append( ByteString::CreateFromInt32( (*it)->m_eAntialias ) );
+                aLine.Append( ByteString::CreateFromInt32( 0 ) );
 
                 switch( (*it)->m_eType )
                 {
@@ -426,9 +426,6 @@
                                     = atoi( pLine + nTokenPos[14] );
                 pFont->m_bUserOverride
                                     = (atoi( pLine + nTokenPos[15] ) != 0);
-                pFont->m_eEmbeddedbitmap
-                                    = (fcstatus::type)atoi(pLine+nTokenPos[16]);
-                pFont->m_eAntialias = (fcstatus::type)atoi(pLine+nTokenPos[17]);
                 int nStyleTokenNr = 18;
                 switch( eType )
                 {
@@ -560,8 +557,6 @@
     pTo->m_nYMax			= pFrom->m_nYMax;
     pTo->m_bHaveVerticalSubstitutedGlyphs = pFrom->m_bHaveVerticalSubstitutedGlyphs;
     pTo->m_bUserOverride    = pFrom->m_bUserOverride;
-    pTo->m_eEmbeddedbitmap  = pFrom->m_eEmbeddedbitmap;
-    pTo->m_eAntialias       = pFrom->m_eAntialias;
 }
 
 /*
@@ -623,9 +618,7 @@
         pRight->m_nXMax				!= pLeft->m_nXMax			||
         pRight->m_nYMax				!= pLeft->m_nYMax			||
         pRight->m_bHaveVerticalSubstitutedGlyphs != pLeft->m_bHaveVerticalSubstitutedGlyphs ||
-        pRight->m_bUserOverride     != pLeft->m_bUserOverride   ||
-        pRight->m_eEmbeddedbitmap   != pLeft->m_eEmbeddedbitmap ||
-        pRight->m_eAntialias        != pLeft->m_eAntialias
+        pRight->m_bUserOverride     != pLeft->m_bUserOverride
         )
         return false;
     std::list< int >::const_iterator lit, rit;
diff -r 458049042e56 -r c28e2e0d774b vcl/unx/source/fontmanager/fontconfig.cxx
--- a/vcl/unx/source/fontmanager/fontconfig.cxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/unx/source/fontmanager/fontconfig.cxx	Fri Feb 12 17:12:55 2010 +0100
@@ -37,33 +36,40 @@
 using namespace psp;
 
 #ifdef ENABLE_FONTCONFIG
-#include <fontconfig/fontconfig.h>
-#include <ft2build.h>
-#include <fontconfig/fcfreetype.h>
-// be compatible with fontconfig 2.2.0 release
-#ifndef FC_WEIGHT_BOOK
-    #define FC_WEIGHT_BOOK 75
-#endif
-#ifndef FC_EMBEDDED_BITMAP
-    #define FC_EMBEDDED_BITMAP "embeddedbitmap"
-#endif
-#ifndef FC_FAMILYLANG
-    #define FC_FAMILYLANG "familylang"
-#endif
+    #include <fontconfig/fontconfig.h>
+    #include <ft2build.h>
+    #include <fontconfig/fcfreetype.h>
+    // allow compile on baseline (currently with fontconfig 2.2.0)
+    #ifndef FC_WEIGHT_BOOK		// TODO: remove when baseline moves to fc>=2.2.1
+        #define FC_WEIGHT_BOOK 75
+    #endif
+    #ifndef FC_EMBEDDED_BITMAP	// TODO: remove when baseline moves to fc>=2.3.92
+        #define FC_EMBEDDED_BITMAP "embeddedbitmap"
+    #endif
+    #ifndef FC_FAMILYLANG		// TODO: remove when baseline moves to fc>=2.2.97
+        #define FC_FAMILYLANG "familylang"
+    #endif
+    #ifndef FC_HINT_STYLE		// TODO: remove when baseline moves to fc>=2.2.91
+    	#define FC_HINT_STYLE  "hintstyle"
+    	#define FC_HINT_NONE   0
+    	#define FC_HINT_SLIGHT 1
+    	#define FC_HINT_MEDIUM 2
+    	#define FC_HINT_FULL   3
+	#endif
 #else
-typedef void FcConfig;
-typedef void FcObjectSet;
-typedef void FcPattern;
-typedef void FcFontSet;
-typedef void FcCharSet;
-typedef int FcResult;
-typedef int FcBool;
-typedef int FcMatchKind;
-typedef char FcChar8;
-typedef int FcChar32;
-typedef unsigned int FT_UInt;
-typedef void* FT_Face;
-typedef int FcSetName;
+    typedef void FcConfig;
+    typedef void FcObjectSet;
+    typedef void FcPattern;
+    typedef void FcFontSet;
+    typedef void FcCharSet;
+    typedef int FcResult;
+    typedef int FcBool;
+    typedef int FcMatchKind;
+    typedef char FcChar8;
+    typedef int FcChar32;
+    typedef unsigned int FT_UInt;
+    typedef void* FT_Face;
+    typedef int FcSetName;
 #endif
 
 #include <cstdio>
@@ -120,6 +126,7 @@
     FcBool			(*m_pFcConfigAppFontAddDir)(FcConfig*, const FcChar8*);
     FcBool			(*m_pFcConfigSubstitute)(FcConfig*,FcPattern*,FcMatchKind);
     FcBool			(*m_pFcPatternAddInteger)(FcPattern*,const char*,int);
+    FcBool                    (*m_pFcPatternAddDouble)(FcPattern*,const char*,double);
     FcBool                    (*m_pFcPatternAddBool)(FcPattern*,const char*,FcBool);
     FcBool                    (*m_pFcPatternAddCharSet)(FcPattern*,const char*,const FcCharSet*);
     FcBool			(*m_pFcPatternAddString)(FcPattern*,const char*,const FcChar8*);
@@ -223,6 +230,8 @@
     { return m_pFcConfigSubstitute( pConfig, pPattern, eKind ); }
     FcBool FcPatternAddInteger( FcPattern* pPattern, const char* pObject, int nValue )
     { return m_pFcPatternAddInteger( pPattern, pObject, nValue ); }
+    FcBool FcPatternAddDouble( FcPattern* pPattern, const char* pObject, double nValue )
+    { return m_pFcPatternAddDouble( pPattern, pObject, nValue ); }
     FcBool FcPatternAddString( FcPattern* pPattern, const char* pObject, const FcChar8* pString )
     { return m_pFcPatternAddString( pPattern, pObject, pString ); }
     FcBool FcPatternAddBool( FcPattern* pPattern, const char* pObject, bool nValue )
@@ -234,7 +243,9 @@
     { return m_pFcFreeTypeCharIndex ? m_pFcFreeTypeCharIndex( face, ucs4 ) : 0; }
 
 public: // TODO: cleanup
-    std::hash_map< rtl::OString, rtl::OString, rtl::OStringHash > m_aFontconfigNameToLocalized;
+    FcResult FamilyFromPattern(FcPattern* pPattern, FcChar8 **family);
+    std::hash_map< rtl::OString, rtl::OString, rtl::OStringHash > m_aFontNameToLocalized;
+    std::hash_map< rtl::OString, rtl::OString, rtl::OStringHash > m_aLocalizedToCanonical;
 };
 
 oslGenericFunction FontCfgWrapper::loadSymbol( const char* pSymbol )
@@ -324,6 +335,8 @@
         loadSymbol( "FcConfigSubstitute" );
     m_pFcPatternAddInteger = (FcBool(*)(FcPattern*,const char*,int))
         loadSymbol( "FcPatternAddInteger" );
+    m_pFcPatternAddDouble = (FcBool(*)(FcPattern*,const char*,double))
+        loadSymbol( "FcPatternAddDouble" );
     m_pFcPatternAddBool = (FcBool(*)(FcPattern*,const char*,FcBool))
         loadSymbol( "FcPatternAddBool" );
     m_pFcPatternAddCharSet = (FcBool(*)(FcPattern*,const char*,const FcCharSet *))
@@ -374,6 +387,7 @@
             m_pFcDefaultSubstitute			&&
             m_pFcConfigSubstitute			&&
             m_pFcPatternAddInteger			&&
+            m_pFcPatternAddDouble                     &&
             m_pFcPatternAddCharSet			&&
             m_pFcPatternAddBool 			&&
             m_pFcPatternAddString
@@ -506,53 +520,52 @@
 
         return candidate;
     }
-
-
-    FcResult lcl_FamilyFromPattern(FontCfgWrapper& rWrapper, FcPattern* pPattern, FcChar8 **family, 
-        std::hash_map< rtl::OString, rtl::OString, rtl::OStringHash > &aFontconfigNameToLocalized)
-    {
-        FcChar8 *origfamily;
-        FcResult eFamilyRes	= rWrapper.FcPatternGetString( pPattern, FC_FAMILY, 0, &origfamily );
-        *family = origfamily;
-        
-        if( eFamilyRes == FcResultMatch)
-        {
-            FcChar8* familylang = NULL;
-            if (rWrapper.FcPatternGetString( pPattern, FC_FAMILYLANG, 0, &familylang ) == FcResultMatch)
-            {
-                std::vector< lang_and_family > lang_and_families;
-                lang_and_families.push_back(lang_and_family(familylang, *family));
-                int k = 1;
-                while (1)
-                {
-                    if (rWrapper.FcPatternGetString( pPattern, FC_FAMILYLANG, k, &familylang ) != FcResultMatch)
-                        break;
-                    if (rWrapper.FcPatternGetString( pPattern, FC_FAMILY, k, family ) != FcResultMatch)
-                        break;
-                    lang_and_families.push_back(lang_and_family(familylang, *family));
-                    ++k;
-                }
-                
-                //possible to-do, sort by UILocale instead of process locale
-                rtl_Locale* pLoc;
-                osl_getProcessLocale(&pLoc);
-                localizedsorter aSorter(pLoc);
-                *family = aSorter.bestname(lang_and_families);
-                
-                std::vector<lang_and_family>::const_iterator aEnd = lang_and_families.end();
-                for (std::vector<lang_and_family>::const_iterator aIter = lang_and_families.begin(); aIter != aEnd; ++aIter)
-                {
-                    const char *candidate = (const char*)(aIter->second);
-                    if (rtl_str_compare(candidate, (const char*)(*family)) != 0)
-                        aFontconfigNameToLocalized[OString(candidate)] = OString((const char*)(*family));
-                }
-            }
-        }
-        
-        return eFamilyRes;
-    }
 }
 
+FcResult FontCfgWrapper::FamilyFromPattern(FcPattern* pPattern, FcChar8 **family)
+{
+    FcChar8 *origfamily;
+    FcResult eFamilyRes	= FcPatternGetString( pPattern, FC_FAMILY, 0, &origfamily );
+    *family = origfamily;
+    
+    if( eFamilyRes == FcResultMatch)
+    {
+        FcChar8* familylang = NULL;
+        if (FcPatternGetString( pPattern, FC_FAMILYLANG, 0, &familylang ) == FcResultMatch)
+        {
+            std::vector< lang_and_family > lang_and_families;
+            lang_and_families.push_back(lang_and_family(familylang, *family));
+            int k = 1;
+            while (1)
+            {
+                if (FcPatternGetString( pPattern, FC_FAMILYLANG, k, &familylang ) != FcResultMatch)
+                    break;
+                if (FcPatternGetString( pPattern, FC_FAMILY, k, family ) != FcResultMatch)
+                    break;
+                lang_and_families.push_back(lang_and_family(familylang, *family));
+                ++k;
+            }
+            
+            //possible to-do, sort by UILocale instead of process locale
+            rtl_Locale* pLoc;
+            osl_getProcessLocale(&pLoc);
+            localizedsorter aSorter(pLoc);
+            *family = aSorter.bestname(lang_and_families);
+            
+            std::vector<lang_and_family>::const_iterator aEnd = lang_and_families.end();
+            for (std::vector<lang_and_family>::const_iterator aIter = lang_and_families.begin(); aIter != aEnd; ++aIter)
+            {
+                const char *candidate = (const char*)(aIter->second);
+                if (rtl_str_compare(candidate, (const char*)(*family)) != 0)
+                    m_aFontNameToLocalized[OString(candidate)] = OString((const char*)(*family));
+            }
+            if (rtl_str_compare((const char*)origfamily, (const char*)(*family)) != 0)
+                m_aLocalizedToCanonical[OString((const char*)(*family))] = OString((const char*)origfamily);
+        }
+    }
+    
+    return eFamilyRes;
+}
 
 /*
  * PrintFontManager::initFontconfig
@@ -565,6 +578,72 @@
     return true;
 }
 
+namespace
+{
+    weight::type convertWeight(int weight)
+    {
+        // set weight
+        if( weight <= FC_WEIGHT_THIN )
+            return weight::Thin;
+        else if( weight <= FC_WEIGHT_ULTRALIGHT )
+            return weight::UltraLight;
+        else if( weight <= FC_WEIGHT_LIGHT )
+            return weight::Light;
+        else if( weight <= FC_WEIGHT_BOOK )
+            return weight::SemiLight;
+        else if( weight <= FC_WEIGHT_NORMAL )
+            return weight::Normal;
+        else if( weight <= FC_WEIGHT_MEDIUM )
+            return weight::Medium;
+        else if( weight <= FC_WEIGHT_SEMIBOLD )
+            return weight::SemiBold;
+        else if( weight <= FC_WEIGHT_BOLD )
+            return weight::Bold;
+        else if( weight <= FC_WEIGHT_ULTRABOLD )
+            return weight::UltraBold;
+        return weight::Black;
+    }
+
+    italic::type convertSlant(int slant)
+    {
+        // set italic
+        if( slant == FC_SLANT_ITALIC )
+            return italic::Italic;
+        else if( slant == FC_SLANT_OBLIQUE )
+            return italic::Oblique;
+        return italic::Upright;
+    }
+
+    pitch::type convertSpacing(int spacing)
+    {
+        // set pitch
+        if( spacing == FC_MONO || spacing == FC_CHARCELL )
+            return pitch::Fixed;
+        return pitch::Variable;
+    }
+
+    width::type convertWidth(int width)
+    {
+        if (width == FC_WIDTH_ULTRACONDENSED)
+            return width::UltraCondensed;
+        else if (width == FC_WIDTH_EXTRACONDENSED)
+            return width::ExtraCondensed;
+        else if (width == FC_WIDTH_CONDENSED)
+            return width::Condensed;
+        else if (width == FC_WIDTH_SEMICONDENSED)
+            return width::SemiCondensed;
+        else if (width == FC_WIDTH_SEMIEXPANDED)
+            return width::SemiExpanded;
+        else if (width == FC_WIDTH_EXPANDED)
+            return width::Expanded;
+        else if (width == FC_WIDTH_EXTRAEXPANDED)
+            return width::ExtraExpanded;
+        else if (width == FC_WIDTH_ULTRAEXPANDED)
+            return width::UltraExpanded;
+        return width::Normal;
+    }
+}
+
 int PrintFontManager::countFontconfigFonts()
 {
     int nFonts = 0;
@@ -588,18 +667,16 @@
             int weight = 0;
             int spacing = 0;
             int nCollectionEntry = -1;
-            FcBool outline = false, embitmap = true, antialias = true;
+            FcBool outline = false;
             
             FcResult eFileRes	      = rWrapper.FcPatternGetString( pFSet->fonts[i], FC_FILE, 0, &file );
-            FcResult eFamilyRes       = lcl_FamilyFromPattern(rWrapper, pFSet->fonts[i], &family, rWrapper.m_aFontconfigNameToLocalized );
+            FcResult eFamilyRes       = rWrapper.FamilyFromPattern( pFSet->fonts[i], &family );
             FcResult eStyleRes	      = rWrapper.FcPatternGetString( pFSet->fonts[i], FC_STYLE, 0, &style );
             FcResult eSlantRes	      = rWrapper.FcPatternGetInteger( pFSet->fonts[i], FC_SLANT, 0, &slant );
             FcResult eWeightRes	      = rWrapper.FcPatternGetInteger( pFSet->fonts[i], FC_WEIGHT, 0, &weight );
             FcResult eSpacRes	      = rWrapper.FcPatternGetInteger( pFSet->fonts[i], FC_SPACING, 0, &spacing );
             FcResult eOutRes	      = rWrapper.FcPatternGetBool( pFSet->fonts[i], FC_OUTLINE, 0, &outline );
             FcResult eIndexRes        = rWrapper.FcPatternGetInteger( pFSet->fonts[i], FC_INDEX, 0, &nCollectionEntry );
-            FcResult eEmbeddedBitmap  = rWrapper.FcPatternGetBool( pFSet->fonts[i], FC_EMBEDDED_BITMAP, 0, &embitmap );
-            FcResult eAntialias       = rWrapper.FcPatternGetBool( pFSet->fonts[i], FC_ANTIALIAS, 0, &antialias );
             
             if( eFileRes != FcResultMatch || eFamilyRes != FcResultMatch || eOutRes != FcResultMatch )
                 continue;
@@ -694,60 +771,15 @@
                     pUpdate->m_nFamilyName = nFamilyName;
                 }
                 if( eWeightRes == FcResultMatch )
-                {
-                    // set weight
-                    if( weight <= FC_WEIGHT_THIN )
-                        pUpdate->m_eWeight = weight::Thin;
-                    else if( weight <= FC_WEIGHT_ULTRALIGHT )
-                        pUpdate->m_eWeight = weight::UltraLight;
-                    else if( weight <= FC_WEIGHT_LIGHT )
-                        pUpdate->m_eWeight = weight::Light;
-                    else if( weight <= FC_WEIGHT_BOOK )
-                        pUpdate->m_eWeight = weight::SemiLight;
-                    else if( weight <= FC_WEIGHT_NORMAL )
-                        pUpdate->m_eWeight = weight::Normal;
-                    else if( weight <= FC_WEIGHT_MEDIUM )
-                        pUpdate->m_eWeight = weight::Medium;
-                    else if( weight <= FC_WEIGHT_SEMIBOLD )
-                        pUpdate->m_eWeight = weight::SemiBold;
-                    else if( weight <= FC_WEIGHT_BOLD )
-                        pUpdate->m_eWeight = weight::Bold;
-                    else if( weight <= FC_WEIGHT_ULTRABOLD )
-                        pUpdate->m_eWeight = weight::UltraBold;
-                    else
-                        pUpdate->m_eWeight = weight::Black;
-                }
+					pUpdate->m_eWeight = convertWeight(weight);
                 if( eSpacRes == FcResultMatch )
-                {
-                    // set pitch
-                    if( spacing == FC_PROPORTIONAL )
-                        pUpdate->m_ePitch = pitch::Variable;
-                    else if( spacing == FC_MONO || spacing == FC_CHARCELL )
-                        pUpdate->m_ePitch = pitch::Fixed;
-                }
+                    pUpdate->m_ePitch = convertSpacing(spacing);
                 if( eSlantRes == FcResultMatch )
-                {
-                    // set italic
-                    if( slant == FC_SLANT_ROMAN )
-                        pUpdate->m_eItalic = italic::Upright;
-                    else if( slant == FC_SLANT_ITALIC )
-                        pUpdate->m_eItalic = italic::Italic;
-                    else if( slant == FC_SLANT_OBLIQUE )
-                        pUpdate->m_eItalic = italic::Oblique;
-                }
+					pUpdate->m_eItalic = convertSlant(slant);
                 if( eStyleRes == FcResultMatch )
                 {
                     pUpdate->m_aStyleName = OStringToOUString( OString( (sal_Char*)style ), RTL_TEXTENCODING_UTF8 );
                 }
-                if( eEmbeddedBitmap == FcResultMatch )
-                {
-                  pUpdate->m_eEmbeddedbitmap = embitmap ? fcstatus::istrue : fcstatus::isfalse;
-                }
-                if( eAntialias == FcResultMatch )
-                {
-                  pUpdate->m_eAntialias = antialias ? fcstatus::istrue : fcstatus::isfalse;
-                }
-
                 
                 // update font cache
                 m_pFontCache->updateFontCacheEntry( pUpdate, false );
@@ -883,8 +915,8 @@
 
 rtl::OUString PrintFontManager::Substitute(const rtl::OUString& rFontName,
     rtl::OUString& rMissingCodes, const rtl::OString &rLangAttrib,
-    italic::type eItalic, weight::type eWeight,
-    width::type eWidth, pitch::type ePitch) const
+    italic::type &rItalic, weight::type &rWeight,
+    width::type &rWidth, pitch::type &rPitch) const
 {
     rtl::OUString aName;
     FontCfgWrapper& rWrapper = FontCfgWrapper::get();
@@ -919,7 +951,7 @@
        rWrapper.FcCharSetDestroy( unicodes );
     }
 
-    addtopattern(rWrapper, pPattern, eItalic, eWeight, eWidth, ePitch);
+    addtopattern(rWrapper, pPattern, rItalic, rWeight, rWidth, rPitch);
 
     // query fontconfig for a substitute
     rWrapper.FcConfigSubstitute( rWrapper.FcConfigGetCurrent(), pPattern, FcMatchPattern );
@@ -952,10 +984,21 @@
             if( eFileRes == FcResultMatch )
             {
                 OString sFamily((sal_Char*)family);
-                std::hash_map< rtl::OString, rtl::OString, rtl::OStringHash >::const_iterator aI = rWrapper.m_aFontconfigNameToLocalized.find(sFamily);
-                if (aI != rWrapper.m_aFontconfigNameToLocalized.end())
+                std::hash_map< rtl::OString, rtl::OString, rtl::OStringHash >::const_iterator aI = rWrapper.m_aFontNameToLocalized.find(sFamily);
+                if (aI != rWrapper.m_aFontNameToLocalized.end())
                     sFamily = aI->second;
                 aName = rtl::OStringToOUString( sFamily, RTL_TEXTENCODING_UTF8 );
+
+
+                int val = 0;
+                if ( FcResultMatch == rWrapper.FcPatternGetInteger( pSet->fonts[0], FC_WEIGHT, 0, &val))
+                    rWeight = convertWeight(val);
+                if ( FcResultMatch == rWrapper.FcPatternGetInteger( pSet->fonts[0], FC_SLANT, 0, &val))
+                    rItalic = convertSlant(val);
+                if ( FcResultMatch == rWrapper.FcPatternGetInteger( pSet->fonts[0], FC_SPACING, 0, &val))
+                    rPitch = convertSpacing(val);
+                if ( FcResultMatch == rWrapper.FcPatternGetInteger( pSet->fonts[0], FC_WIDTH, 0, &val))
+                    rWidth = convertWidth(val);
             }
 
 			// update rMissingCodes by removing resolved unicodes
@@ -984,6 +1027,89 @@
     return aName;
 }
 
+bool PrintFontManager::getFontOptions( 
+    const FastPrintFontInfo& rInfo, int nSize, void (*subcallback)(void*),
+    ImplFontOptions& rOptions) const
+{
+#ifndef ENABLE_FONTCONFIG
+    return false;
+#else // ENABLE_FONTCONFIG
+    FontCfgWrapper& rWrapper = FontCfgWrapper::get();
+    if( ! rWrapper.isValid() )
+        return false;
+
+    FcConfig* pConfig = rWrapper.FcConfigGetCurrent();
+    FcPattern* pPattern = rWrapper.FcPatternCreate();
+
+    OString sFamily = OUStringToOString( rInfo.m_aFamilyName, RTL_TEXTENCODING_UTF8 );
+
+    std::hash_map< rtl::OString, rtl::OString, rtl::OStringHash >::const_iterator aI = rWrapper.m_aLocalizedToCanonical.find(sFamily);
+    if (aI != rWrapper.m_aLocalizedToCanonical.end())
+        sFamily = aI->second;
+    if( sFamily.getLength() )
+        rWrapper.FcPatternAddString( pPattern, FC_FAMILY, (FcChar8*)sFamily.getStr() );
+
+    addtopattern(rWrapper, pPattern, rInfo.m_eItalic, rInfo.m_eWeight, rInfo.m_eWidth, rInfo.m_ePitch);
+    rWrapper.FcPatternAddDouble( pPattern, FC_PIXEL_SIZE, nSize);
+
+    FcBool embitmap = true, antialias = true, autohint = true, hinting = true;
+    int hintstyle = FC_HINT_FULL;
+
+    rWrapper.FcConfigSubstitute( pConfig, pPattern, FcMatchPattern );
+    if (subcallback) subcallback(pPattern);
+    rWrapper.FcDefaultSubstitute( pPattern );
+
+    FcResult eResult = FcResultNoMatch;
+    FcFontSet* pFontSet = rWrapper.getFontSet();
+    FcPattern* pResult = rWrapper.FcFontSetMatch( pConfig, &pFontSet, 1, pPattern, &eResult );
+    if( pResult )
+    {
+        FcFontSet* pSet = rWrapper.FcFontSetCreate();
+        rWrapper.FcFontSetAdd( pSet, pResult );
+        if( pSet->nfont > 0 )
+        {
+            FcResult eEmbeddedBitmap = rWrapper.FcPatternGetBool(pSet->fonts[0],
+                FC_EMBEDDED_BITMAP, 0, &embitmap);
+            FcResult eAntialias = rWrapper.FcPatternGetBool(pSet->fonts[0],
+                FC_ANTIALIAS, 0, &antialias);
+            FcResult eAutoHint = rWrapper.FcPatternGetBool(pSet->fonts[0], 
+                FC_AUTOHINT, 0, &autohint);
+            FcResult eHinting = rWrapper.FcPatternGetBool(pSet->fonts[0], 
+                FC_HINTING, 0, &hinting);
+            /*FcResult eHintStyle =*/ rWrapper.FcPatternGetInteger( pSet->fonts[0],
+                FC_HINT_STYLE, 0, &hintstyle);
+         
+            if( eEmbeddedBitmap == FcResultMatch )
+                rOptions.meEmbeddedBitmap = embitmap ? EMBEDDEDBITMAP_TRUE : EMBEDDEDBITMAP_FALSE;
+            if( eAntialias == FcResultMatch )
+                rOptions.meAntiAlias = antialias ? ANTIALIAS_TRUE : ANTIALIAS_FALSE;
+            if( eAutoHint == FcResultMatch )
+                rOptions.meAutoHint = autohint ? AUTOHINT_TRUE : AUTOHINT_FALSE;
+            if( eHinting == FcResultMatch )
+                rOptions.meHinting = hinting ? HINTING_TRUE : HINTING_FALSE;
+            switch (hintstyle)
+            {
+                case FC_HINT_NONE:   rOptions.meHintStyle = HINT_NONE; break;
+                case FC_HINT_SLIGHT: rOptions.meHintStyle = HINT_SLIGHT; break;
+                case FC_HINT_MEDIUM: rOptions.meHintStyle = HINT_MEDIUM; break;
+                default: // fall through
+                case FC_HINT_FULL:   rOptions.meHintStyle = HINT_FULL; break;
+            }
+        }
+        // info: destroying the pSet destroys pResult implicitly
+        // since pResult was "added" to pSet
+        rWrapper.FcFontSetDestroy( pSet );
+    }
+
+    // cleanup
+    rWrapper.FcPatternDestroy( pPattern );
+
+    // TODO: return true only if non-default font options are set
+    const bool bOK = (pResult != NULL);
+    return bOK;
+#endif
+}
+
 bool PrintFontManager::matchFont( FastPrintFontInfo& rInfo, const com::sun::star::lang::Locale& rLocale )
 {
     FontCfgWrapper& rWrapper = FontCfgWrapper::get();
diff -r 458049042e56 -r c28e2e0d774b vcl/unx/source/fontmanager/fontmanager.cxx
--- a/vcl/unx/source/fontmanager/fontmanager.cxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/unx/source/fontmanager/fontmanager.cxx	Fri Feb 12 17:12:55 2010 +0100
@@ -353,9 +353,7 @@
         m_nXMax( 0 ),
         m_nYMax( 0 ),
         m_bHaveVerticalSubstitutedGlyphs( false ),
-        m_bUserOverride( false ),
-        m_eEmbeddedbitmap( fcstatus::isunset ),
-        m_eAntialias( fcstatus::isunset )
+        m_bUserOverride( false )
 {
 }
 
@@ -2630,8 +2628,6 @@
     rInfo.m_eWeight         = pFont->m_eWeight;
     rInfo.m_ePitch          = pFont->m_ePitch;
     rInfo.m_aEncoding       = pFont->m_aEncoding;
-    rInfo.m_eEmbeddedbitmap = pFont->m_eEmbeddedbitmap;
-    rInfo.m_eAntialias      = pFont->m_eAntialias;
 
     rInfo.m_bEmbeddable  = (pFont->m_eType == fonttype::Type1);
     rInfo.m_bSubsettable = (pFont->m_eType == fonttype::TrueType); // TODO: rename to SfntType
@@ -3936,8 +3932,6 @@
         BuiltinFont* pFont = new BuiltinFont();
         pFont->m_nDirectory = 0;
         pFont->m_bUserOverride = false;
-        pFont->m_eEmbeddedbitmap = fcstatus::isunset;
-        pFont->m_eAntialias = fcstatus::isunset;
         pFont->m_pMetrics = new PrintFontMetrics;
         memset( pFont->m_pMetrics->m_aPages, 0xff, sizeof( pFont->m_pMetrics->m_aPages ) );
         pFont->m_pMetrics->m_bKernPairsQueried = true;
diff -r 458049042e56 -r c28e2e0d774b vcl/unx/source/gdi/pspgraphics.cxx
--- a/vcl/unx/source/gdi/pspgraphics.cxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/unx/source/gdi/pspgraphics.cxx	Fri Feb 12 17:12:55 2010 +0100
@@ -1284,32 +1284,6 @@
     aDFA.mbSubsettable  = rInfo.m_bSubsettable;
     aDFA.mbEmbeddable   = rInfo.m_bEmbeddable;
 
-    switch (rInfo.m_eEmbeddedbitmap)
-    {
-        default:
-            aDFA.meEmbeddedBitmap = EMBEDDEDBITMAP_DONTKNOW;
-            break;
-        case psp::fcstatus::istrue:
-            aDFA.meEmbeddedBitmap = EMBEDDEDBITMAP_TRUE;
-            break;
-        case psp::fcstatus::isfalse:
-            aDFA.meEmbeddedBitmap = EMBEDDEDBITMAP_FALSE;
-            break;
-    }
-
-    switch (rInfo.m_eAntialias)
-    {
-        default:
-            aDFA.meAntiAlias = ANTIALIAS_DONTKNOW;
-            break;
-        case psp::fcstatus::istrue:
-            aDFA.meAntiAlias = ANTIALIAS_TRUE;
-            break;
-        case psp::fcstatus::isfalse:
-            aDFA.meAntiAlias = ANTIALIAS_FALSE;
-            break;
-    }
-
     switch( rInfo.m_eType )
     {
         case psp::fonttype::Builtin:
diff -r 458049042e56 -r c28e2e0d774b vcl/unx/source/gdi/salgdi3.cxx
--- a/vcl/unx/source/gdi/salgdi3.cxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/unx/source/gdi/salgdi3.cxx	Fri Feb 12 17:12:55 2010 +0100
@@ -630,12 +630,26 @@
     ServerFont* pServerFont = GlyphCache::GetInstance().CacheFont( *pEntry );
     if( pServerFont != NULL )
     {
+        // ignore fonts with e.g. corrupted font files
         if( !pServerFont->TestFont() )
         {
             GlyphCache::GetInstance().UncacheFont( *pServerFont );
             return false;
         }
+
+        // register to use the font
         mpServerFont[ nFallbackLevel ] = pServerFont;
+
+        // apply font specific-hint settings if needed 
+	if( !bPrinter_ )
+	{
+            // TODO: is it worth it to cache the hint settings, e.g. in the ImplFontEntry?
+            ImplFontOptions aFontOptions;
+            bool GetFCFontOptions( const ImplFontAttributes&, int nSize, ImplFontOptions&);
+            if( GetFCFontOptions( *pEntry->mpFontData, pEntry->mnHeight, aFontOptions ) )
+                pServerFont->SetFontOptions( aFontOptions );
+        }
+
         return true;
     }
 
@@ -743,6 +757,8 @@
     void (*mp_set_font_matrix)(cairo_t *, const cairo_matrix_t *);
     void (*mp_show_glyphs)(cairo_t *, const cairo_glyph_t *, int );
     void (*mp_set_source_rgb)(cairo_t *, double , double , double );
+    void (*mp_set_font_options)(cairo_t *, const void *);
+    void (*mp_ft_font_options_substitute)(const void*, void*);
 
     bool canEmbolden() const { return false; }
 
@@ -778,6 +794,10 @@
         { (*mp_show_glyphs)(cr, glyphs, no_glyphs); }
     void set_source_rgb(cairo_t *cr, double red, double green, double blue)
         { (*mp_set_source_rgb)(cr, red, green, blue); }
+    void set_font_options(cairo_t *cr, const void *options)
+        { (*mp_set_font_options)(cr, options); }
+    void ft_font_options_substitute(const void *options, void *pattern)
+        { (*mp_ft_font_options_substitute)(options, pattern); }
 };
 
 static CairoWrapper* pCairoInstance = NULL;
@@ -847,6 +867,10 @@
         osl_getAsciiFunctionSymbol( mpCairoLib, "cairo_show_glyphs" );
     mp_set_source_rgb = (void (*)(cairo_t *, double , double , double ))
         osl_getAsciiFunctionSymbol( mpCairoLib, "cairo_set_source_rgb" );
+    mp_set_font_options = (void (*)(cairo_t *, const void *options ))
+        osl_getAsciiFunctionSymbol( mpCairoLib, "cairo_set_font_options" );
+    mp_ft_font_options_substitute = (void (*)(const void *, void *))
+        osl_getAsciiFunctionSymbol( mpCairoLib, "cairo_ft_font_options_substitute" );
 
     if( !( 
             mp_xlib_surface_create_with_xrender_format &&
@@ -863,7 +887,9 @@
             mp_matrix_rotate &&
             mp_set_font_matrix &&
             mp_show_glyphs &&
-            mp_set_source_rgb
+            mp_set_source_rgb &&
+            mp_set_font_options &&
+            mp_ft_font_options_substitute
         ) )
     {
         osl_unloadModule( mpCairoLib );
@@ -971,6 +997,9 @@
     cairo_t *cr = rCairo.create(surface);
     rCairo.surface_destroy(surface);
 
+    if (const void *pOptions = Application::GetSettings().GetStyleSettings().GetCairoFontOptions())
+        rCairo.set_font_options( cr, pOptions);
+
     if( pClipRegion_ && !XEmptyRegion( pClipRegion_ ) )
     {
 	for (long i = 0; i < pClipRegion_->numRects; ++i)
@@ -1601,6 +1630,122 @@
 
 // ----------------------------------------------------------------------------
 
+void cairosubcallback( void* pPattern )
+{
+    CairoWrapper& rCairo = CairoWrapper::get();
+    if( rCairo.isValid() )
+    {
+	const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+        rCairo.ft_font_options_substitute( rStyleSettings.GetCairoFontOptions(), pPattern);
+    }
+}
+
+bool GetFCFontOptions( const ImplFontAttributes& rFontAttributes, int nSize,
+	ImplFontOptions& rFontOptions)
+{
+    // TODO: get rid of these insane enum-conversions
+    // e.g. by using the classic vclenum values inside VCL
+
+    psp::FastPrintFontInfo aInfo;
+    // set family name
+    aInfo.m_aFamilyName = rFontAttributes.GetFamilyName();
+    // set italic
+    switch( rFontAttributes.GetSlant() )
+    {
+        case ITALIC_NONE:
+            aInfo.m_eItalic = psp::italic::Upright;
+            break;
+        case ITALIC_NORMAL:
+            aInfo.m_eItalic = psp::italic::Italic;
+            break;
+        case ITALIC_OBLIQUE:
+            aInfo.m_eItalic = psp::italic::Oblique;
+            break;
+        default:
+            aInfo.m_eItalic = psp::italic::Unknown;
+            break;
+
+    }
+    // set weight
+    switch( rFontAttributes.GetWeight() )
+    {
+        case WEIGHT_THIN:
+            aInfo.m_eWeight = psp::weight::Thin;
+            break;
+        case WEIGHT_ULTRALIGHT:
+            aInfo.m_eWeight = psp::weight::UltraLight;
+            break;
+        case WEIGHT_LIGHT:
+            aInfo.m_eWeight = psp::weight::Light;
+            break;
+        case WEIGHT_SEMILIGHT:
+            aInfo.m_eWeight = psp::weight::SemiLight;
+            break;
+        case WEIGHT_NORMAL:
+            aInfo.m_eWeight = psp::weight::Normal;
+            break;
+        case WEIGHT_MEDIUM:
+            aInfo.m_eWeight = psp::weight::Medium;
+            break;
+        case WEIGHT_SEMIBOLD:
+            aInfo.m_eWeight = psp::weight::SemiBold;
+            break;
+        case WEIGHT_BOLD:
+            aInfo.m_eWeight = psp::weight::Bold;
+            break;
+        case WEIGHT_ULTRABOLD:
+            aInfo.m_eWeight = psp::weight::UltraBold;
+            break;
+        case WEIGHT_BLACK:
+            aInfo.m_eWeight = psp::weight::Black;
+            break;
+        default:
+            aInfo.m_eWeight = psp::weight::Unknown;
+            break;
+    }
+    // set width
+    switch( rFontAttributes.GetWidthType() )
+    {
+        case WIDTH_ULTRA_CONDENSED:
+            aInfo.m_eWidth = psp::width::UltraCondensed;
+            break;
+        case WIDTH_EXTRA_CONDENSED:
+            aInfo.m_eWidth = psp::width::ExtraCondensed;
+            break;
+        case WIDTH_CONDENSED:
+            aInfo.m_eWidth = psp::width::Condensed;
+            break;
+        case WIDTH_SEMI_CONDENSED:
+            aInfo.m_eWidth = psp::width::SemiCondensed;
+            break;
+        case WIDTH_NORMAL:
+            aInfo.m_eWidth = psp::width::Normal;
+            break;
+        case WIDTH_SEMI_EXPANDED:
+            aInfo.m_eWidth = psp::width::SemiExpanded;
+            break;
+        case WIDTH_EXPANDED:
+            aInfo.m_eWidth = psp::width::Expanded;
+            break;
+        case WIDTH_EXTRA_EXPANDED:
+            aInfo.m_eWidth = psp::width::ExtraExpanded;
+            break;
+        case WIDTH_ULTRA_EXPANDED:
+            aInfo.m_eWidth = psp::width::UltraExpanded;
+            break;
+        default:
+            aInfo.m_eWidth = psp::width::Unknown;
+            break;
+    }
+
+    const psp::PrintFontManager& rPFM = psp::PrintFontManager::get();
+    bool bOK = rPFM.getFontOptions( aInfo, nSize, cairosubcallback, rFontOptions);
+
+    return bOK;
+}
+
+// ----------------------------------------------------------------------------
+
 void
 X11SalGraphics::GetFontMetric( ImplFontMetricData *pMetric )
 {
@@ -1876,8 +2021,10 @@
 
 // -----------------------------------------------------------------------
 
-static rtl::OUString GetFcSubstitute(const ImplFontSelectData &rFontSelData, OUString& rMissingCodes )
+static ImplFontSelectData GetFcSubstitute(const ImplFontSelectData &rFontSelData, OUString& rMissingCodes )
 {
+    ImplFontSelectData aRet(rFontSelData);
+
     const rtl::OString aLangAttrib; //TODO: = MsLangId::convertLanguageToIsoByteString( rFontSelData.meLanguage );
 
     psp::italic::type eItalic = psp::italic::Unknown;
@@ -1945,7 +2092,72 @@
     }
 
     const psp::PrintFontManager& rMgr = psp::PrintFontManager::get();
-    return rMgr.Substitute( rFontSelData.maTargetName, rMissingCodes, aLangAttrib, eItalic, eWeight, eWidth, ePitch);
+    aRet.maSearchName = rMgr.Substitute( rFontSelData.maTargetName, rMissingCodes, aLangAttrib, eItalic, eWeight, eWidth, ePitch);
+
+    switch (eItalic)
+    {
+        case psp::italic::Upright: aRet.meItalic = ITALIC_NONE; break;
+        case psp::italic::Italic: aRet.meItalic = ITALIC_NORMAL; break;
+        case psp::italic::Oblique: aRet.meItalic = ITALIC_OBLIQUE; break;
+        default:
+            break;
+    }
+
+    switch (eWeight)
+    {
+        case psp::weight::Thin: aRet.meWeight = WEIGHT_THIN; break;
+        case psp::weight::UltraLight: aRet.meWeight = WEIGHT_ULTRALIGHT; break;
+        case psp::weight::Light: aRet.meWeight = WEIGHT_LIGHT; break;
+        case psp::weight::SemiLight: aRet.meWeight = WEIGHT_SEMILIGHT; break;
+        case psp::weight::Normal: aRet.meWeight = WEIGHT_NORMAL; break;
+        case psp::weight::Medium: aRet.meWeight = WEIGHT_MEDIUM; break;
+        case psp::weight::SemiBold: aRet.meWeight = WEIGHT_SEMIBOLD; break;
+        case psp::weight::Bold: aRet.meWeight = WEIGHT_BOLD; break;
+        case psp::weight::UltraBold: aRet.meWeight = WEIGHT_ULTRABOLD; break;
+        case psp::weight::Black: aRet.meWeight = WEIGHT_BLACK; break;
+        default:
+                break;
+    }
+
+    switch (eWidth)
+    {
+        case psp::width::UltraCondensed: aRet.meWidthType = WIDTH_ULTRA_CONDENSED; break;
+        case psp::width::ExtraCondensed: aRet.meWidthType = WIDTH_EXTRA_CONDENSED; break;
+        case psp::width::Condensed: aRet.meWidthType = WIDTH_CONDENSED; break;
+        case psp::width::SemiCondensed: aRet.meWidthType = WIDTH_SEMI_CONDENSED; break;
+        case psp::width::Normal: aRet.meWidthType = WIDTH_NORMAL; break;
+        case psp::width::SemiExpanded: aRet.meWidthType = WIDTH_SEMI_EXPANDED; break;
+        case psp::width::Expanded: aRet.meWidthType = WIDTH_EXPANDED; break;
+        case psp::width::ExtraExpanded: aRet.meWidthType = WIDTH_EXTRA_EXPANDED; break;
+        case psp::width::UltraExpanded: aRet.meWidthType = WIDTH_ULTRA_EXPANDED; break;
+        default:
+            break;
+    }
+
+    switch (ePitch)
+    {
+        case psp::pitch::Fixed: aRet.mePitch = PITCH_FIXED; break;
+        case psp::pitch::Variable: aRet.mePitch = PITCH_VARIABLE; break;
+        default:
+            break;
+    }
+
+    return aRet;
+}
+
+namespace
+{
+    bool uselessmatch(const ImplFontSelectData &rOrig, const ImplFontSelectData &rNew)
+    {
+        return
+          (
+            rOrig.maTargetName == rNew.maSearchName &&
+            rOrig.meWeight == rNew.meWeight &&
+            rOrig.meItalic == rNew.meItalic &&
+            rOrig.mePitch == rNew.mePitch &&
+            rOrig.meWidthType == rNew.meWidthType
+          );
+    }
 }
 
 //--------------------------------------------------------------------------
@@ -1961,20 +2173,19 @@
         return false;
 
     rtl::OUString aDummy;
-    const rtl::OUString aOUName = GetFcSubstitute( rFontSelData, aDummy );
-    if( !aOUName.getLength() )
+    const ImplFontSelectData aOut = GetFcSubstitute( rFontSelData, aDummy );
+    if (!aOut.maSearchName.Len())
         return false;
-    const String aName( aOUName );
-    if( aName == rFontSelData.maTargetName )
+    if( uselessmatch(rFontSelData, aOut ) )
         return false;
 
 #ifdef DEBUG
     ByteString aOrigName( rFontSelData.maTargetName, RTL_TEXTENCODING_UTF8 );
-    ByteString aSubstName( aName, RTL_TEXTENCODING_UTF8 );
+    ByteString aSubstName( aOut.maSearchName, RTL_TEXTENCODING_UTF8 );
     printf( "FcPreMatchSubstititution \"%s\" -> \"%s\"\n",
         aOrigName.GetBuffer(), aSubstName.GetBuffer() );
 #endif
-    rFontSelData.maSearchName = aName;
+    rFontSelData = aOut;
     return true;
 }
 
@@ -1991,21 +2202,20 @@
     ||  0 == rFontSelData.maSearchName.CompareIgnoreCaseToAscii( "opensymbol", 10) )
         return false;
 
-    const rtl::OUString aOUName = GetFcSubstitute( rFontSelData, rMissingCodes );
+    const ImplFontSelectData aOut = GetFcSubstitute( rFontSelData, rMissingCodes );
     // TODO: cache the unicode+font specific result
-    if( !aOUName.getLength() )
+    if (!aOut.maSearchName.Len())
         return false;
-    const String aName( aOUName );
-    if( aName == rFontSelData.maTargetName )
+    if (uselessmatch(rFontSelData, aOut))
         return false;
 
 #ifdef DEBUG
     ByteString aOrigName( rFontSelData.maTargetName, RTL_TEXTENCODING_UTF8 );
-    ByteString aSubstName( aName, RTL_TEXTENCODING_UTF8 );
+    ByteString aSubstName( aOut.maSearchName, RTL_TEXTENCODING_UTF8 );
     printf( "FcGlyphFallbackSubstititution \"%s\" -> \"%s\"\n",
         aOrigName.GetBuffer(), aSubstName.GetBuffer() );
 #endif
-    rFontSelData.maSearchName = aName;
+    rFontSelData = aOut;
     return true;
 }
 
diff -r 458049042e56 -r c28e2e0d774b vcl/unx/source/gdi/xlfd_extd.cxx
--- a/vcl/unx/source/gdi/xlfd_extd.cxx	Thu Dec 17 17:08:37 2009 +0100
+++ b/vcl/unx/source/gdi/xlfd_extd.cxx	Fri Feb 12 17:12:55 2010 +0100
@@ -105,9 +105,6 @@
     mbSubsettable  = false;
     mbEmbeddable   = false;
 
-    meEmbeddedBitmap = EMBEDDEDBITMAP_DONTKNOW;
-    meAntiAlias = ANTIALIAS_DONTKNOW;
-
     mnQuality      = -1;
 }
 
diff -ru vcl.orig/prj/d.lst vcl/prj/d.lst
--- a/vcl/prj/d.lst	2010-02-15 20:18:41.000000000 +0000
+++ b/vcl/prj/d.lst	2010-02-15 20:19:43.000000000 +0000
@@ -151,4 +151,5 @@
 ..\inc\vcl\ppdparser.hxx %_DEST%\inc%_EXT%\vcl\ppdparser.hxx
 ..\inc\vcl\helper.hxx %_DEST%\inc%_EXT%\vcl\helper.hxx
 ..\inc\vcl\strhelper.hxx %_DEST%\inc%_EXT%\vcl\strhelper.hxx
-..\inc\vcl\lazydelete.hxx %_DEST%\inc%_EXT%\vcl\lazydelete.hxx
\ No newline at end of file
+..\inc\vcl\lazydelete.hxx %_DEST%\inc%_EXT%\vcl\lazydelete.hxx
+..\inc\vcl\impfont.hxx %_DEST%\inc%_EXT%\vcl\impfont.hxx