diff -ru vcl/inc/impfont.hxx vcl/inc/impfont.hxx
--- vcl/inc/vcl/impfont.hxx	2006-05-04 08:55:40.000000000 +0100
+++ vcl/inc/vcl/impfont.hxx	2006-05-05 09:39:11.000000000 +0100
@@ -155,6 +155,42 @@
     bool    operator==( const ImplFontMetric& ) const;
 };
 
+// ------------------
+// - ImplFontHints -
+// ------------------
+
+class ImplFontHints
+{
+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:
+    ImplFontHints() :
+        meEmbeddedBitmap(EMBEDDEDBITMAP_DONTKNOW), 
+        meAntiAlias(ANTIALIAS_DONTKNOW), 
+        meAutoHint(AUTOHINT_DONTKNOW), 
+        meHinting(HINTING_DONTKNOW), 
+        meHintStyle(HINT_FULL)
+    {}
+    ImplFontHints(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 -ru vcl/inc/outdev.hxx vcl/inc/outdev.hxx
--- vcl/inc/vcl/outdev.hxx	2006-05-04 08:55:40.000000000 +0100
+++ vcl/inc/vcl/outdev.hxx	2006-05-05 10:27:05.000000000 +0100
@@ -105,6 +105,8 @@
 class FontCharMap;
 class SalLayout;
 class ImplLayoutArgs;
+class ImplFontHints;
+class ImplFontAttributes;
 class VirtualDevice;
 
 namespace basegfx {
@@ -543,6 +545,7 @@
 
     SAL_DLLPRIVATE static FontEmphasisMark ImplGetEmphasisMarkStyle( const Font& rFont );
     SAL_DLLPRIVATE static BOOL ImplIsUnderlineAbove( const Font& );
+    SAL_DLLPRIVATE void ImplGetFontHints( const ImplFontAttributes& rFontAttributes, int nSize, ImplFontHints& rFontHints) const;
 //#endif
 
 protected:
diff -ru vcl/inc/outfont.hxx vcl/inc/outfont.hxx
--- vcl/inc/vcl/outfont.hxx	2006-05-04 08:55:40.000000000 +0100
+++ vcl/inc/vcl/outfont.hxx	2006-05-04 14:37:46.000000000 +0100
@@ -118,8 +118,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 ';'
@@ -128,8 +126,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 -ru vcl/inc/salgdi.hxx vcl/inc/salgdi.hxx
--- vcl/inc/vcl/salgdi.hxx	2006-05-04 08:55:40.000000000 +0100
+++ vcl/inc/vcl/salgdi.hxx	2006-05-05 10:40:08.000000000 +0100
@@ -215,6 +215,8 @@
     void                   ReleaseFonts() { SetFont( NULL, 0 ); }
     // get the current font's metrics
     virtual void			GetFontMetric( ImplFontMetricData* ) = 0;
+    virtual void 			GetFontHints( const ImplFontAttributes& rFontAttributes, int nSize, ImplFontHints& rFontHints) const = 0;
+
     // get kernign pairs of the current font
     // return only PairCount if (pKernPairs == NULL)
     virtual ULONG			GetKernPairs( ULONG nPairs, ImplKernPairData* pKernPairs ) = 0;
diff -ru vcl/inc/vclenum.hxx vcl/inc/vclenum.hxx
--- vcl/inc/vcl/vclenum.hxx	2006-05-04 08:55:40.000000000 +0100
+++ vcl/inc/vcl/vclenum.hxx	2006-05-04 15:53:15.000000000 +0100
@@ -289,6 +289,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 -ru vcl/source/gdi/outdev3.cxx vcl/source/gdi/outdev3.cxx
--- vcl/source/gdi/outdev3.cxx	2006-05-04 08:55:40.000000000 +0100
+++ vcl/source/gdi/outdev3.cxx	2006-05-05 10:27:34.000000000 +0100
@@ -7250,6 +7250,14 @@
 
 // -----------------------------------------------------------------------
 
+void OutputDevice::ImplGetFontHints( const ImplFontAttributes& rFontAttributes, int nSize, ImplFontHints &rHints) const
+{
+    if ( mpGraphics )
+        mpGraphics->GetFontHints( rFontAttributes, nSize, rHints );
+}
+
+// -----------------------------------------------------------------------
+
 FontMetric OutputDevice::GetFontMetric() const
 {
     DBG_TRACE( "OutputDevice::GetFontMetric()" );
diff -ru vcl/source/glyphs/gcach_ftyp.cxx vcl/source/glyphs/gcach_ftyp.cxx
--- vcl/source/glyphs/gcach_ftyp.cxx	2006-05-04 08:55:40.000000000 +0100
+++ vcl/source/glyphs/gcach_ftyp.cxx	2006-05-05 10:26:37.000000000 +0100
@@ -41,6 +41,7 @@
 #include <vcl/impfont.hxx>
 #include <vcl/bitmap.hxx>
 #include <vcl/bmpacc.hxx>
+#include <vcl/virdev.hxx>
 
 #include <tools/poly.hxx>
 #include <basegfx/matrix/b2dhommatrix.hxx>
@@ -594,9 +595,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;
@@ -676,6 +674,7 @@
 :   ServerFont( rFSD ),
     mnPrioEmbedded(nDefaultPrioEmbedded),
     mnPrioAntiAlias(nDefaultPrioAntiAlias),
+    mnPrioAutoHint(nDefaultPrioAutoHint),
     mpFontInfo( pFI ),
     maFaceFT( NULL ),
     maSizeFT( NULL ),
@@ -805,42 +804,67 @@
 
     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;
+    }
+
+    ImplFontHints aHints;
+    VirtualDevice vdev( 1 );
+    vdev.ImplGetFontHints( pFI->GetFontAttributes(), mnWidth, aHints );
+
+    FontAutoHint eHint = aHints.GetUseAutoHint();
+    if (eHint == AUTOHINT_DONTKNOW)
+        eHint = mbUseGamma ? AUTOHINT_TRUE : AUTOHINT_FALSE;
 
-    //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 (mbUseGamma)
+    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 (aHints.DontUseAntiAlias())
+      mnPrioAntiAlias = 0;
+    if (aHints.DontUseEmbeddedBitmaps())
+      mnPrioEmbedded = 0;
+    if (aHints.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
+#if defined(FT_LOAD_TARGET_LIGHT) && defined(FT_LOAD_TARGET_NORMAL)
     // enable "light hinting" if available
     if( !(mnLoadFlags & FT_LOAD_NO_HINTING) && (nFTVERSION >= 2103))
-        mnLoadFlags |= FT_LOAD_TARGET_LIGHT;
+    {
+       switch (aHints.GetHintStyle())
+       {
+           default:
+           case HINT_SLIGHT:
+           case HINT_MEDIUM:
+                mnLoadFlags |= FT_LOAD_TARGET_LIGHT;
+                break;
+           case HINT_FULL:
+                mnLoadFlags |= FT_LOAD_TARGET_NORMAL;
+                break;
+           case HINT_NONE:
+                break;
+       }
+    }
 #endif
 
     if( ((mnCos != 0) && (mnSin != 0)) || (mnPrioEmbedded <= 0) )
@@ -1297,11 +1321,11 @@
 #if (FTVERSION >= 2002)
     // for 0/90/180/270 degree fonts enable autohinting 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;
@@ -1446,7 +1470,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 -ru vcl/source/glyphs/gcach_ftyp.hxx vcl/source/glyphs/gcach_ftyp.hxx
--- vcl/source/glyphs/gcach_ftyp.hxx	2006-05-04 08:55:40.000000000 +0100
+++ vcl/source/glyphs/gcach_ftyp.hxx	2006-05-04 14:53:16.000000000 +0100
@@ -93,10 +93,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; }
 
@@ -212,6 +208,7 @@
     int                         mnWidth;
     int                         mnPrioEmbedded;
     int                         mnPrioAntiAlias;
+    int                         mnPrioAutoHint;
     FtFontInfo*                 mpFontInfo;
     FT_Int                      mnLoadFlags;
     double                      mfStretch;
diff -ru vcl/unx/inc/pspgraphics.h vcl/unx/inc/pspgraphics.h
--- vcl/unx/inc/pspgraphics.h	2006-05-04 08:55:40.000000000 +0100
+++ vcl/unx/inc/pspgraphics.h	2006-05-05 10:41:23.000000000 +0100
@@ -121,6 +121,7 @@
     virtual void			SetTextColor( SalColor nSalColor );
     virtual USHORT          SetFont( ImplFontSelectData*, int nFallbackLevel );
     virtual void			GetFontMetric( ImplFontMetricData* );
+    virtual void                        GetFontHints( const ImplFontAttributes& rFontAttributes, int nSize, ImplFontHints& rFontHints) const;
     virtual ULONG			GetKernPairs( ULONG nPairs, ImplKernPairData* pKernPairs );
     virtual ImplFontCharMap* GetImplFontCharMap() const;
     virtual void			GetDevFontList( ImplDevFontList* );
diff -ru vcl/unx/inc/salgdi.h vcl/unx/inc/salgdi.h
--- vcl/unx/inc/salgdi.h	2006-05-04 08:55:40.000000000 +0100
+++ vcl/unx/inc/salgdi.h	2006-05-05 10:41:12.000000000 +0100
@@ -238,6 +238,7 @@
     virtual void			SetTextColor( SalColor nSalColor );
     virtual USHORT         SetFont( ImplFontSelectData*, int nFallbackLevel );
     virtual void			GetFontMetric( ImplFontMetricData* );
+    virtual void                        GetFontHints( const ImplFontAttributes& rFontAttributes, int nSize, ImplFontHints& rFontHints) const;
     virtual ULONG			GetKernPairs( ULONG nPairs, ImplKernPairData* pKernPairs );
     virtual ImplFontCharMap* GetImplFontCharMap() const;
     virtual void			GetDevFontList( ImplDevFontList* );
diff -ru vcl/unx/source/gdi/pspgraphics.cxx vcl/unx/source/gdi/pspgraphics.cxx
--- vcl/unx/source/gdi/pspgraphics.cxx	2006-05-04 08:55:40.000000000 +0100
+++ vcl/unx/source/gdi/pspgraphics.cxx	2006-05-05 10:28:18.000000000 +0100
@@ -862,6 +862,10 @@
     }
 }
 
+void PspGraphics::GetFontHints( const ImplFontAttributes& rFontAttributes, int nSize, ImplFontHints& rFontHints) const
+{
+}
+
 void PspGraphics::GetFontMetric( ImplFontMetricData *pMetric )
 {
     const psp::PrintFontManager& rMgr = psp::PrintFontManager::get();
@@ -1230,32 +1234,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;
-    }
-
     // special case for the ghostscript fonts
     if( aDFA.maName.CompareIgnoreCaseToAscii( "itc ", 4 ) == COMPARE_EQUAL )
         aDFA.maName = aDFA.maName.Copy( 4 );
diff -ru vcl/unx/source/gdi/salgdi3.cxx vcl/unx/source/gdi/salgdi3.cxx
--- vcl/unx/source/gdi/salgdi3.cxx	2006-05-04 08:55:40.000000000 +0100
+++ vcl/unx/source/gdi/salgdi3.cxx	2006-05-05 10:30:18.000000000 +0100
@@ -1367,6 +1367,174 @@
 
 // ----------------------------------------------------------------------------
 
+void X11SalGraphics::GetFontHints( const ImplFontAttributes& rFontAttributes, int nSize, ImplFontHints& rFontHints) const
+{
+    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;
+    }
+
+    psp::FontConfigHints aHints(psp::PrintFontManager::get().getFontConfigHints(aInfo, nSize));
+
+    switch (aHints.m_eEmbeddedbitmap)
+    {
+        default: 
+            rFontHints.meEmbeddedBitmap = EMBEDDEDBITMAP_DONTKNOW;
+            break;
+        case psp::fcstatus::istrue: 
+            rFontHints.meEmbeddedBitmap = EMBEDDEDBITMAP_TRUE;
+            break;
+        case psp::fcstatus::isfalse: 
+            rFontHints.meEmbeddedBitmap = EMBEDDEDBITMAP_FALSE;
+            break;
+    }
+
+    switch (aHints.m_eAntialias)
+    {
+        default: 
+            rFontHints.meAntiAlias = ANTIALIAS_DONTKNOW;
+            break;
+        case psp::fcstatus::istrue: 
+            rFontHints.meAntiAlias = ANTIALIAS_TRUE;
+            break;
+        case psp::fcstatus::isfalse: 
+            rFontHints.meAntiAlias = ANTIALIAS_FALSE;
+            break;
+    }
+
+    switch (aHints.m_eAutoHint)
+    {
+        default: 
+            rFontHints.meAutoHint = AUTOHINT_DONTKNOW;
+            break;
+        case psp::fcstatus::istrue: 
+            rFontHints.meAutoHint = AUTOHINT_TRUE;
+            break;
+        case psp::fcstatus::isfalse: 
+            rFontHints.meAutoHint = AUTOHINT_FALSE;
+            break;
+    }
+
+    switch (aHints.m_eHinting)
+    {
+        default: 
+            rFontHints.meHinting = HINTING_DONTKNOW;
+            break;
+        case psp::fcstatus::istrue: 
+            rFontHints.meHinting = HINTING_TRUE;
+            break;
+        case psp::fcstatus::isfalse: 
+            rFontHints.meHinting = HINTING_FALSE;
+            break;
+    }
+
+    switch (aHints.m_eHintStyle)
+    {
+        case psp::fchint::Nohint: 
+            rFontHints.meHintStyle = HINT_NONE;
+            break;
+        case psp::fchint::Slight: 
+            rFontHints.meHintStyle = HINT_SLIGHT;
+            break;
+        case psp::fchint::Medium: 
+            rFontHints.meHintStyle = HINT_MEDIUM;
+            break;
+        default: 
+        case psp::fchint::Full: 
+            rFontHints.meHintStyle = HINT_FULL;
+            break;
+    }
+}
+
+// ----------------------------------------------------------------------------
+
 void
 X11SalGraphics::GetFontMetric( ImplFontMetricData *pMetric )
 {
diff -ru vcl/unx/source/gdi/xlfd_extd.cxx vcl/unx/source/gdi/xlfd_extd.cxx
--- vcl/unx/source/gdi/xlfd_extd.cxx	2006-05-04 08:55:40.000000000 +0100
+++ vcl/unx/source/gdi/xlfd_extd.cxx	2006-05-04 14:51:52.000000000 +0100
@@ -114,9 +114,6 @@
     mbSubsettable  = false;
     mbEmbeddable   = false;
 
-    meEmbeddedBitmap = EMBEDDEDBITMAP_DONTKNOW;
-    meAntiAlias = ANTIALIAS_DONTKNOW;
-
     mnQuality      = -1;
 }
 
