[vlc-commits] Freetype: fontconfig simplification
Jean-Baptiste Kempf
git at videolan.org
Fri Mar 25 00:14:56 CET 2011
vlc | branch: master | Jean-Baptiste Kempf <jb at videolan.org> | Thu Mar 24 23:58:10 2011 +0100| [231a967145083b2e31d615e2ecd2896e27595e4d] | committer: Jean-Baptiste Kempf
Freetype: fontconfig simplification
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=231a967145083b2e31d615e2ecd2896e27595e4d
---
modules/misc/freetype.c | 97 +++++++++++-----------------------------------
1 files changed, 23 insertions(+), 74 deletions(-)
diff --git a/modules/misc/freetype.c b/modules/misc/freetype.c
index c7c1299..2f58ba2 100644
--- a/modules/misc/freetype.c
+++ b/modules/misc/freetype.c
@@ -200,10 +200,9 @@ static int RenderHtml( filter_t *, subpicture_region_t *,
subpicture_region_t * );
#endif
#ifdef HAVE_FONTCONFIG
+static void FontConfig_BuildCache( filter_t * );
static char *FontConfig_Select( FcConfig *, const char *,
- bool, bool, int * );
-
-static int FontConfig_FindFont( filter_t *, char *, char **, int * );
+ bool, bool, int, int * );
#endif
@@ -352,11 +351,17 @@ static int Create( vlc_object_t *p_this )
/* Set the font file */
fontindex = 0;
#ifdef HAVE_FONTCONFIG
- if( FontConfig_FindFont( p_filter, psz_fontfamily, &psz_fontfile, &fontindex )
- != VLC_SUCCESS )
- psz_fontfile = psz_fontfamily;
+ FontConfig_BuildCache( p_filter );
+
+ /* */
+ psz_fontfile = FontConfig_Select( NULL, psz_fontfamily, false, false,
+ p_sys->i_default_font_size, &fontindex );
+
+ p_sys->psz_fontfamily = psz_fontfamily;
+ msg_Dbg( p_filter, "Using %s as font from file %s", psz_fontfamily, psz_fontfile );
+ if( !psz_fontfile )
#else
- psz_fontfile = psz_fontfamily;
+ psz_fontfile = psz_fontfamily;
#endif
/* */
@@ -1859,6 +1864,7 @@ static int ProcessLines( filter_t *p_filter,
p_style->psz_fontname,
p_style->b_bold,
p_style->b_italic,
+ -1,
&i_idx );
#else
#error FIXME
@@ -2224,74 +2230,11 @@ static void FontConfig_BuildCache( filter_t *p_filter )
#endif
}
-/**
- * \brief Returns the path of a font matching a fontfamily, using Fc
- ***/
-static int FontConfig_FindFont( filter_t *p_filter, char *psz_fontfamily,
- char **psz_fontfile, int *fontindex )
-{
- filter_sys_t *p_sys = p_filter->p_sys;
-
- FcPattern *fontpattern = NULL, *fontmatch = NULL;
- /* Initialise result to Match, as fontconfig doesnt
- * really set this other than some error-cases */
- FcResult fontresult = FcResultMatch;
-
- FontConfig_BuildCache( p_filter );
-
- /* Lets find some fontfile from freetype-font variable family */
- char *psz_fontsize;
- if( asprintf( &psz_fontsize, "%d", p_sys->i_default_font_size ) == -1 )
- goto error;
-
- fontpattern = FcPatternCreate();
- if( !fontpattern ) return VLC_EGENERIC;
-
- FcPatternAddString( fontpattern, FC_FAMILY, (const FcChar8 *)psz_fontfamily );
- FcPatternAddString( fontpattern, FC_SIZE, (const FcChar8 *)psz_fontsize );
-
- if( FcConfigSubstitute( NULL, fontpattern, FcMatchPattern ) == FcFalse )
- {
- msg_Err( p_filter, "FontSubstitute failed");
- goto error;
- }
- FcDefaultSubstitute( fontpattern );
-
- /* testing fontresult here doesn't do any good really, but maybe it will
- * in future as fontconfig code doesn't set it in all cases and just
- * returns NULL or doesn't set to to Match on all Match cases.*/
- fontmatch = FcFontMatch( NULL, fontpattern, &fontresult );
- if( !fontmatch || fontresult == FcResultNoMatch )
- {
- msg_Err( p_filter, "Fontmatching failed");
- goto error;
- }
-
- FcPatternGetString( fontmatch, FC_FILE, 0, psz_fontfile);
- FcPatternGetInteger( fontmatch, FC_INDEX, 0, fontindex );
- if( !psz_fontfile )
- {
- msg_Err( p_filter, "Failed to get fontfile");
- goto error;
- }
-
- msg_Dbg( p_filter, "Using %s as font from file %s", psz_fontfamily,
- *psz_fontfile ? *psz_fontfile : "(null)" );
- p_sys->psz_fontfamily = strdup( psz_fontfamily );
-
- return VLC_SUCCESS;
-
-error:
- if( fontmatch ) FcPatternDestroy( fontmatch );
- if( fontpattern ) FcPatternDestroy( fontpattern );
- return VLC_EGENERIC;
-}
-
/***
* \brief Selects a font matching family, bold, italic provided
***/
static char* FontConfig_Select( FcConfig* config, const char* family,
- bool b_bold, bool b_italic, int *i_idx )
+ bool b_bold, bool b_italic, int i_size, int *i_idx )
{
FcResult result = FcResultMatch;
FcPattern *pat, *p_pat;
@@ -2302,14 +2245,20 @@ static char* FontConfig_Select( FcConfig* config, const char* family,
pat = FcPatternCreate();
if (!pat) return NULL;
+ /* */
FcPatternAddString( pat, FC_FAMILY, (const FcChar8*)family );
FcPatternAddBool( pat, FC_OUTLINE, FcTrue );
FcPatternAddInteger( pat, FC_SLANT, b_italic ? FC_SLANT_ITALIC : FC_SLANT_ROMAN );
FcPatternAddInteger( pat, FC_WEIGHT, b_bold ? FC_WEIGHT_EXTRABOLD : FC_WEIGHT_NORMAL );
+ if( i_size != -1 )
+ {
+ char *psz_fontsize;
+ if( asprintf( &psz_fontsize, "%d", i_size ) != -1 )
+ FcPatternAddString( pat, FC_SIZE, (const FcChar8 *)psz_fontsize );
+ }
+ /* */
FcDefaultSubstitute( pat );
-
- /* Replace the config (or current config) with the new pattern */
if( !FcConfigSubstitute( config, pat, FcMatchPattern ) )
{
FcPatternDestroy( pat );
@@ -2319,7 +2268,7 @@ static char* FontConfig_Select( FcConfig* config, const char* family,
/* Find the best font for the pattern, destroy the pattern */
p_pat = FcFontMatch( config, pat, &result );
FcPatternDestroy( pat );
- if( !p_pat ) return NULL;
+ if( !p_pat || result == FcResultNoMatch ) return NULL;
/* Check the new pattern */
if( ( FcResultMatch != FcPatternGetBool( p_pat, FC_OUTLINE, 0, &val_b ) )
More information about the vlc-commits
mailing list