diff -ru vcl/inc/impfont.hxx vcl/inc/impfont.hxx --- openoffice.org.orig/vcl/inc/impfont.hxx 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/vcl/inc/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 --- openoffice.org.orig/vcl/inc/outdev.hxx 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/vcl/inc/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 --- openoffice.org.orig/vcl/inc/outfont.hxx 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/vcl/inc/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 --- openoffice.org.orig/vcl/inc/salgdi.hxx 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/vcl/inc/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 --- openoffice.org.orig/vcl/inc/vclenum.hxx 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/vcl/inc/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 --- openoffice.org.orig/vcl/source/gdi/outdev3.cxx 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/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 --- openoffice.org.orig/vcl/source/glyphs/gcach_ftyp.cxx 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/vcl/source/glyphs/gcach_ftyp.cxx 2006-05-05 10:26:37.000000000 +0100 @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -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 --- openoffice.org.orig/vcl/source/glyphs/gcach_ftyp.hxx 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/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 --- openoffice.org.orig/vcl/unx/inc/pspgraphics.h 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/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 --- openoffice.org.orig/vcl/unx/inc/salgdi.h 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/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 --- openoffice.org.orig/vcl/unx/source/gdi/pspgraphics.cxx 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/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 --- openoffice.org.orig/vcl/unx/source/gdi/salgdi3.cxx 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/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 --- openoffice.org.orig/vcl/unx/source/gdi/xlfd_extd.cxx 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/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 --- openoffice.org.orig/vcl/win/inc/salgdi.h 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/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 --- openoffice.org.orig/vcl/win/source/gdi/salgdi3.cxx 2006-05-04 08:55:40.000000000 +0100 +++ openoffice.org/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 --- openoffice.org.orig/psprint/inc/psprint/fontmanager.hxx 2006-05-08 16:00:09.000000000 -0400 +++ openoffice.org/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 &rNames, const std::vector &rGlyphs, const ByteString &rLangAttrib, italic::type eItalic, weight::type eWeight, diff -ru psprint/source/fontmanager/fontcache.cxx psprint/source/fontmanager/fontcache.cxx --- openoffice.org.orig/psprint/source/fontmanager/fontcache.cxx 2006-05-08 16:00:10.000000000 -0400 +++ openoffice.org/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 --- openoffice.org.orig/psprint/source/fontmanager/fontconfig.cxx 2006-05-08 16:00:10.000000000 -0400 +++ openoffice.org/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,77 @@ 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, FcMatchFont ); + 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 ); + + 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 --- openoffice.org.orig/psprint/source/fontmanager/fontmanager.cxx 2006-05-08 16:00:10.000000000 -0400 +++ openoffice.org/psprint/source/fontmanager/fontmanager.cxx 2006-05-08 16:00:32.000000000 -0400 @@ -379,9 +379,7 @@ m_nXMax( 0 ), m_nYMax( 0 ), m_bHaveVerticalSubstitutedGlyphs( false ), - m_bUserOverride( false ), - m_eEmbeddedbitmap( fcstatus::isunset ), - m_eAntialias( fcstatus::isunset ) + m_bUserOverride( 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 ) );