diff -ru vcl/win/inc/salgdi.h vcl/win/inc/salgdi.h
--- vcl/win/inc/salgdi.h	2006-05-04 08:55:40.000000000 +0100
+++ vcl/win/inc/salgdi.h	2006-05-05 10:40:44.000000000 +0100
@@ -270,6 +270,7 @@
     virtual USHORT         SetFont( ImplFontSelectData*, int nFallbackLevel );
     // get the current font's etrics
     virtual void			GetFontMetric( ImplFontMetricData* );
+    virtual void                        GetFontHints( const ImplFontAttributes& rFontAttributes, int nHints, ImplFontHints& rFontHints);
     // get kernign pairs of the current font
     // return only PairCount if (pKernPairs == NULL)
     virtual ULONG			GetKernPairs( ULONG nPairs, ImplKernPairData* pKernPairs );
diff -ru vcl/win/source/gdi/salgdi3.cxx vcl/win/source/gdi/salgdi3.cxx
--- vcl/win/source/gdi/salgdi3.cxx	2006-05-04 08:55:40.000000000 +0100
+++ vcl/win/source/gdi/salgdi3.cxx	2006-05-05 10:40:47.000000000 +0100
@@ -1250,6 +1250,12 @@
 
 // -----------------------------------------------------------------------
 
