Commit b4ca71dd authored by Jean-Baptiste Kempf's avatar Jean-Baptiste Kempf

Win32: do not use fontconfig anymore

This has probably been the most hated thing of 1.1.x, I believe.
I had to do something...
Yes, there might be issues, and leaks. Please complain ASAP to me.
parent 9acbca06
...@@ -10,19 +10,23 @@ Mac OS X Interface: ...@@ -10,19 +10,23 @@ Mac OS X Interface:
Audio output: Audio output:
* PulseAudio output re-written due to unstability of the current one * PulseAudio output re-written due to unstability of the current one
* Pulseaudio and dummy audio outputs
Win32 port:
* Remove the fontconfig dependency from the freetype module
Miscellaneous fixes in: Miscellaneous fixes in:
* Windows 7 taskbar buttons * Windows 7 taskbar buttons
* Qt interface * Qt interface
* Pulseaudio and dummy audio outputs * asx, live555, dvdnav demuxer
* Asx, live555, dvdnav demuxer
* RTP output and XML export * RTP output and XML export
* Subtitles colours when using GPU decoding on Windows * Subtitles colours when using GPU decoding on Windows
* v4l2 access
Translations: Translations:
* Update of Norwegian Bokmål, Slovak, Afrikaans, Luganda, * Update of Norwegian Bokmål, Slovak, Afrikaans, Luganda,
Brazillian Portuguese, Irish, Thai, Estonian, Chinese, Polish, Brazillian Portuguese, Irish, Thai, Estonian, Chinese, Polish,
Dutch, German, Galician, Bulgarian and Japanese translations Dutch, German, Galician, Bulgarian, Lithuanian and Japanese translations
* Initial Basque, Zulu, Peul, Amharic, Acoli, Chiga translations * Initial Basque, Zulu, Peul, Amharic, Acoli, Chiga translations
......
...@@ -3449,7 +3449,7 @@ then ...@@ -3449,7 +3449,7 @@ then
have_freetype=yes have_freetype=yes
VLC_ADD_CPPFLAGS([freetype skins2],[${FREETYPE_CFLAGS}]) VLC_ADD_CPPFLAGS([freetype skins2],[${FREETYPE_CFLAGS}])
if test "${SYS}" = "mingw32"; then if test "${SYS}" = "mingw32"; then
VLC_ADD_LIBS([freetype],[-liconv -lz]) VLC_ADD_LIBS([freetype],[-liconv -lz -lgdi32])
fi fi
VLC_ADD_LIBS([freetype skins2],[${FREETYPE_LIBS}]) VLC_ADD_LIBS([freetype skins2],[${FREETYPE_LIBS}])
if test "${enable_fontconfig}" != "no" if test "${enable_fontconfig}" != "no"
......
...@@ -34,11 +34,12 @@ ...@@ -34,11 +34,12 @@
#include <vlc_common.h> #include <vlc_common.h>
#include <vlc_plugin.h> #include <vlc_plugin.h>
#include <vlc_osd.h> #include <vlc_osd.h>
#include <vlc_stream.h> #include <vlc_stream.h> /* stream_MemoryNew */
#include <vlc_input.h> #include <vlc_input.h> /* vlc_input_attachment_* */
#include <vlc_xml.h> #include <vlc_xml.h> /* xml_reader */
#include <vlc_strings.h> #include <vlc_strings.h> /* resolve_xml_special_chars */
#include <vlc_dialog.h> #include <vlc_charset.h> /* ToCharset */
#include <vlc_dialog.h> /* FcCache dialog */
/* Default fonts */ /* Default fonts */
#ifdef __APPLE__ #ifdef __APPLE__
...@@ -68,15 +69,26 @@ ...@@ -68,15 +69,26 @@
#define FT_MulFix(v, s) (((v)*(s))>>16) #define FT_MulFix(v, s) (((v)*(s))>>16)
#endif #endif
/* RTL */
#if defined(HAVE_FRIBIDI) #if defined(HAVE_FRIBIDI)
#include <fribidi/fribidi.h> # include <fribidi/fribidi.h>
#endif #endif
/* Win32 GDI */
#ifdef WIN32
# define _WIN32_IE 0x0500
# include <windows.h>
# include <shlobj.h>
# define HAVE_STYLES
# undef HAVE_FONTCONFIG
#endif
/* FontConfig */
#ifdef HAVE_FONTCONFIG #ifdef HAVE_FONTCONFIG
#include <fontconfig/fontconfig.h> # include <fontconfig/fontconfig.h>
#undef DEFAULT_FONT_FILE # undef DEFAULT_FONT_FILE
#define DEFAULT_FONT_FILE DEFAULT_FAMILY # define DEFAULT_FONT_FILE DEFAULT_FAMILY
#define HAVE_STYLES # define HAVE_STYLES
#endif #endif
#include <assert.h> #include <assert.h>
...@@ -128,10 +140,10 @@ enum { EFFECT_BACKGROUND = 1, ...@@ -128,10 +140,10 @@ enum { EFFECT_BACKGROUND = 1,
EFFECT_OUTLINE = 2, EFFECT_OUTLINE = 2,
EFFECT_OUTLINE_FAT = 3, EFFECT_OUTLINE_FAT = 3,
}; };
static int const pi_effects[] = { EFFECT_BACKGROUND, EFFECT_OUTLINE, EFFECT_OUTLINE_FAT }; static int const pi_effects[] = { EFFECT_BACKGROUND, EFFECT_OUTLINE, EFFECT_OUTLINE_FAT };
static const char *const ppsz_effects_text[] = { static const char *const ppsz_effects_text[] = {
N_("Background"),N_("Outline"), N_("Fat Outline") }; N_("Background"),N_("Outline"), N_("Fat Outline") };
static const int pi_color_values[] = { static const int pi_color_values[] = {
0x00000000, 0x00808080, 0x00C0C0C0, 0x00FFFFFF, 0x00800000, 0x00000000, 0x00808080, 0x00C0C0C0, 0x00FFFFFF, 0x00800000,
0x00FF0000, 0x00FF00FF, 0x00FFFF00, 0x00808000, 0x00008000, 0x00008080, 0x00FF0000, 0x00FF00FF, 0x00FFFF00, 0x00808000, 0x00008000, 0x00008080,
...@@ -184,7 +196,6 @@ vlc_module_begin () ...@@ -184,7 +196,6 @@ vlc_module_begin ()
vlc_module_end () vlc_module_end ()
/***************************************************************************** /*****************************************************************************
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
...@@ -192,6 +203,7 @@ vlc_module_end () ...@@ -192,6 +203,7 @@ vlc_module_end ()
/* The RenderText call maps to pf_render_string, defined in vlc_filter.h */ /* The RenderText call maps to pf_render_string, defined in vlc_filter.h */
static int RenderText( filter_t *, subpicture_region_t *, static int RenderText( filter_t *, subpicture_region_t *,
subpicture_region_t * ); subpicture_region_t * );
#ifdef HAVE_STYLES #ifdef HAVE_STYLES
static int RenderHtml( filter_t *, subpicture_region_t *, static int RenderHtml( filter_t *, subpicture_region_t *,
subpicture_region_t * ); subpicture_region_t * );
...@@ -201,7 +213,10 @@ static void FontConfig_BuildCache( filter_t * ); ...@@ -201,7 +213,10 @@ static void FontConfig_BuildCache( filter_t * );
static char* FontConfig_Select( FcConfig *, const char *, static char* FontConfig_Select( FcConfig *, const char *,
bool, bool, int, int * ); bool, bool, int, int * );
#endif #endif
#ifdef WIN32
static char* Win32_Select( filter_t *, const char *,
bool, bool, int, int * );
#endif
static int LoadFontsFromAttachments( filter_t *p_filter ); static int LoadFontsFromAttachments( filter_t *p_filter );
...@@ -264,7 +279,7 @@ struct filter_sys_t ...@@ -264,7 +279,7 @@ struct filter_sys_t
{ {
FT_Library p_library; /* handle to library */ FT_Library p_library; /* handle to library */
FT_Face p_face; /* handle to face object */ FT_Face p_face; /* handle to face object */
bool i_use_kerning; bool i_use_kerning;
uint8_t i_font_opacity; uint8_t i_font_opacity;
int i_font_color; int i_font_color;
int i_font_size; int i_font_size;
...@@ -275,6 +290,9 @@ struct filter_sys_t ...@@ -275,6 +290,9 @@ struct filter_sys_t
#ifdef HAVE_STYLES #ifdef HAVE_STYLES
char* psz_fontfamily; char* psz_fontfamily;
xml_t *p_xml; xml_t *p_xml;
#ifdef WIN32
char* psz_win_fonts_path;
#endif
#endif #endif
input_attachment_t **pp_font_attachments; input_attachment_t **pp_font_attachments;
...@@ -304,7 +322,8 @@ static int Create( vlc_object_t *p_this ) ...@@ -304,7 +322,8 @@ static int Create( vlc_object_t *p_this )
p_filter->p_sys = p_sys = malloc( sizeof( filter_sys_t ) ); p_filter->p_sys = p_sys = malloc( sizeof( filter_sys_t ) );
if( !p_sys ) if( !p_sys )
return VLC_ENOMEM; return VLC_ENOMEM;
#ifdef HAVE_STYLES
#ifdef HAVE_STYLES
p_sys->psz_fontfamily = NULL; p_sys->psz_fontfamily = NULL;
p_sys->p_xml = NULL; p_sys->p_xml = NULL;
#endif #endif
...@@ -324,23 +343,31 @@ static int Create( vlc_object_t *p_this ) ...@@ -324,23 +343,31 @@ static int Create( vlc_object_t *p_this )
p_sys->i_font_color = var_CreateGetInteger( p_filter, "freetype-color" ); p_sys->i_font_color = var_CreateGetInteger( p_filter, "freetype-color" );
p_sys->i_font_color = __MAX( __MIN( p_sys->i_font_color , 0xFFFFFF ), 0 ); p_sys->i_font_color = __MAX( __MIN( p_sys->i_font_color , 0xFFFFFF ), 0 );
fontindex=0; #ifdef WIN32
/* Get Windows Font folder */
wchar_t wdir[MAX_PATH];
if( S_OK != SHGetFolderPathW( NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, wdir ) )
{
GetWindowsDirectoryW( wdir, MAX_PATH );
wcscat( wdir, L"\\fonts" );
}
p_sys->psz_win_fonts_path = FromWide( wdir );
#endif
/* Set default psz_fontfamily */
if( !psz_fontfamily || !*psz_fontfamily ) if( !psz_fontfamily || !*psz_fontfamily )
{ {
free( psz_fontfamily ); free( psz_fontfamily );
#ifdef HAVE_STYLES #ifdef HAVE_STYLES
psz_fontfamily = strdup( DEFAULT_FONT_FILE ); psz_fontfamily = strdup( DEFAULT_FAMILY );
#else #else
psz_fontfamily = (char *)malloc( PATH_MAX + 1 );
if( !psz_fontfamily )
goto error;
# ifdef WIN32 # ifdef WIN32
GetWindowsDirectory( psz_fontfamily , PATH_MAX + 1 ); if( asprintf( &psz_fontfamily, "%s"DEFAULT_FONT_FILE, p_sys->psz_win_fonts_path ) == -1 )
strcat( psz_fontfamily, "\\fonts\\arial.ttf" ); goto error;
# else # else
strcpy( psz_fontfamily, DEFAULT_FONT_FILE ); psz_fontfamily = strdup( DEFAULT_FONT_FILE );
# endif # endif
msg_Err( p_filter,"User didn't specify fontfile, using %s", psz_fontfamily); msg_Err( p_filter,"User specified an empty fontfile, using %s", psz_fontfamily );
#endif #endif
} }
...@@ -350,8 +377,11 @@ static int Create( vlc_object_t *p_this ) ...@@ -350,8 +377,11 @@ static int Create( vlc_object_t *p_this )
psz_fontfile = FontConfig_Select( NULL, psz_fontfamily, false, false, psz_fontfile = FontConfig_Select( NULL, psz_fontfamily, false, false,
p_sys->i_default_font_size, &fontindex ); p_sys->i_default_font_size, &fontindex );
#endif #elif defined(WIN32)
psz_fontfile = Win32_Select( p_filter, psz_fontfamily, false, false,
p_sys->i_default_font_size, &fontindex );
#endif
msg_Dbg( p_filter, "Using %s as font from file %s", psz_fontfamily, psz_fontfile ); msg_Dbg( p_filter, "Using %s as font from file %s", psz_fontfamily, psz_fontfile );
p_sys->psz_fontfamily = strdup( psz_fontfamily ); p_sys->psz_fontfamily = strdup( psz_fontfamily );
...@@ -1920,12 +1950,23 @@ static int ProcessLines( filter_t *p_filter, ...@@ -1920,12 +1950,23 @@ static int ProcessLines( filter_t *p_filter,
{ {
char *psz_fontfile = NULL; char *psz_fontfile = NULL;
#ifdef HAVE_FONTCONFIG
psz_fontfile = FontConfig_Select( NULL, psz_fontfile = FontConfig_Select( NULL,
p_style->psz_fontname, p_style->psz_fontname,
p_style->b_bold, p_style->b_bold,
p_style->b_italic, p_style->b_italic,
-1, -1,
&i_idx ); &i_idx );
#elif defined( WIN32 )
psz_fontfile = Win32_Select( p_filter,
p_style->psz_fontname,
p_style->b_bold,
p_style->b_italic,
-1,
&i_idx );
#else
# error FIXME
#endif
if( psz_fontfile && ! *psz_fontfile ) if( psz_fontfile && ! *psz_fontfile )
{ {
msg_Warn( p_filter, "Fontconfig was unable to find a font: \"%s\" %s" msg_Warn( p_filter, "Fontconfig was unable to find a font: \"%s\" %s"
...@@ -2254,6 +2295,93 @@ static int RenderHtml( filter_t *p_filter, subpicture_region_t *p_region_out, ...@@ -2254,6 +2295,93 @@ static int RenderHtml( filter_t *p_filter, subpicture_region_t *p_region_out,
return rv; return rv;
} }
#ifdef WIN32
#define UNICODE
#define FONT_DIR_NT "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"
static int GetFileFontByName( const char *font_name, char **psz_filename )
{
HKEY hKey;
wchar_t vbuffer[MAX_PATH];
wchar_t dbuffer[256];
if( RegOpenKeyEx(HKEY_LOCAL_MACHINE, FONT_DIR_NT, 0, KEY_READ, &hKey) != ERROR_SUCCESS )
return 1;
for( int index = 0;; index++ )
{
DWORD vbuflen = MAX_PATH - 1;
DWORD dbuflen = 255;
if( RegEnumValueW( hKey, index, vbuffer, &vbuflen,
NULL, NULL, (LPBYTE)dbuffer, &dbuflen) != ERROR_SUCCESS )
return 2;
char *psz_value = FromWide( vbuffer );
char *s = strchr( psz_value,'(' );
if( s != NULL && s != psz_value ) s[-1] = '\0';
/* Manage concatenated font names */
if( strchr( psz_value, '&') ) {
if( strcasestr( psz_value, font_name ) != NULL )
break;
}
else {
if( strcasecmp( psz_value, font_name ) == 0 )
break;
}
}
*psz_filename = FromWide( dbuffer );
return 0;
}
static int CALLBACK EnumFontCallback(const ENUMLOGFONTEX *lpelfe, const NEWTEXTMETRICEX *metric,
DWORD type, LPARAM lParam)
{
VLC_UNUSED( metric );
if( (type & RASTER_FONTTYPE) ) return 1;
// if( lpelfe->elfScript ) FIXME
return GetFileFontByName( (const char *)lpelfe->elfFullName, (char **)lParam );
}
static char* Win32_Select( filter_t *p_filter, const char* family,
bool b_bold, bool b_italic, int i_size, int *i_idx )
{
VLC_UNUSED( i_size );
// msg_Dbg( p_filter, "Here in Win32_Select, asking for %s", family );
/* */
LOGFONT lf;
lf.lfCharSet = DEFAULT_CHARSET;
if( b_italic )
lf.lfItalic = true;
if( b_bold )
lf.lfWeight = FW_BOLD;
strncpy( (LPSTR)&lf.lfFaceName, family, 32);
/* */
char *psz_filename = NULL;
HDC hDC = GetDC( NULL );
EnumFontFamiliesEx(hDC, &lf, (FONTENUMPROC)&EnumFontCallback, (LPARAM)&psz_filename, 0);
ReleaseDC(NULL, hDC);
if( psz_filename == NULL )
return NULL;
/* FIXME: increase i_idx, when concatenated strings */
i_idx = 0;
/* */
char *psz_tmp;
if( asprintf( &psz_tmp, "%s\\%s", p_filter->p_sys->psz_win_fonts_path, psz_filename ) == -1 )
return NULL;
return psz_tmp;
}
#endif
#ifdef HAVE_FONTCONFIG #ifdef HAVE_FONTCONFIG
static void FontConfig_BuildCache( filter_t *p_filter ) static void FontConfig_BuildCache( filter_t *p_filter )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment