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