+void WinSalGraphics::GetFontHints( const ImplFontAttributes& rFontAttributes, int nSize, ImplFontHints& rFontHints)
+{
+}
+
+// -----------------------------------------------------------------------
+
 void WinSalGraphics::GetFontMetric( ImplFontMetricData* pMetric )
 {
     if ( aSalShlData.mbWNT )
diff -ru psprint/inc/psprint/fontmanager.hxx psprint/inc/psprint/fontmanager.hxx
--- psprint/inc/psprint/fontmanager.hxx	2006-05-08 16:00:09.000000000 -0400
+++ psprint/inc/psprint/fontmanager.hxx	2006-05-08 16:01:09.000000000 -0400
@@ -155,6 +155,33 @@
 };
 }
 
+namespace fchint
+{
+enum type {
+    Nohint = 0,
+    Slight = 1,
+    Medium = 2,
+    Full = 3
+};
+}
+
+struct FontConfigHints
+{
+    fcstatus::type m_eEmbeddedbitmap;
+    fcstatus::type m_eAntialias;
+    fcstatus::type m_eAutoHint;
+    fcstatus::type m_eHinting;
+    fchint::type m_eHintStyle;
+
+    FontConfigHints() :
+        m_eEmbeddedbitmap( fcstatus::isunset ),
+        m_eAntialias( fcstatus::isunset ),
+        m_eAutoHint( fcstatus::isunset ),
+        m_eHinting( fcstatus::isunset ),
+        m_eHintStyle( fchint::Full )
+        {}
+};
+
 /*
  *  the difference between FastPrintFontInfo and PrintFontInfo
  *  is that the information in FastPrintFontInfo can usually
@@ -180,8 +207,6 @@
     weight::type            			m_eWeight;
     pitch::type             			m_ePitch;
     rtl_TextEncoding        			m_aEncoding;
-    fcstatus::type                      m_eEmbeddedbitmap;
-    fcstatus::type                      m_eAntialias;
 
     FastPrintFontInfo() :
             m_nID( 0 ),
@@ -191,9 +216,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 )
     {}
 };
 
@@ -308,9 +331,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;
 
@@ -726,6 +746,7 @@
     false else
      */
     bool matchFont( FastPrintFontInfo& rInfo, const com::sun::star::lang::Locale& rLocale );
