parent
d5dd6b036a
commit
53e2e18c8e
@ -0,0 +1,91 @@
|
||||
From cc8f350a5829405832af1177fd32de7c41c30724 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
|
||||
Date: Wed, 16 Mar 2011 14:18:42 +0000
|
||||
Subject: [PATCH] Related: rhbz#680460 don't bother with an interim FontSet
|
||||
|
||||
I can't see why bother adding it to a FontSet and then
|
||||
throw away the fontset, why not just use the pattern
|
||||
directly and throw it away afterwards directly.
|
||||
---
|
||||
vcl/unx/source/fontmanager/fontconfig.cxx | 63 +++++++++++++----------------
|
||||
1 files changed, 28 insertions(+), 35 deletions(-)
|
||||
|
||||
diff --git a/vcl/unx/source/fontmanager/fontconfig.cxx b/vcl/unx/source/fontmanager/fontconfig.cxx
|
||||
index 3c2f636..92632c7 100644
|
||||
--- a/vcl/unx/source/fontmanager/fontconfig.cxx
|
||||
+++ b/vcl/unx/source/fontmanager/fontconfig.cxx
|
||||
@@ -1130,43 +1130,36 @@ ImplFontOptions* PrintFontManager::getFontOptions(
|
||||
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(pResult,
|
||||
+ FC_EMBEDDED_BITMAP, 0, &embitmap);
|
||||
+ FcResult eAntialias = rWrapper.FcPatternGetBool(pResult,
|
||||
+ FC_ANTIALIAS, 0, &antialias);
|
||||
+ FcResult eAutoHint = rWrapper.FcPatternGetBool(pResult,
|
||||
+ FC_AUTOHINT, 0, &autohint);
|
||||
+ FcResult eHinting = rWrapper.FcPatternGetBool(pResult,
|
||||
+ FC_HINTING, 0, &hinting);
|
||||
+ /*FcResult eHintStyle =*/ rWrapper.FcPatternGetInteger(pResult,
|
||||
+ FC_HINT_STYLE, 0, &hintstyle);
|
||||
+ rWrapper.FcPatternDestroy(pResult);
|
||||
+
|
||||
+ pOptions = new ImplFontOptions;
|
||||
+
|
||||
+ if( eEmbeddedBitmap == FcResultMatch )
|
||||
+ pOptions->meEmbeddedBitmap = embitmap ? EMBEDDEDBITMAP_TRUE : EMBEDDEDBITMAP_FALSE;
|
||||
+ if( eAntialias == FcResultMatch )
|
||||
+ pOptions->meAntiAlias = antialias ? ANTIALIAS_TRUE : ANTIALIAS_FALSE;
|
||||
+ if( eAutoHint == FcResultMatch )
|
||||
+ pOptions->meAutoHint = autohint ? AUTOHINT_TRUE : AUTOHINT_FALSE;
|
||||
+ if( eHinting == FcResultMatch )
|
||||
+ pOptions->meHinting = hinting ? HINTING_TRUE : HINTING_FALSE;
|
||||
+ switch (hintstyle)
|
||||
{
|
||||
- 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);
|
||||
-
|
||||
- pOptions = new ImplFontOptions;
|
||||
-
|
||||
- if( eEmbeddedBitmap == FcResultMatch )
|
||||
- pOptions->meEmbeddedBitmap = embitmap ? EMBEDDEDBITMAP_TRUE : EMBEDDEDBITMAP_FALSE;
|
||||
- if( eAntialias == FcResultMatch )
|
||||
- pOptions->meAntiAlias = antialias ? ANTIALIAS_TRUE : ANTIALIAS_FALSE;
|
||||
- if( eAutoHint == FcResultMatch )
|
||||
- pOptions->meAutoHint = autohint ? AUTOHINT_TRUE : AUTOHINT_FALSE;
|
||||
- if( eHinting == FcResultMatch )
|
||||
- pOptions->meHinting = hinting ? HINTING_TRUE : HINTING_FALSE;
|
||||
- switch (hintstyle)
|
||||
- {
|
||||
- case FC_HINT_NONE: pOptions->meHintStyle = HINT_NONE; break;
|
||||
- case FC_HINT_SLIGHT: pOptions->meHintStyle = HINT_SLIGHT; break;
|
||||
- case FC_HINT_MEDIUM: pOptions->meHintStyle = HINT_MEDIUM; break;
|
||||
- default: // fall through
|
||||
- case FC_HINT_FULL: pOptions->meHintStyle = HINT_FULL; break;
|
||||
- }
|
||||
+ case FC_HINT_NONE: pOptions->meHintStyle = HINT_NONE; break;
|
||||
+ case FC_HINT_SLIGHT: pOptions->meHintStyle = HINT_SLIGHT; break;
|
||||
+ case FC_HINT_MEDIUM: pOptions->meHintStyle = HINT_MEDIUM; break;
|
||||
+ default: // fall through
|
||||
+ case FC_HINT_FULL: pOptions->meHintStyle = HINT_FULL; break;
|
||||
}
|
||||
- // info: destroying the pSet destroys pResult implicitly
|
||||
- // since pResult was "added" to pSet
|
||||
- rWrapper.FcFontSetDestroy( pSet );
|
||||
}
|
||||
|
||||
// cleanup
|
||||
--
|
||||
1.7.4.1
|
||||
|
@ -0,0 +1,320 @@
|
||||
From d83bc4d9921afd31f1afddc52f39951bb686e60a Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
|
||||
Date: Thu, 10 Mar 2011 15:59:44 +0000
|
||||
Subject: [PATCH] Related: rhbz#680460 reorganize this to make it inheritable
|
||||
|
||||
---
|
||||
vcl/inc/vcl/fontmanager.hxx | 2 +-
|
||||
vcl/inc/vcl/glyphcache.hxx | 5 +--
|
||||
vcl/inc/vcl/impfont.hxx | 25 ++++++++++-----------
|
||||
vcl/source/glyphs/gcach_ftyp.cxx | 18 ++++++++++-----
|
||||
vcl/source/glyphs/gcach_ftyp.hxx | 4 ++-
|
||||
vcl/source/glyphs/glyphcache.cxx | 3 +-
|
||||
vcl/unx/source/fontmanager/fontconfig.cxx | 32 ++++++++++++++--------------
|
||||
vcl/unx/source/gdi/salgdi3.cxx | 17 ++++++---------
|
||||
8 files changed, 55 insertions(+), 51 deletions(-)
|
||||
|
||||
diff --git a/vcl/inc/vcl/fontmanager.hxx b/vcl/inc/vcl/fontmanager.hxx
|
||||
index 6c76eea..103cd92 100644
|
||||
--- a/vcl/inc/vcl/fontmanager.hxx
|
||||
+++ b/vcl/inc/vcl/fontmanager.hxx
|
||||
@@ -733,7 +733,7 @@ public:
|
||||
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;
|
||||
+ ImplFontOptions* getFontOptions( const FastPrintFontInfo&, int nSize, void (*subcallback)(void*)) const;
|
||||
|
||||
rtl::OUString Substitute( const rtl::OUString& rFontName, rtl::OUString& rMissingCodes,
|
||||
const rtl::OString& rLangAttrib, italic::type& rItalic, weight::type& rWeight,
|
||||
diff --git a/vcl/inc/vcl/glyphcache.hxx b/vcl/inc/vcl/glyphcache.hxx
|
||||
index 8714697..1c03759 100644
|
||||
--- a/vcl/inc/vcl/glyphcache.hxx
|
||||
+++ b/vcl/inc/vcl/glyphcache.hxx
|
||||
@@ -187,7 +187,7 @@ public:
|
||||
virtual bool TestFont() const { return true; }
|
||||
virtual void* GetFtFace() const { return 0; }
|
||||
virtual int GetLoadFlags() const { return 0; }
|
||||
- virtual void SetFontOptions( const ImplFontOptions&) {}
|
||||
+ virtual void SetFontOptions( const ImplFontOptions*) {}
|
||||
virtual bool NeedsArtificialBold() const { return false; }
|
||||
virtual bool NeedsArtificialItalic() const { return false; }
|
||||
|
||||
@@ -266,9 +266,8 @@ class VCL_DLLPUBLIC ImplServerFontEntry : public ImplFontEntry
|
||||
{
|
||||
private:
|
||||
ServerFont* mpServerFont;
|
||||
- ImplFontOptions maFontOptions;
|
||||
+ ImplFontOptions* mpFontOptions;
|
||||
bool mbGotFontOptions;
|
||||
- bool mbValidFontOptions;
|
||||
|
||||
public:
|
||||
ImplServerFontEntry( ImplFontSelectData& );
|
||||
diff --git a/vcl/inc/vcl/impfont.hxx b/vcl/inc/vcl/impfont.hxx
|
||||
index b7a0368..fa8a837 100644
|
||||
--- a/vcl/inc/vcl/impfont.hxx
|
||||
+++ b/vcl/inc/vcl/impfont.hxx
|
||||
@@ -135,7 +135,7 @@ public:
|
||||
};
|
||||
|
||||
// ------------------
|
||||
-// - ImplFontHints -
|
||||
+// - ImplFontOptions -
|
||||
// ------------------
|
||||
|
||||
class ImplFontOptions
|
||||
@@ -154,19 +154,18 @@ public:
|
||||
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)
|
||||
+ virtual ~ImplFontOptions()
|
||||
{}
|
||||
- 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); }
|
||||
+ 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); }
|
||||
};
|
||||
|
||||
// -------------------
|
||||
diff --git a/vcl/source/glyphs/gcach_ftyp.cxx b/vcl/source/glyphs/gcach_ftyp.cxx
|
||||
index 2db53a5..2236bad 100644
|
||||
--- a/vcl/source/glyphs/gcach_ftyp.cxx
|
||||
+++ b/vcl/source/glyphs/gcach_ftyp.cxx
|
||||
@@ -768,6 +768,7 @@ FreetypeServerFont::FreetypeServerFont( const ImplFontSelectData& rFSD, FtFontIn
|
||||
mpFontInfo( pFI ),
|
||||
maFaceFT( NULL ),
|
||||
maSizeFT( NULL ),
|
||||
+ mpFontOptions( NULL ),
|
||||
mbFaceOk( false ),
|
||||
maRecodeConverter( NULL ),
|
||||
mpLayoutEngine( NULL )
|
||||
@@ -913,9 +914,14 @@ FreetypeServerFont::FreetypeServerFont( const ImplFontSelectData& rFSD, FtFontIn
|
||||
mnLoadFlags |= FT_LOAD_NO_BITMAP;
|
||||
}
|
||||
|
||||
-void FreetypeServerFont::SetFontOptions( const ImplFontOptions& rFontOptions)
|
||||
+void FreetypeServerFont::SetFontOptions( const ImplFontOptions* pFontOptions)
|
||||
{
|
||||
- FontAutoHint eHint = rFontOptions.GetUseAutoHint();
|
||||
+ mpFontOptions = pFontOptions;
|
||||
+
|
||||
+ if (!mpFontOptions)
|
||||
+ return;
|
||||
+
|
||||
+ FontAutoHint eHint = mpFontOptions->GetUseAutoHint();
|
||||
if( eHint == AUTOHINT_DONTKNOW )
|
||||
eHint = mbUseGamma ? AUTOHINT_TRUE : AUTOHINT_FALSE;
|
||||
|
||||
@@ -926,11 +932,11 @@ void FreetypeServerFont::SetFontOptions( const ImplFontOptions& rFontOptions)
|
||||
mnLoadFlags |= FT_LOAD_NO_HINTING;
|
||||
mnLoadFlags |= FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH; //#88334#
|
||||
|
||||
- if( rFontOptions.DontUseAntiAlias() )
|
||||
+ if( mpFontOptions->DontUseAntiAlias() )
|
||||
mnPrioAntiAlias = 0;
|
||||
- if( rFontOptions.DontUseEmbeddedBitmaps() )
|
||||
+ if( mpFontOptions->DontUseEmbeddedBitmaps() )
|
||||
mnPrioEmbedded = 0;
|
||||
- if( rFontOptions.DontUseHinting() )
|
||||
+ if( mpFontOptions->DontUseHinting() )
|
||||
mnPrioAutoHint = 0;
|
||||
|
||||
#if (FTVERSION >= 2005) || defined(TT_CONFIG_OPTION_BYTECODE_INTERPRETER)
|
||||
@@ -942,7 +948,7 @@ void FreetypeServerFont::SetFontOptions( const ImplFontOptions& rFontOptions)
|
||||
if( !(mnLoadFlags & FT_LOAD_NO_HINTING) && (nFTVERSION >= 2103))
|
||||
{
|
||||
mnLoadFlags |= FT_LOAD_TARGET_NORMAL;
|
||||
- switch( rFontOptions.GetHintStyle() )
|
||||
+ switch( mpFontOptions->GetHintStyle() )
|
||||
{
|
||||
case HINT_NONE:
|
||||
mnLoadFlags |= FT_LOAD_NO_HINTING;
|
||||
diff --git a/vcl/source/glyphs/gcach_ftyp.hxx b/vcl/source/glyphs/gcach_ftyp.hxx
|
||||
index cf2284c..6069388 100644
|
||||
--- a/vcl/source/glyphs/gcach_ftyp.hxx
|
||||
+++ b/vcl/source/glyphs/gcach_ftyp.hxx
|
||||
@@ -186,7 +186,7 @@ public:
|
||||
virtual int GetFontFaceNum() const { return mpFontInfo->GetFaceNum(); }
|
||||
virtual bool TestFont() const;
|
||||
virtual void* GetFtFace() const;
|
||||
- virtual void SetFontOptions( const ImplFontOptions&);
|
||||
+ 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; }
|
||||
@@ -233,6 +233,8 @@ private:
|
||||
FT_FaceRec_* maFaceFT;
|
||||
FT_SizeRec_* maSizeFT;
|
||||
|
||||
+ const ImplFontOptions* mpFontOptions;
|
||||
+
|
||||
bool mbFaceOk;
|
||||
bool mbArtItalic;
|
||||
bool mbArtBold;
|
||||
diff --git a/vcl/source/glyphs/glyphcache.cxx b/vcl/source/glyphs/glyphcache.cxx
|
||||
index 8ad5a87..9668a50 100644
|
||||
--- a/vcl/source/glyphs/glyphcache.cxx
|
||||
+++ b/vcl/source/glyphs/glyphcache.cxx
|
||||
@@ -522,8 +522,8 @@ bool ServerFont::IsGlyphInvisible( int nGlyphIndex )
|
||||
ImplServerFontEntry::ImplServerFontEntry( ImplFontSelectData& rFSD )
|
||||
: ImplFontEntry( rFSD )
|
||||
, mpServerFont( NULL )
|
||||
+, mpFontOptions( NULL )
|
||||
, mbGotFontOptions( false )
|
||||
-, mbValidFontOptions( false )
|
||||
{}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
@@ -531,6 +531,7 @@ ImplServerFontEntry::ImplServerFontEntry( ImplFontSelectData& rFSD )
|
||||
ImplServerFontEntry::~ImplServerFontEntry()
|
||||
{
|
||||
// TODO: remove the ServerFont here instead of in the GlyphCache
|
||||
+ delete mpFontOptions;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
diff --git a/vcl/unx/source/fontmanager/fontconfig.cxx b/vcl/unx/source/fontmanager/fontconfig.cxx
|
||||
index 0dd5260..3c2f636 100644
|
||||
--- a/vcl/unx/source/fontmanager/fontconfig.cxx
|
||||
+++ b/vcl/unx/source/fontmanager/fontconfig.cxx
|
||||
@@ -1093,17 +1093,17 @@ rtl::OUString PrintFontManager::Substitute(const rtl::OUString& rFontName,
|
||||
return aName;
|
||||
}
|
||||
|
||||
-bool PrintFontManager::getFontOptions(
|
||||
- const FastPrintFontInfo& rInfo, int nSize, void (*subcallback)(void*),
|
||||
- ImplFontOptions& rOptions) const
|
||||
+ImplFontOptions* PrintFontManager::getFontOptions(
|
||||
+ const FastPrintFontInfo& rInfo, int nSize, void (*subcallback)(void*)) const
|
||||
{
|
||||
#ifndef ENABLE_FONTCONFIG
|
||||
- return false;
|
||||
+ return NULL;
|
||||
#else // ENABLE_FONTCONFIG
|
||||
FontCfgWrapper& rWrapper = FontCfgWrapper::get();
|
||||
if( ! rWrapper.isValid() )
|
||||
- return false;
|
||||
+ return NULL;
|
||||
|
||||
+ ImplFontOptions *pOptions = NULL;
|
||||
FcConfig* pConfig = rWrapper.FcConfigGetCurrent();
|
||||
FcPattern* pPattern = rWrapper.FcPatternCreate();
|
||||
|
||||
@@ -1144,22 +1144,24 @@ bool PrintFontManager::getFontOptions(
|
||||
FC_HINTING, 0, &hinting);
|
||||
/*FcResult eHintStyle =*/ rWrapper.FcPatternGetInteger( pSet->fonts[0],
|
||||
FC_HINT_STYLE, 0, &hintstyle);
|
||||
+
|
||||
+ pOptions = new ImplFontOptions;
|
||||
|
||||
if( eEmbeddedBitmap == FcResultMatch )
|
||||
- rOptions.meEmbeddedBitmap = embitmap ? EMBEDDEDBITMAP_TRUE : EMBEDDEDBITMAP_FALSE;
|
||||
+ pOptions->meEmbeddedBitmap = embitmap ? EMBEDDEDBITMAP_TRUE : EMBEDDEDBITMAP_FALSE;
|
||||
if( eAntialias == FcResultMatch )
|
||||
- rOptions.meAntiAlias = antialias ? ANTIALIAS_TRUE : ANTIALIAS_FALSE;
|
||||
+ pOptions->meAntiAlias = antialias ? ANTIALIAS_TRUE : ANTIALIAS_FALSE;
|
||||
if( eAutoHint == FcResultMatch )
|
||||
- rOptions.meAutoHint = autohint ? AUTOHINT_TRUE : AUTOHINT_FALSE;
|
||||
+ pOptions->meAutoHint = autohint ? AUTOHINT_TRUE : AUTOHINT_FALSE;
|
||||
if( eHinting == FcResultMatch )
|
||||
- rOptions.meHinting = hinting ? HINTING_TRUE : HINTING_FALSE;
|
||||
+ pOptions->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;
|
||||
+ case FC_HINT_NONE: pOptions->meHintStyle = HINT_NONE; break;
|
||||
+ case FC_HINT_SLIGHT: pOptions->meHintStyle = HINT_SLIGHT; break;
|
||||
+ case FC_HINT_MEDIUM: pOptions->meHintStyle = HINT_MEDIUM; break;
|
||||
default: // fall through
|
||||
- case FC_HINT_FULL: rOptions.meHintStyle = HINT_FULL; break;
|
||||
+ case FC_HINT_FULL: pOptions->meHintStyle = HINT_FULL; break;
|
||||
}
|
||||
}
|
||||
// info: destroying the pSet destroys pResult implicitly
|
||||
@@ -1170,9 +1172,7 @@ bool PrintFontManager::getFontOptions(
|
||||
// cleanup
|
||||
rWrapper.FcPatternDestroy( pPattern );
|
||||
|
||||
- // TODO: return true only if non-default font options are set
|
||||
- const bool bOK = (pResult != NULL);
|
||||
- return bOK;
|
||||
+ return pOptions;
|
||||
#endif
|
||||
}
|
||||
|
||||
diff --git a/vcl/unx/source/gdi/salgdi3.cxx b/vcl/unx/source/gdi/salgdi3.cxx
|
||||
index 9834028..6de93fe 100644
|
||||
--- a/vcl/unx/source/gdi/salgdi3.cxx
|
||||
+++ b/vcl/unx/source/gdi/salgdi3.cxx
|
||||
@@ -632,22 +632,21 @@ bool X11SalGraphics::setFont( const ImplFontSelectData *pEntry, int nFallbackLev
|
||||
return false;
|
||||
}
|
||||
|
||||
+ImplFontOptions* GetFCFontOptions( const ImplFontAttributes& rFontAttributes, int nSize);
|
||||
+
|
||||
void ImplServerFontEntry::HandleFontOptions( void )
|
||||
{
|
||||
- bool GetFCFontOptions( const ImplFontAttributes&, int nSize, ImplFontOptions& );
|
||||
-
|
||||
if( !mpServerFont )
|
||||
return;
|
||||
if( !mbGotFontOptions )
|
||||
{
|
||||
// get and cache the font options
|
||||
mbGotFontOptions = true;
|
||||
- mbValidFontOptions = GetFCFontOptions( *maFontSelData.mpFontData,
|
||||
- maFontSelData.mnHeight, maFontOptions );
|
||||
+ mpFontOptions = GetFCFontOptions( *maFontSelData.mpFontData,
|
||||
+ maFontSelData.mnHeight );
|
||||
}
|
||||
// apply the font options
|
||||
- if( mbValidFontOptions )
|
||||
- mpServerFont->SetFontOptions( maFontOptions );
|
||||
+ mpServerFont->SetFontOptions( mpFontOptions );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
@@ -1636,8 +1635,7 @@ void cairosubcallback( void* pPattern )
|
||||
rCairo.ft_font_options_substitute( pFontOptions, pPattern );
|
||||
}
|
||||
|
||||
-bool GetFCFontOptions( const ImplFontAttributes& rFontAttributes, int nSize,
|
||||
- ImplFontOptions& rFontOptions)
|
||||
+ImplFontOptions* GetFCFontOptions( const ImplFontAttributes& rFontAttributes, int nSize)
|
||||
{
|
||||
// TODO: get rid of these insane enum-conversions
|
||||
// e.g. by using the classic vclenum values inside VCL
|
||||
@@ -1734,8 +1732,7 @@ bool GetFCFontOptions( const ImplFontAttributes& rFontAttributes, int nSize,
|
||||
}
|
||||
|
||||
const psp::PrintFontManager& rPFM = psp::PrintFontManager::get();
|
||||
- bool bOK = rPFM.getFontOptions( aInfo, nSize, cairosubcallback, rFontOptions);
|
||||
- return bOK;
|
||||
+ return rPFM.getFontOptions(aInfo, nSize, cairosubcallback);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
--
|
||||
1.7.4.1
|
||||
|
@ -0,0 +1,226 @@
|
||||
From 5aab60551b825b3ad283f19263f3ce549c725055 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
|
||||
Date: Wed, 16 Mar 2011 15:47:14 +0000
|
||||
Subject: [PATCH] Resolves: rhbz#680460 honour lcdfilter, subpixeling etc.
|
||||
|
||||
---
|
||||
vcl/inc/vcl/glyphcache.hxx | 1 +
|
||||
vcl/inc/vcl/impfont.hxx | 2 +
|
||||
vcl/source/glyphs/gcach_ftyp.cxx | 5 +++
|
||||
vcl/source/glyphs/gcach_ftyp.hxx | 1 +
|
||||
vcl/unx/source/fontmanager/fontconfig.cxx | 41 +++++++++++++++++++++++++---
|
||||
vcl/unx/source/gdi/salgdi3.cxx | 20 ++++++++++----
|
||||
6 files changed, 59 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/vcl/inc/vcl/glyphcache.hxx b/vcl/inc/vcl/glyphcache.hxx
|
||||
index 1c03759..035fd5c 100644
|
||||
--- a/vcl/inc/vcl/glyphcache.hxx
|
||||
+++ b/vcl/inc/vcl/glyphcache.hxx
|
||||
@@ -188,6 +188,7 @@ public:
|
||||
virtual void* GetFtFace() const { return 0; }
|
||||
virtual int GetLoadFlags() const { return 0; }
|
||||
virtual void SetFontOptions( const ImplFontOptions*) {}
|
||||
+ virtual const ImplFontOptions* GetFontOptions() const { return 0; }
|
||||
virtual bool NeedsArtificialBold() const { return false; }
|
||||
virtual bool NeedsArtificialItalic() const { return false; }
|
||||
|
||||
diff --git a/vcl/inc/vcl/impfont.hxx b/vcl/inc/vcl/impfont.hxx
|
||||
index fa8a837..ed9c35c 100644
|
||||
--- a/vcl/inc/vcl/impfont.hxx
|
||||
+++ b/vcl/inc/vcl/impfont.hxx
|
||||
@@ -166,6 +166,8 @@ public:
|
||||
{ return meAntiAlias == ANTIALIAS_FALSE; }
|
||||
bool DontUseHinting() const
|
||||
{ return (meHinting == HINTING_FALSE) || (GetHintStyle() == HINT_NONE); }
|
||||
+ virtual void *GetPattern(void * /*pFace*/) const
|
||||
+ { return NULL; }
|
||||
};
|
||||
|
||||
// -------------------
|
||||
diff --git a/vcl/source/glyphs/gcach_ftyp.cxx b/vcl/source/glyphs/gcach_ftyp.cxx
|
||||
index a6a13da..8c46009 100644
|
||||
--- a/vcl/source/glyphs/gcach_ftyp.cxx
|
||||
+++ b/vcl/source/glyphs/gcach_ftyp.cxx
|
||||
@@ -967,6 +967,11 @@ void FreetypeServerFont::SetFontOptions( const ImplFontOptions* pFontOptions)
|
||||
mnLoadFlags |= FT_LOAD_NO_BITMAP;
|
||||
}
|
||||
|
||||
+const ImplFontOptions* FreetypeServerFont::GetFontOptions() const
|
||||
+{
|
||||
+ return mpFontOptions;
|
||||
+}
|
||||
+
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
bool FreetypeServerFont::TestFont() const
|
||||
diff --git a/vcl/source/glyphs/gcach_ftyp.hxx b/vcl/source/glyphs/gcach_ftyp.hxx
|
||||
index 6069388..1df8253 100644
|
||||
--- a/vcl/source/glyphs/gcach_ftyp.hxx
|
||||
+++ b/vcl/source/glyphs/gcach_ftyp.hxx
|
||||
@@ -187,6 +187,7 @@ public:
|
||||
virtual bool TestFont() const;
|
||||
virtual void* GetFtFace() const;
|
||||
virtual void SetFontOptions( const ImplFontOptions*);
|
||||
+ virtual const ImplFontOptions* GetFontOptions() const;
|
||||
virtual int GetLoadFlags() const { return (mnLoadFlags & ~FT_LOAD_IGNORE_TRANSFORM); }
|
||||
virtual bool NeedsArtificialBold() const { return mbArtBold; }
|
||||
virtual bool NeedsArtificialItalic() const { return mbArtItalic; }
|
||||
diff --git a/vcl/unx/source/fontmanager/fontconfig.cxx b/vcl/unx/source/fontmanager/fontconfig.cxx
|
||||
index 92632c7..7b792d3 100644
|
||||
--- a/vcl/unx/source/fontmanager/fontconfig.cxx
|
||||
+++ b/vcl/unx/source/fontmanager/fontconfig.cxx
|
||||
@@ -56,6 +56,9 @@ using namespace psp;
|
||||
#define FC_HINT_MEDIUM 2
|
||||
#define FC_HINT_FULL 3
|
||||
#endif
|
||||
+ #ifndef FC_FT_FACE
|
||||
+ #define FC_FT_FACE "ftface"
|
||||
+ #endif
|
||||
#else
|
||||
typedef void FcConfig;
|
||||
typedef void FcObjectSet;
|
||||
@@ -141,6 +144,7 @@ class FontCfgWrapper
|
||||
FcBool (*m_pFcPatternAddCharSet)(FcPattern*,const char*,const FcCharSet*);
|
||||
FcBool (*m_pFcPatternAddString)(FcPattern*,const char*,const FcChar8*);
|
||||
FT_UInt (*m_pFcFreeTypeCharIndex)(FT_Face,FcChar32);
|
||||
+ FcBool (*m_pFcPatternAddFTFace)(FcPattern*,const char*,const FT_Face);
|
||||
|
||||
oslGenericFunction loadSymbol( const char* );
|
||||
void addFontSet( FcSetName );
|
||||
@@ -257,10 +261,14 @@ public:
|
||||
{ return m_pFcPatternAddBool( pPattern, pObject, nValue ); }
|
||||
FcBool FcPatternAddCharSet(FcPattern* pPattern,const char* pObject,const FcCharSet*pCharSet)
|
||||
{ return m_pFcPatternAddCharSet(pPattern,pObject,pCharSet); }
|
||||
-
|
||||
FT_UInt FcFreeTypeCharIndex( FT_Face face, FcChar32 ucs4 )
|
||||
{ return m_pFcFreeTypeCharIndex ? m_pFcFreeTypeCharIndex( face, ucs4 ) : 0; }
|
||||
-
|
||||
+ FcBool FcPatternAddFTFace( FcPattern* pPattern, const char* pObject, const FT_Face nValue )
|
||||
+ {
|
||||
+ return m_pFcPatternAddFTFace
|
||||
+ ? m_pFcPatternAddFTFace( pPattern, pObject, nValue )
|
||||
+ : false;
|
||||
+ }
|
||||
public:
|
||||
FcResult LocalizedElementFromPattern(FcPattern* pPattern, FcChar8 **family,
|
||||
const char *elementtype, const char *elementlangtype);
|
||||
@@ -372,6 +380,8 @@ FontCfgWrapper::FontCfgWrapper()
|
||||
loadSymbol( "FcPatternAddString" );
|
||||
m_pFcFreeTypeCharIndex = (FT_UInt(*)(FT_Face,FcChar32))
|
||||
loadSymbol( "FcFreeTypeCharIndex" );
|
||||
+ m_pFcPatternAddFTFace = (FcBool(*)(FcPattern*,const char*,const FT_Face))
|
||||
+ loadSymbol( "FcPatternAddFTFace" );
|
||||
|
||||
m_nFcVersion = FcGetVersion();
|
||||
#if (OSL_DEBUG_LEVEL > 1)
|
||||
@@ -1093,6 +1103,26 @@ rtl::OUString PrintFontManager::Substitute(const rtl::OUString& rFontName,
|
||||
return aName;
|
||||
}
|
||||
|
||||
+class FontConfigFontOptions : public ImplFontOptions
|
||||
+{
|
||||
+public:
|
||||
+ FontConfigFontOptions() : mpPattern(0) {}
|
||||
+ ~FontConfigFontOptions()
|
||||
+ {
|
||||
+ FontCfgWrapper& rWrapper = FontCfgWrapper::get();
|
||||
+ if( rWrapper.isValid() )
|
||||
+ rWrapper.FcPatternDestroy( mpPattern );
|
||||
+ }
|
||||
+ virtual void *GetPattern(void * face) const
|
||||
+ {
|
||||
+ FontCfgWrapper& rWrapper = FontCfgWrapper::get();
|
||||
+ if( rWrapper.isValid() )
|
||||
+ rWrapper.FcPatternAddFTFace(mpPattern, FC_FT_FACE, static_cast<FT_Face>(face));
|
||||
+ return mpPattern;
|
||||
+ }
|
||||
+ FcPattern* mpPattern;
|
||||
+};
|
||||
+
|
||||
ImplFontOptions* PrintFontManager::getFontOptions(
|
||||
const FastPrintFontInfo& rInfo, int nSize, void (*subcallback)(void*)) const
|
||||
{
|
||||
@@ -1103,7 +1133,7 @@ ImplFontOptions* PrintFontManager::getFontOptions(
|
||||
if( ! rWrapper.isValid() )
|
||||
return NULL;
|
||||
|
||||
- ImplFontOptions *pOptions = NULL;
|
||||
+ FontConfigFontOptions* pOptions = NULL;
|
||||
FcConfig* pConfig = rWrapper.FcConfigGetCurrent();
|
||||
FcPattern* pPattern = rWrapper.FcPatternCreate();
|
||||
|
||||
@@ -1140,9 +1170,10 @@ ImplFontOptions* PrintFontManager::getFontOptions(
|
||||
FC_HINTING, 0, &hinting);
|
||||
/*FcResult eHintStyle =*/ rWrapper.FcPatternGetInteger(pResult,
|
||||
FC_HINT_STYLE, 0, &hintstyle);
|
||||
- rWrapper.FcPatternDestroy(pResult);
|
||||
|
||||
- pOptions = new ImplFontOptions;
|
||||
+ pOptions = new FontConfigFontOptions;
|
||||
+
|
||||
+ pOptions->mpPattern = pResult;
|
||||
|
||||
if( eEmbeddedBitmap == FcResultMatch )
|
||||
pOptions->meEmbeddedBitmap = embitmap ? EMBEDDEDBITMAP_TRUE : EMBEDDEDBITMAP_FALSE;
|
||||
diff --git a/vcl/unx/source/gdi/salgdi3.cxx b/vcl/unx/source/gdi/salgdi3.cxx
|
||||
index 6de93fe..a0bef90 100644
|
||||
--- a/vcl/unx/source/gdi/salgdi3.cxx
|
||||
+++ b/vcl/unx/source/gdi/salgdi3.cxx
|
||||
@@ -89,7 +89,6 @@ struct cairo_surface_t;
|
||||
struct cairo_t;
|
||||
struct cairo_font_face_t;
|
||||
typedef void* FT_Face;
|
||||
-typedef void* FcPattern;
|
||||
struct cairo_matrix_t {
|
||||
double xx; double yx;
|
||||
double xy; double yy;
|
||||
@@ -742,7 +741,7 @@ private:
|
||||
void (*mp_clip)(cairo_t*);
|
||||
void (*mp_rectangle)(cairo_t*, double, double, double, double);
|
||||
cairo_font_face_t * (*mp_ft_font_face_create_for_ft_face)(FT_Face, int);
|
||||
- cairo_font_face_t * (*mp_ft_font_face_create_for_pattern)(FcPattern*);
|
||||
+ cairo_font_face_t * (*mp_ft_font_face_create_for_pattern)(void*);
|
||||
void (*mp_set_font_face)(cairo_t *, cairo_font_face_t *);
|
||||
void (*mp_font_face_destroy)(cairo_font_face_t *);
|
||||
void (*mp_matrix_init_identity)(cairo_matrix_t *);
|
||||
@@ -772,8 +771,12 @@ public:
|
||||
{ (*mp_rectangle)(cr, x, y, width, height); }
|
||||
cairo_font_face_t* ft_font_face_create_for_ft_face(FT_Face face, int load_flags)
|
||||
{ return (*mp_ft_font_face_create_for_ft_face)(face, load_flags); }
|
||||
- cairo_font_face_t* ft_font_face_create_for_pattern(FcPattern *pattern)
|
||||
- { return (*mp_ft_font_face_create_for_pattern)(pattern); }
|
||||
+ cairo_font_face_t* ft_font_face_create_for_pattern(void *pattern)
|
||||
+ {
|
||||
+ return mp_ft_font_face_create_for_pattern
|
||||
+ ? (*mp_ft_font_face_create_for_pattern)(pattern)
|
||||
+ : NULL;
|
||||
+ }
|
||||
void set_font_face(cairo_t *cr, cairo_font_face_t *font_face)
|
||||
{ (*mp_set_font_face)(cr, font_face); }
|
||||
void font_face_destroy(cairo_font_face_t *font_face)
|
||||
@@ -847,7 +850,7 @@ CairoWrapper::CairoWrapper()
|
||||
osl_getAsciiFunctionSymbol( mpCairoLib, "cairo_rectangle" );
|
||||
mp_ft_font_face_create_for_ft_face = (cairo_font_face_t * (*)(FT_Face, int))
|
||||
osl_getAsciiFunctionSymbol( mpCairoLib, "cairo_ft_font_face_create_for_ft_face" );
|
||||
- mp_ft_font_face_create_for_pattern = (cairo_font_face_t * (*)(FcPattern*))
|
||||
+ mp_ft_font_face_create_for_pattern = (cairo_font_face_t * (*)(void*))
|
||||
osl_getAsciiFunctionSymbol( mpCairoLib, "cairo_ft_font_face_create_for_pattern" );
|
||||
mp_set_font_face = (void (*)(cairo_t *, cairo_font_face_t *))
|
||||
osl_getAsciiFunctionSymbol( mpCairoLib, "cairo_set_font_face" );
|
||||
@@ -1016,7 +1019,12 @@ void X11SalGraphics::DrawCairoAAFontString( const ServerFontLayout& rLayout )
|
||||
font_face = (cairo_font_face_t*)m_aCairoFontsCache.FindCachedFont(pId);
|
||||
if (!font_face)
|
||||
{
|
||||
- font_face = rCairo.ft_font_face_create_for_ft_face(pId, rFont.GetLoadFlags());
|
||||
+ const ImplFontOptions *pOptions = rFont.GetFontOptions();
|
||||
+ void *pPattern = pOptions ? pOptions->GetPattern(pId) : NULL;
|
||||
+ if (pPattern)
|
||||
+ font_face = rCairo.ft_font_face_create_for_pattern(pPattern);
|
||||
+ if (!font_face)
|
||||
+ font_face = rCairo.ft_font_face_create_for_ft_face(pId, rFont.GetLoadFlags());
|
||||
m_aCairoFontsCache.CacheFont(font_face, pId);
|
||||
}
|
||||
|
||||
--
|
||||
1.7.4.1
|
||||
|
@ -0,0 +1,50 @@
|
||||
From 28e6caab0a9c04b306f723fb3390332f5ef94a61 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
|
||||
Date: Thu, 10 Mar 2011 13:54:58 +0000
|
||||
Subject: [PATCH] add cairo_ft_font_face_create_for_pattern wrapper
|
||||
|
||||
---
|
||||
vcl/unx/source/gdi/salgdi3.cxx | 6 ++++++
|
||||
1 files changed, 6 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/vcl/unx/source/gdi/salgdi3.cxx b/vcl/unx/source/gdi/salgdi3.cxx
|
||||
index 3056f92..9834028 100644
|
||||
--- a/vcl/unx/source/gdi/salgdi3.cxx
|
||||
+++ b/vcl/unx/source/gdi/salgdi3.cxx
|
||||
@@ -89,6 +89,7 @@ struct cairo_surface_t;
|
||||
struct cairo_t;
|
||||
struct cairo_font_face_t;
|
||||
typedef void* FT_Face;
|
||||
+typedef void* FcPattern;
|
||||
struct cairo_matrix_t {
|
||||
double xx; double yx;
|
||||
double xy; double yy;
|
||||
@@ -742,6 +743,7 @@ private:
|
||||
void (*mp_clip)(cairo_t*);
|
||||
void (*mp_rectangle)(cairo_t*, double, double, double, double);
|
||||
cairo_font_face_t * (*mp_ft_font_face_create_for_ft_face)(FT_Face, int);
|
||||
+ cairo_font_face_t * (*mp_ft_font_face_create_for_pattern)(FcPattern*);
|
||||
void (*mp_set_font_face)(cairo_t *, cairo_font_face_t *);
|
||||
void (*mp_font_face_destroy)(cairo_font_face_t *);
|
||||
void (*mp_matrix_init_identity)(cairo_matrix_t *);
|
||||
@@ -771,6 +773,8 @@ public:
|
||||
{ (*mp_rectangle)(cr, x, y, width, height); }
|
||||
cairo_font_face_t* ft_font_face_create_for_ft_face(FT_Face face, int load_flags)
|
||||
{ return (*mp_ft_font_face_create_for_ft_face)(face, load_flags); }
|
||||
+ cairo_font_face_t* ft_font_face_create_for_pattern(FcPattern *pattern)
|
||||
+ { return (*mp_ft_font_face_create_for_pattern)(pattern); }
|
||||
void set_font_face(cairo_t *cr, cairo_font_face_t *font_face)
|
||||
{ (*mp_set_font_face)(cr, font_face); }
|
||||
void font_face_destroy(cairo_font_face_t *font_face)
|
||||
@@ -844,6 +848,8 @@ CairoWrapper::CairoWrapper()
|
||||
osl_getAsciiFunctionSymbol( mpCairoLib, "cairo_rectangle" );
|
||||
mp_ft_font_face_create_for_ft_face = (cairo_font_face_t * (*)(FT_Face, int))
|
||||
osl_getAsciiFunctionSymbol( mpCairoLib, "cairo_ft_font_face_create_for_ft_face" );
|
||||
+ mp_ft_font_face_create_for_pattern = (cairo_font_face_t * (*)(FcPattern*))
|
||||
+ osl_getAsciiFunctionSymbol( mpCairoLib, "cairo_ft_font_face_create_for_pattern" );
|
||||
mp_set_font_face = (void (*)(cairo_t *, cairo_font_face_t *))
|
||||
osl_getAsciiFunctionSymbol( mpCairoLib, "cairo_set_font_face" );
|
||||
mp_font_face_destroy = (void (*)(cairo_font_face_t *))
|
||||
--
|
||||
1.7.4.1
|
||||
|
Loading…
Reference in new issue