diff options
author | Diego 'Flameeyes' Pettenò <flameeyes@gmail.com> | 2006-09-29 18:36:52 +0000 |
---|---|---|
committer | Diego 'Flameeyes' Pettenò <flameeyes@gmail.com> | 2006-09-29 18:36:52 +0000 |
commit | f658493daeb1b2629b7c561d1f432612219c72d0 (patch) | |
tree | 7aa85836326e3dc6f4699bb3aa13793ec4f99181 | |
parent | d207e3f60b5e10a5950d884d84de5cb49cbf2f32 (diff) | |
download | xine-lib-f658493daeb1b2629b7c561d1f432612219c72d0.tar.gz xine-lib-f658493daeb1b2629b7c561d1f432612219c72d0.tar.bz2 |
Add an optional dependency over fontconfig, so that if present it is used to identify which font to load for OSD and subtitles. This allows to use truetype fonts by specifying their friendly name and just that. Also prefer FreeType2 loaded fonts to bitmap fonts.
CVS patchset: 8321
CVS date: 2006/09/29 18:36:52
-rw-r--r-- | configure.ac | 22 | ||||
-rw-r--r-- | src/xine-engine/Makefile.am | 4 | ||||
-rw-r--r-- | src/xine-engine/osd.c | 208 |
3 files changed, 148 insertions, 86 deletions
diff --git a/configure.ac b/configure.ac index 00a8139aa..3ff1df316 100644 --- a/configure.ac +++ b/configure.ac @@ -1288,7 +1288,7 @@ if test "x$with_freetype" != "xno"; then PKG_CHECK_MODULES([FT2], [freetype2], [have_freetype=yes], [have_freetype=no]) if test "x$with_freetype" = "xyes" && test "x$have_freetype" = "xno"; then AC_MSG_ERROR([FreeType2 support requested but FreeType2 library not found]) - elif test "x$have_freetype" = "yes"; then + elif test "x$have_freetype" = "xyes"; then AC_DEFINE([HAVE_FT2], [1], [Define this if you have freetype2 library]) fi fi @@ -1296,6 +1296,26 @@ AC_SUBST([FT2_CFLAGS]) AC_SUBST([FT2_LIBS]) dnl --------------------------------------------- +dnl fontconfig +dnl --------------------------------------------- +AC_ARG_WITH([fontconfig], + AS_HELP_STRING([--without-fontconfig], [Do not build with fontconfig library])) + +if test "x$with_fontconfig" = "xyes" && test "x$have_fontconfig" = "xno"; then + AC_MSG_ERROR([fontconfig support requested, but FreeType2 not found.]) +elif test "x$with_fontconfig" != "xno" && test "x$have_fontconfig" != "xno"; then + PKG_CHECK_MODULES([FONTCONFIG], [fontconfig], [have_fontconfig=yes], [have_fontconfig=no]) + if test "x$with_fontconfig" = "xyes" && test "x$have_fontconfig" = "xno"; then + AC_MSG_ERROR([fontconfig support requested but fontconfig library not found]) + elif test "x$have_fontconfig" = "xyes"; then + AC_DEFINE([HAVE_FONTCONFIG], [1], [Define this if you have fontconfig library]) + fi +fi +AC_SUBST([FONTCONFIG_CFLAGS]) +AC_SUBST([FONTCONFIG_LIBS]) + + +dnl --------------------------------------------- dnl OSS style audio interface dnl --------------------------------------------- AC_ARG_ENABLE([oss], diff --git a/src/xine-engine/Makefile.am b/src/xine-engine/Makefile.am index 0e702e2d0..bd3c70897 100644 --- a/src/xine-engine/Makefile.am +++ b/src/xine-engine/Makefile.am @@ -1,7 +1,7 @@ include $(top_srcdir)/misc/Makefile.common include $(top_srcdir)/lib/Makefile.common -AM_CFLAGS = $(X_CFLAGS) $(FT2_CFLAGS) $(VISIBILITY_FLAG) +AM_CFLAGS = $(X_CFLAGS) $(FT2_CFLAGS) $(FONTCONFIG_CFLAGS) $(VISIBILITY_FLAG) AM_CPPFLAGS = $(ZLIB_CPPFLAGS) -DXINE_LIBRARY_COMPILE LIBTOOL = $(SHELL) $(top_builddir)/libtool @@ -27,7 +27,7 @@ EXTRA_DIST = lrb.c lrb.h accel_xvmc.h libxine_la_DEPENDENCIES = $(XINEUTILS_LIB) \ $(pthread_dep) $(LIBXINEPOSIX) libxine_la_LIBADD = $(THREAD_LIBS) $(DYNAMIC_LD_LIBS) $(LTLIBINTL) $(ZLIB_LIBS) \ - -lm $(XINEUTILS_LIB) $(LIBICONV) $(FT2_LIBS) \ + -lm $(XINEUTILS_LIB) $(LIBICONV) $(FT2_LIBS) $(FONTCONFIG_LIBS) \ $(LIBXINEPOSIX) $(RT_LIBS) libxine_la_LDFLAGS = \ diff --git a/src/xine-engine/osd.c b/src/xine-engine/osd.c index 320240aa8..e6338779b 100644 --- a/src/xine-engine/osd.c +++ b/src/xine-engine/osd.c @@ -57,6 +57,9 @@ #ifdef HAVE_FT2 #include <ft2build.h> #include FT_FREETYPE_H +# ifdef HAVE_FONTCONFIG +# include <fontconfig/fontconfig.h> +# endif #endif #define FONT_VERSION 2 @@ -119,7 +122,6 @@ struct osd_font_s { #ifdef HAVE_FT2 struct osd_ft2context_s { - int useme; FT_Library library; FT_Face face; int size; @@ -817,97 +819,137 @@ static int osd_renderer_unload_font(osd_renderer_t *this, char *fontname ) { return ret; } +#ifdef HAVE_FT2 +static int osd_set_font_freetype2( osd_object_t *osd, const char *fontname, int size ) { + if (!osd->ft2) { + osd->ft2 = xine_xmalloc(sizeof(osd_ft2context_t)); + if(FT_Init_FreeType( &osd->ft2->library )) { + xprintf(osd->renderer->stream->xine, XINE_VERBOSITY_LOG, + _("osd: cannot initialize ft2 library\n")); + free(osd->ft2); + osd->ft2 = NULL; + return 0; + } + } + +#ifdef HAVE_FONTCONFIG + do { + FcPattern *pat = NULL, *match = NULL; + FcFontSet *fs = FcFontSetCreate(); + FcResult result; + + pat = FcPatternBuild(NULL, FC_FAMILY, FcTypeString, fontname, FC_SIZE, FcTypeDouble, (double)size, NULL); + FcConfigSubstitute(NULL, pat, FcMatchPattern); + FcDefaultSubstitute(pat); + + match = FcFontMatch(NULL, pat, &result); + FcPatternDestroy(pat); + + if ( ! match ) { + FcFontSetDestroy(fs); + xprintf(osd->renderer->stream->xine, XINE_VERBOSITY_LOG, + _("osd: error matching font %s with FontConfig"), fontname); + break; + } + FcFontSetAdd(fs, match); + + if ( fs->nfont != 0 ) { + FcChar8 *filename = NULL; + FcPatternGetString(fs->fonts[0], FC_FILE, 0, &filename); + if ( ! FT_New_Face(osd->ft2->library, (const char*)filename, 0, &osd->ft2->face) ) { + FcFontSetDestroy(fs); + goto end; + } + + xprintf(osd->renderer->stream->xine, XINE_VERBOSITY_LOG, + _("osd: error loading font %s with FontConfig"), fontname); + } else { + xprintf(osd->renderer->stream->xine, XINE_VERBOSITY_LOG, + _("osd: error looking up font %s with FontConfig"), fontname); + } + } while(0); +#endif + { + char pathname[1024]; + /* try load font from current directory */ + if ( !FT_New_Face(osd->ft2->library, fontname, 0, &osd->ft2->face) ) + goto end; + + /* try load font from home directory */ + snprintf(pathname, 1024, "%s/.xine/fonts/%s", xine_get_homedir(), fontname); + if ( !FT_New_Face(osd->ft2->library, pathname, 0, &osd->ft2->face) ) + goto end; + + /* try load font from xine font directory */ + snprintf(pathname, 1024, "%s/%s", XINE_FONTDIR, fontname); + if ( !FT_New_Face(osd->ft2->library, pathname, 0, &osd->ft2->face) ) + goto end; + + xprintf(osd->renderer->stream->xine, XINE_VERBOSITY_LOG, + _("osd: error loading font %s with ft2\n"), fontname); + } + + free(osd->ft2); + osd->ft2 = NULL; + return 0; + + end: + if (FT_Set_Pixel_Sizes(osd->ft2->face, 0, size)) { + xprintf(osd->renderer->stream->xine, XINE_VERBOSITY_LOG, + _("osd: error setting font size (no scalable font?)\n")); + free(osd->ft2); + osd->ft2 = NULL; + return 0; + } + + osd->ft2->size = size; + return 1; +} +#endif /* set the font of osd object */ static int osd_set_font( osd_object_t *osd, const char *fontname, int size) { - - osd_renderer_t *this = osd->renderer; - osd_font_t *font; - int best = 0; - int ret = 0; -#ifdef HAVE_FT2 - char pathname[1024]; - int error_flag = 0; -#endif + int ret = 1; lprintf("osd=%p font '%s'\n", osd, fontname); - pthread_mutex_lock (&this->osd_mutex); - - osd->font = NULL; - - font = this->fonts; - while( font ) { - - if( !strcasecmp(font->name, fontname) && (size>=font->size) - && (best<font->size)) { - ret = 1; - osd->font = font; - best = font->size; - lprintf ("best: font->name=%s, size=%d\n", font->name, font->size); + pthread_mutex_lock (&osd->renderer->osd_mutex); - } - font = font->next; - } - - if( ret ) { - /* load font if needed */ - if( !osd->font->loaded ) - ret = osd_renderer_load_font(this, osd->font->filename); - if(!ret) - osd->font = NULL; - } - #ifdef HAVE_FT2 + if ( ! osd_set_font_freetype2(osd, fontname, size) ) +#endif + { /* If the FreeType2 loading failed */ + osd_font_t *font; + int best = 0; + osd->font = NULL; + ret = 0; - if (osd->ft2) { - osd->ft2->useme = 0; - } + font = osd->renderer->fonts; + while( font ) { - if (!ret) { /* trying to load a font file with ft2 */ - if (!osd->ft2) { - osd->ft2 = xine_xmalloc(sizeof(osd_ft2context_t)); - if(FT_Init_FreeType( &osd->ft2->library )) { - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - _("osd: cannot initialize ft2 library\n")); - free(osd->ft2); - osd->ft2 = NULL; - } - } - if (osd->ft2) { - /* try load font from current directory */ - if (FT_New_Face(osd->ft2->library, fontname, 0, &osd->ft2->face)) { - /* try load font from home directory */ - snprintf(pathname, 1024, "%s/.xine/fonts/%s", xine_get_homedir(), fontname); - if (FT_New_Face(osd->ft2->library, pathname, 0, &osd->ft2->face)) { - /* try load font from xine font directory */ - snprintf(pathname, 1024, "%s/%s", XINE_FONTDIR, fontname); - if (FT_New_Face(osd->ft2->library, pathname, 0, &osd->ft2->face)) { - error_flag = 1; - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - _("osd: error loading font %s with ft2\n"), fontname); - } - } - } - if (!error_flag) { - if (FT_Set_Pixel_Sizes(osd->ft2->face, 0, size)) { - xprintf(this->stream->xine, XINE_VERBOSITY_LOG, - _("osd: error setting font size (no scalable font?)\n")); - } else { + if( !strcasecmp(font->name, fontname) && (size>=font->size) + && (best<font->size)) { ret = 1; - osd->ft2->useme = 1; - osd->ft2->size = size; + osd->font = font; + best = font->size; + lprintf ("best: font->name=%s, size=%d\n", font->name, font->size); } + font = font->next; } - } - } -#endif + if( ret ) { + /* load font if needed */ + if( !osd->font->loaded ) + ret = osd_renderer_load_font(osd->renderer, osd->font->filename); + if(!ret) + osd->font = NULL; + } + } - pthread_mutex_unlock (&this->osd_mutex); + pthread_mutex_unlock (&osd->renderer->osd_mutex); return ret; } @@ -1068,7 +1110,7 @@ static int osd_render_text (osd_object_t *osd, int x1, int y1, #ifdef HAVE_FT2 FT_UInt previous = 0; - FT_Bool use_kerning = osd->ft2 && osd->ft2->useme && FT_HAS_KERNING(osd->ft2->face); + FT_Bool use_kerning = osd->ft2 && FT_HAS_KERNING(osd->ft2->face); int first = 1; #endif @@ -1087,7 +1129,7 @@ static int osd_render_text (osd_object_t *osd, int x1, int y1, if ((font = osd->font)) proceed = 1; #ifdef HAVE_FT2 - if (osd->ft2 && osd->ft2->useme) proceed = 1; + if (osd->ft2) proceed = 1; #endif if (proceed == 0) { @@ -1115,7 +1157,7 @@ static int osd_render_text (osd_object_t *osd, int x1, int y1, #ifdef HAVE_FT2 - if (osd->ft2 && osd->ft2->useme) { + if (osd->ft2) { FT_GlyphSlot slot = osd->ft2->face->glyph; @@ -1217,7 +1259,7 @@ static int osd_render_text (osd_object_t *osd, int x1, int y1, } #ifdef HAVE_FT2 - } /* !(osd->ft2 && osd->ft2->useme) */ + } /* !(osd->ft2) */ #endif } @@ -1241,7 +1283,7 @@ static int osd_get_text_size(osd_object_t *osd, const char *text, int *width, in #ifdef HAVE_FT2 /* not all free type fonts provide kerning */ - FT_Bool use_kerning = osd->ft2 && osd->ft2->useme && FT_HAS_KERNING(osd->ft2->face); + FT_Bool use_kerning = osd->ft2 && FT_HAS_KERNING(osd->ft2->face); FT_UInt previous = 0; int first_glyph = 1; #endif @@ -1255,7 +1297,7 @@ static int osd_get_text_size(osd_object_t *osd, const char *text, int *width, in if ((font = osd->font)) proceed = 1; #ifdef HAVE_FT2 - if (osd->ft2 && osd->ft2->useme) proceed = 1; + if (osd->ft2) proceed = 1; #endif if (proceed == 0) { @@ -1282,7 +1324,7 @@ static int osd_get_text_size(osd_object_t *osd, const char *text, int *width, in #endif #ifdef HAVE_FT2 - if (osd->ft2 && osd->ft2->useme) { + if (osd->ft2) { FT_GlyphSlot slot = osd->ft2->face->glyph; i = FT_Get_Char_Index( osd->ft2->face, unicode); @@ -1322,12 +1364,12 @@ static int osd_get_text_size(osd_object_t *osd, const char *text, int *width, in *width += font->fontchar[i].width - (font->fontchar[i].width * FONT_OVERLAP); } #ifdef HAVE_FT2 - } /* !(osd->ft2 && osd->ft2->useme) */ + } /* !(osd->ft2) */ #endif } #ifdef HAVE_FT2 - if (osd->ft2 && osd->ft2->useme) { + if (osd->ft2) { /* if we have a true type font we need to do some corrections for the last * letter. As this one is still in the gylph slot we can still work with * it. For the last letter be must not use advance and width but the real |