+    FontConfigHints getFontConfigHints(const FastPrintFontInfo& rInfo, int nSize);
 
     String Substitute(const std::vector<String> &rNames, const std::vector<sal_Unicode> &rGlyphs, 
         const ByteString &rLangAttrib, italic::type eItalic, weight::type eWeight, 
diff -ru psprint/source/fontmanager/fontcache.cxx psprint/source/fontmanager/fontcache.cxx
--- psprint/source/fontmanager/fontcache.cxx	2006-05-08 16:00:10.000000000 -0400
+++ psprint/source/fontmanager/fontcache.cxx	2006-05-08 16:00:32.000000000 -0400
@@ -220,9 +220,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 )
                 {
@@ -432,9 +432,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 )
                 {
@@ -564,8 +561,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;
 }
 
 /*
@@ -627,9 +622,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 -ru psprint/source/fontmanager/fontconfig.cxx psprint/source/fontmanager/fontconfig.cxx
--- psprint/source/fontmanager/fontconfig.cxx	2006-05-08 16:00:10.000000000 -0400
+++ psprint/source/fontmanager/fontconfig.cxx	2006-05-08 16:03:34.000000000 -0400
@@ -106,6 +106,7 @@
     FcPattern*		(*m_pFcFontSetMatch)(FcConfig*,FcFontSet**, int, FcPattern*,FcResult*);    
     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*);
@@ -194,6 +195,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 )
@@ -279,6 +282,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 *))
@@ -308,6 +313,7 @@
             m_pFcDefaultSubstitute			&&
             m_pFcConfigSubstitute			&&
             m_pFcPatternAddInteger			&&
+            m_pFcPatternAddDouble                     &&
             m_pFcPatternAddCharSet			&&
             m_pFcPatternAddBool 			&&
             m_pFcPatternAddString
@@ -410,7 +416,7 @@
             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	      = rWrapper.FcPatternGetString( pFSet->fonts[i], FC_FAMILY, 0, &family );
@@ -420,8 +426,6 @@
             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;
@@ -559,15 +563,6 @@
                 {
                     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 );
@@ -751,6 +746,78 @@
     return aName;
 }
 
+#ifdef ENABLE_FONTCONFIG
+static void lcl_InfoToPattern( const FastPrintFontInfo& rInfo, FontCfgWrapper& rWrapper, FcPattern* pPattern )
+{
+    OString aFamily = OUStringToOString( rInfo.m_aFamilyName, RTL_TEXTENCODING_UTF8 );
+    if( aFamily.getLength() )
+        rWrapper.FcPatternAddString( pPattern, FC_FAMILY, (FcChar8*)aFamily.getStr() );
+
+    addtopattern(rWrapper, pPattern, rInfo.m_eItalic, rInfo.m_eWeight, rInfo.m_eWidth, rInfo.m_ePitch);
+
+}
+#endif
+
+
+FontConfigHints PrintFontManager::getFontConfigHints( const FastPrintFontInfo& rInfo, int nSize)
+{
+    FontConfigHints aHints;
+#ifdef ENABLE_FONTCONFIG
+    FontCfgWrapper& rWrapper = FontCfgWrapper::get();
+    if( ! rWrapper.isValid() )
+        return aHints;
+
+    FcConfig* pConfig = rWrapper.getDefConfig();
+    FcPattern* pPattern = rWrapper.FcPatternCreate();
+
+    lcl_InfoToPattern( rInfo, rWrapper, pPattern );
+    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 );
+    rWrapper.FcDefaultSubstitute( pPattern );
+    FcResult eEmbeddedBitmap = rWrapper.FcPatternGetBool( pPattern, FC_EMBEDDED_BITMAP, 0, &embitmap );
+    FcResult eAntialias = rWrapper.FcPatternGetBool( pPattern, FC_ANTIALIAS, 0, &antialias );
+    FcResult eAutoHint = rWrapper.FcPatternGetBool( pPattern, FC_AUTOHINT, 0, &autohint );
+    FcResult eHinting = rWrapper.FcPatternGetBool( pPattern, FC_HINTING, 0, &hinting );
+    FcResult eHintStyle = rWrapper.FcPatternGetInteger( pPattern, FC_HINT_STYLE, 0, &hintstyle );
+    rWrapper.FcPatternDestroy(pPattern);
+ 
+    if( eEmbeddedBitmap == FcResultMatch )
+        aHints.m_eEmbeddedbitmap = embitmap ? fcstatus::istrue : fcstatus::isfalse;
+    if( eAntialias == FcResultMatch )
+        aHints.m_eAntialias = antialias ? fcstatus::istrue : fcstatus::isfalse;
+    if( eAutoHint == FcResultMatch )
+        aHints.m_eAutoHint = autohint ? fcstatus::istrue : fcstatus::isfalse;
+    if( eHinting == FcResultMatch )
+        aHints.m_eHinting = hinting ? fcstatus::istrue : fcstatus::isfalse;
+    if (eHintStyle != FcResultMatch)
+        aHints.m_eHintStyle = fchint::Full;
+    else
+    {
+        switch (hintstyle)
+        {
+            case FC_HINT_NONE:
+                aHints.m_eHintStyle = fchint::Nohint;
+                break;
+            case FC_HINT_SLIGHT:
+                aHints.m_eHintStyle = fchint::Slight;
+                break;
+            case FC_HINT_MEDIUM:
+                aHints.m_eHintStyle = fchint::Medium;
+                break;
+            case FC_HINT_FULL:
+            default:
+                aHints.m_eHintStyle = fchint::Full;
+                break;
+        }
+    }
+#endif
+    return aHints;
+}
+
 bool PrintFontManager::matchFont( FastPrintFontInfo& rInfo, const com::sun::star::lang::Locale& rLocale )
 {
 #ifdef ENABLE_FONTCONFIG
@@ -777,11 +843,7 @@
     if( aLangAttrib.getLength() )
         rWrapper.FcPatternAddString( pPattern, FC_LANG, (FcChar8*)aLangAttrib.getStr() );
 
-    OString aFamily = OUStringToOString( rInfo.m_aFamilyName, RTL_TEXTENCODING_UTF8 );
-    if( aFamily.getLength() )
-        rWrapper.FcPatternAddString( pPattern, FC_FAMILY, (FcChar8*)aFamily.getStr() );
-
-    addtopattern(rWrapper, pPattern, rInfo.m_eItalic, rInfo.m_eWeight, rInfo.m_eWidth, rInfo.m_ePitch);
+    lcl_InfoToPattern( rInfo, rWrapper, pPattern );
 
     rWrapper.FcConfigSubstitute( pConfig, pPattern, FcMatchPattern );
     rWrapper.FcDefaultSubstitute( pPattern );
diff -ru psprint/source/fontmanager/fontmanager.cxx psprint/source/fontmanager/fontmanager.cxx
--- psprint/source/fontmanager/fontmanager.cxx	2006-05-08 16:00:10.000000000 -0400
+++ psprint/source/fontmanager/fontmanager.cxx	2006-05-08 16:00:32.000000000 -0400
@@ -379,9 +379,7 @@
         m_nYMax( 0 ),
         m_bHaveVerticalSubstitutedGlyphs( false ),
         m_bUserOverride( false ),
-  		m_bCJKSupport( false ), 
-        m_eEmbeddedbitmap( fcstatus::isunset ),
-        m_eAntialias( fcstatus::isunset )
+  		m_bCJKSupport( false ) 
 {
 }
 
@@ -2594,8 +2592,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_aAliases.clear();
     for( ::std::list< int >::iterator it = pFont->m_aAliases.begin(); it != pFont->m_aAliases.end(); ++it )
         rInfo.m_aAliases.push_back( m_pAtoms->getString( ATOM_FAMILYNAME, *it ) );
@@ -4002,8 +4002,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;
