]> git.sesse.net Git - vlc/blobdiff - modules/misc/freetype.c
Include vlc_plugin.h as needed
[vlc] / modules / misc / freetype.c
index 8a2233b3114287bf6f8888ad538a5c2fc441f5b9..2b7c6bab04e49ffd0d6d8d47538036c36753b297 100644 (file)
  * Preamble
  *****************************************************************************/
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <vlc/vlc.h>
+#include <vlc_plugin.h>
 #include <vlc_vout.h>
 #include <vlc_osd.h>
 #include <vlc_block.h>
 #include <vlc_xml.h>
 #include <vlc_input.h>
 
-#ifdef HAVE_LINUX_LIMITS_H
-#   include <linux/limits.h>
-#endif
-
-#include <time.h>
 #include <math.h>
 #include <errno.h>
 
@@ -90,8 +90,9 @@ static int RenderText( filter_t *, subpicture_region_t *,
 static int RenderHtml( filter_t *, subpicture_region_t *,
                        subpicture_region_t * );
 static char *FontConfig_Select( FcConfig *, const char *,
-                                vlc_bool_t, vlc_bool_t, int * );
-static int CheckIfFontBuildComplete( filter_t *p_filter );
+                                bool, bool, int * );
+static int BuildDone( vlc_object_t*, const char *, vlc_value_t, vlc_value_t,
+                        void* );
 #endif
 static line_desc_t *NewLine( int );
 
@@ -158,29 +159,29 @@ vlc_module_begin();
     set_subcategory( SUBCAT_VIDEO_SUBPIC );
 
     add_file( "freetype-font", DEFAULT_FONT, NULL, FONT_TEXT, FONT_LONGTEXT,
-              VLC_FALSE );
+              false );
 
     add_integer( "freetype-fontsize", 0, NULL, FONTSIZE_TEXT,
-                 FONTSIZE_LONGTEXT, VLC_TRUE );
+                 FONTSIZE_LONGTEXT, true );
 
     /* opacity valid on 0..255, with default 255 = fully opaque */
     add_integer_with_range( "freetype-opacity", 255, 0, 255, NULL,
-        OPACITY_TEXT, OPACITY_LONGTEXT, VLC_TRUE );
+        OPACITY_TEXT, OPACITY_LONGTEXT, true );
 
     /* hook to the color values list, with default 0x00ffffff = white */
     add_integer( "freetype-color", 0x00FFFFFF, NULL, COLOR_TEXT,
-                 COLOR_LONGTEXT, VLC_FALSE );
+                 COLOR_LONGTEXT, false );
         change_integer_list( pi_color_values, ppsz_color_descriptions, 0 );
 
     add_integer( "freetype-rel-fontsize", 16, NULL, FONTSIZER_TEXT,
-                 FONTSIZER_LONGTEXT, VLC_FALSE );
+                 FONTSIZER_LONGTEXT, false );
         change_integer_list( pi_sizes, ppsz_sizes_text, 0 );
     add_integer( "freetype-effect", 2, NULL, EFFECT_TEXT,
-                 EFFECT_LONGTEXT, VLC_FALSE );
+                 EFFECT_LONGTEXT, false );
         change_integer_list( pi_effects, ppsz_effects_text, 0 );
 
     add_bool( "freetype-yuvp", 0, NULL, YUVP_TEXT,
-              YUVP_LONGTEXT, VLC_TRUE );
+              YUVP_LONGTEXT, true );
     set_capability( "text renderer", 100 );
     add_shortcut( "text" );
     set_callbacks( Create, Destroy );
@@ -199,7 +200,7 @@ struct line_desc_t
     uint32_t       *p_fg_rgb;
     uint32_t       *p_bg_rgb;
     uint8_t        *p_fg_bg_ratio; /* 0x00=100% FG --> 0x7F=100% BG */
-    vlc_bool_t      b_new_color_mode;
+    bool      b_new_color_mode;
     /** underline information -- only supplied if text should be underlined */
     uint16_t       *pi_underline_offset;
     uint16_t       *pi_underline_thickness;
@@ -228,9 +229,9 @@ typedef struct
     int         i_font_size;
     uint32_t    i_font_color;         /* ARGB */
     uint32_t    i_karaoke_bg_color;   /* ARGB */
-    vlc_bool_t  b_italic;
-    vlc_bool_t  b_bold;
-    vlc_bool_t  b_underline;
+    bool  b_italic;
+    bool  b_bold;
+    bool  b_underline;
     char       *psz_fontname;
 } ft_style_t;
 
@@ -251,7 +252,7 @@ struct filter_sys_t
 {
     FT_Library     p_library;   /* handle to library     */
     FT_Face        p_face;      /* handle to face object */
-    vlc_bool_t     i_use_kerning;
+    bool     i_use_kerning;
     uint8_t        i_font_opacity;
     int            i_font_color;
     int            i_font_size;
@@ -261,7 +262,7 @@ struct filter_sys_t
     int            i_display_height;
 #ifdef HAVE_FONTCONFIG
     FcConfig      *p_fontconfig;
-    vlc_bool_t     b_fontconfig_ok;
+    bool     b_fontconfig_ok;
     vlc_mutex_t    fontconfig_lock;
 #endif
 
@@ -281,7 +282,6 @@ static int Create( vlc_object_t *p_this )
     char          *psz_fontfile = NULL;
     int            i_error;
     vlc_value_t    val;
-    vlc_mutex_t   *lock;
     vlc_object_t  *p_fontbuilder;
 
     /* Allocate structure */
@@ -319,7 +319,7 @@ static int Create( vlc_object_t *p_this )
     psz_fontfile = val.psz_string;
     if( !psz_fontfile || !*psz_fontfile )
     {
-        if( psz_fontfile ) free( psz_fontfile );
+        free( psz_fontfile );
         psz_fontfile = (char *)malloc( PATH_MAX + 1 );
         if( !psz_fontfile )
         {
@@ -364,12 +364,12 @@ static int Create( vlc_object_t *p_this )
     }
 
 #ifdef HAVE_FONTCONFIG
-    vlc_mutex_init( p_filter, &p_sys->fontconfig_lock );
-    p_sys->b_fontconfig_ok = VLC_FALSE;
+    vlc_mutex_init( &p_sys->fontconfig_lock );
+    p_sys->b_fontconfig_ok = false;
     p_sys->p_fontconfig    = NULL;
 
     /* Check for an existing Fontbuilder thread */
-    lock = var_AcquireMutex( "fontbuilder" );
+    vlc_mutex_t *lock = var_AcquireMutex( "fontbuilder" );
     p_fontbuilder = vlc_object_find_name( p_filter->p_libvlc,
                                           "fontlist builder",
                                           FIND_CHILD );
@@ -387,17 +387,18 @@ static int Create( vlc_object_t *p_this )
                                            VLC_OBJECT_GENERIC );
         if( p_fontbuilder )
         {
-            p_fontbuilder->psz_object_name = "fontlist builder";
+            p_fontbuilder->psz_object_name = strdup( "fontlist builder" );
             vlc_object_attach( p_fontbuilder, p_filter->p_libvlc );
 
             var_Create( p_fontbuilder, "build-done", VLC_VAR_BOOL );
-            var_SetBool( p_fontbuilder, "build-done", VLC_FALSE );
+            var_SetBool( p_fontbuilder, "build-done", false );
+            var_AddCallback( p_fontbuilder, "build-done", BuildDone, p_sys );
 
             if( vlc_thread_create( p_fontbuilder,
                                    "fontlist builder",
                                    FontBuilder,
                                    VLC_THREAD_PRIORITY_LOW,
-                                   VLC_FALSE ) )
+                                   false ) )
             {
                 /* Don't destroy the fontconfig object - we won't be able to do
                  * italics or bold or change the font face, but we will still
@@ -409,7 +410,7 @@ static int Create( vlc_object_t *p_this )
         }
         else
         {
-            vlc_object_destroy( p_fontbuilder );
+            vlc_object_release( p_fontbuilder );
         }
     }
     else
@@ -426,7 +427,7 @@ static int Create( vlc_object_t *p_this )
     p_sys->i_default_font_size = val.i_int;
     if( SetFontSize( p_filter, 0 ) != VLC_SUCCESS ) goto error;
 
-    if( psz_fontfile ) free( psz_fontfile );
+    free( psz_fontfile );
 
     p_sys->pp_font_attachments = NULL;
     p_sys->i_font_attachments = 0;
@@ -445,7 +446,7 @@ static int Create( vlc_object_t *p_this )
  error:
     if( p_sys->p_face ) FT_Done_Face( p_sys->p_face );
     if( p_sys->p_library ) FT_Done_FreeType( p_sys->p_library );
-    if( psz_fontfile ) free( psz_fontfile );
+    free( psz_fontfile );
     free( p_sys );
     return VLC_EGENERIC;
 }
@@ -473,6 +474,16 @@ static void Destroy( vlc_object_t *p_this )
     }
 
 #ifdef HAVE_FONTCONFIG
+    vlc_mutex_t *lock = var_AcquireMutex( "fontbuilder" );
+    vlc_object_t *p_fontbuilder = vlc_object_find_name( p_filter->p_libvlc,
+                                    "fontlist builder", FIND_CHILD );
+    if( p_fontbuilder )
+    {
+        var_DelCallback( p_fontbuilder, "build-done", BuildDone, p_sys );
+        vlc_object_release( p_fontbuilder );
+    }
+    vlc_mutex_unlock( lock );
+
     vlc_mutex_destroy( &p_sys->fontconfig_lock );
 
     if( p_sys->p_fontconfig )
@@ -500,10 +511,10 @@ static void FontBuilder( vlc_object_t *p_this )
 
     if( p_fontconfig )
     {
-        time_t    t1, t2;
+        mtime_t    t1, t2;
 
         msg_Dbg( p_this, "Building font database..." );
-        time( &t1 );
+        t1 = mdate();
         if(! FcConfigBuildFonts( p_fontconfig ))
         {
             /* Don't destroy the fontconfig object - we won't be able to do
@@ -513,18 +524,20 @@ static void FontBuilder( vlc_object_t *p_this )
             msg_Err( p_this, "fontconfig database can't be built. "
                                     "Font styling won't be available" );
         }
-        time( &t2 );
+        t2 = mdate();
 
         msg_Dbg( p_this, "Finished building font database." );
-        if( t1 > 0 && t2 > 0 )
-            msg_Dbg( p_this, "Took %ld seconds", t2 - t1 );
+        msg_Dbg( p_this, "Took %ld seconds", (long)((t2 - t1)/1000000) );
 
         lock = var_AcquireMutex( "fontbuilder" );
-        var_SetBool( p_this, "build-done", VLC_TRUE );
+
+        var_SetBool( p_this, "build-done", true );
 
         FcConfigDestroy( p_fontconfig );
         vlc_mutex_unlock( lock );
     }
+    vlc_object_detach( p_this );
+    vlc_object_release( p_this );
 }
 
 #endif
@@ -734,11 +747,11 @@ static int Render( filter_t *p_filter, subpicture_region_t *p_region,
     return VLC_SUCCESS;
 }
 
-static void UnderlineGlyphYUVA( int i_line_thickness, int i_line_offset, vlc_bool_t b_ul_next_char,
+static void UnderlineGlyphYUVA( int i_line_thickness, int i_line_offset, bool b_ul_next_char,
                                 FT_BitmapGlyph  p_this_glyph, FT_Vector *p_this_glyph_pos,
                                 FT_BitmapGlyph  p_next_glyph, FT_Vector *p_next_glyph_pos,
                                 int i_glyph_tmax, int i_align_offset,
-                                uint8_t i_y, uint8_t i_u, uint8_t i_v, uint8_t i_alpha,
+                                uint8_t i_y, uint8_t i_u, uint8_t i_v,
                                 subpicture_region_t *p_region)
 {
     int y, x, z;
@@ -765,7 +778,7 @@ static void UnderlineGlyphYUVA( int i_line_thickness, int i_line_offset, vlc_boo
         }
         for( x = 0; x < i_extra; x++ )
         {
-            vlc_bool_t b_ok = VLC_TRUE;
+            bool b_ok = true;
 
             /* break the underline around the tails of any glyphs which cross it */
             for( z = x - i_line_thickness;
@@ -779,7 +792,7 @@ static void UnderlineGlyphYUVA( int i_line_thickness, int i_line_offset, vlc_boo
                     if( ( p_next_glyph->bitmap.rows > i_row ) &&
                         p_next_glyph->bitmap.buffer[p_next_glyph->bitmap.width * i_row + z-i_extra] )
                     {
-                        b_ok = VLC_FALSE;
+                        b_ok = false;
                     }
                 }
                 else if ((z > 0 ) && (z < p_this_glyph->bitmap.width))
@@ -789,7 +802,7 @@ static void UnderlineGlyphYUVA( int i_line_thickness, int i_line_offset, vlc_boo
                     if( ( p_this_glyph->bitmap.rows > i_row ) &&
                         p_this_glyph->bitmap.buffer[p_this_glyph->bitmap.width * i_row + z] )
                     {
-                        b_ok = VLC_FALSE;
+                        b_ok = false;
                     }
                 }
             }
@@ -1040,7 +1053,7 @@ static int RenderYUVA( filter_t *p_filter, subpicture_region_t *p_region,
                                     p_line->pp_glyphs[i], &(p_line->p_glyph_pos[i]),
                                     p_line->pp_glyphs[i+1], &(p_line->p_glyph_pos[i+1]),
                                     i_glyph_tmax, i_align_offset,
-                                    i_y, i_u, i_v, i_alpha,
+                                    i_y, i_u, i_v,
                                     p_region);
             }
         }
@@ -1136,7 +1149,8 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
         i_out_bytes = i_in_bytes * sizeof( uint32_t );
         i_out_bytes_left = i_out_bytes;
         p_out_buffer = (char *)psz_unicode;
-        i_ret = vlc_iconv( iconv_handle, (const char**)&p_in_buffer, &i_in_bytes,
+        i_ret = vlc_iconv( iconv_handle, (const char**)&p_in_buffer,
+                           &i_in_bytes,
                            &p_out_buffer, &i_out_bytes_left );
 
         vlc_iconv_close( iconv_handle );
@@ -1154,7 +1168,7 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
 #if defined(HAVE_FRIBIDI)
     {
         uint32_t *p_fribidi_string;
-        int start_pos, pos = 0;
+        int32_t start_pos, pos = 0;
 
         p_fribidi_string = malloc( (i_string_length + 1) * sizeof(uint32_t) );
         if( !p_fribidi_string )
@@ -1164,9 +1178,10 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
         }
 
         /* Do bidi conversion line-by-line */
-        while(pos < i_string_length)
+        while( pos < i_string_length )
         {
-            while(pos < i_string_length) {
+            while( pos < i_string_length ) 
+            {
                 i_char = psz_unicode[pos];
                 if (i_char != '\r' && i_char != '\n')
                     break;
@@ -1174,7 +1189,8 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
                 ++pos;
             }
             start_pos = pos;
-            while(pos < i_string_length) {
+            while( pos < i_string_length )
+            {
                 i_char = psz_unicode[pos];
                 if (i_char == '\r' || i_char == '\n')
                     break;
@@ -1183,8 +1199,11 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
             if (pos > start_pos)
             {
                 FriBidiCharType base_dir = FRIBIDI_TYPE_LTR;
-                fribidi_log2vis((FriBidiChar*)psz_unicode + start_pos, pos - start_pos,
-                                &base_dir, (FriBidiChar*)p_fribidi_string + start_pos, 0, 0, 0);
+                fribidi_log2vis((FriBidiChar*)psz_unicode + start_pos,
+                                pos - start_pos,
+                                &base_dir,
+                                (FriBidiChar*)p_fribidi_string + start_pos,
+                                0, 0, 0);
             }
         }
 
@@ -1287,6 +1306,7 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
             glyph_size.xMin + ((FT_BitmapGlyph)tmp_glyph)->left;
         if( line.xMax > (int)p_filter->fmt_out.video.i_visible_width - 20 )
         {
+            FT_Done_Glyph( (FT_Glyph)p_line->pp_glyphs[ i ] );
             p_line->pp_glyphs[ i ] = NULL;
             FreeLine( p_line );
             p_line = NewLine( strlen( psz_string ));
@@ -1352,20 +1372,20 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
     else
         RenderYUVA( p_filter, p_region_out, p_lines, result.x, result.y );
 
-    if( psz_unicode_orig ) free( psz_unicode_orig );
+    free( psz_unicode_orig );
     FreeLines( p_lines );
     return VLC_SUCCESS;
 
  error:
-    if( psz_unicode_orig ) free( psz_unicode_orig );
+    free( psz_unicode_orig );
     FreeLines( p_lines );
     return VLC_EGENERIC;
 }
 
 #ifdef HAVE_FONTCONFIG
 static ft_style_t *CreateStyle( char *psz_fontname, int i_font_size,
-        uint32_t i_font_color, uint32_t i_karaoke_bg_color, vlc_bool_t b_bold,
-        vlc_bool_t b_italic, vlc_bool_t b_uline )
+        uint32_t i_font_color, uint32_t i_karaoke_bg_color, bool b_bold,
+        bool b_italic, bool b_uline )
 {
     ft_style_t  *p_style = malloc( sizeof( ft_style_t ));
 
@@ -1387,18 +1407,17 @@ static void DeleteStyle( ft_style_t *p_style )
 {
     if( p_style )
     {
-        if( p_style->psz_fontname )
-            free( p_style->psz_fontname );
+        free( p_style->psz_fontname );
         free( p_style );
     }
 }
 
-static vlc_bool_t StyleEquals( ft_style_t *s1, ft_style_t *s2 )
+static bool StyleEquals( ft_style_t *s1, ft_style_t *s2 )
 {
     if( !s1 || !s2 )
-        return VLC_FALSE;
+        return false;
     if( s1 == s2 )
-        return VLC_TRUE;
+        return true;
 
     if(( s1->i_font_size  == s2->i_font_size ) &&
        ( s1->i_font_color == s2->i_font_color ) &&
@@ -1407,9 +1426,9 @@ static vlc_bool_t StyleEquals( ft_style_t *s1, ft_style_t *s2 )
        ( s1->b_underline  == s2->b_underline ) &&
        ( !strcmp( s1->psz_fontname, s2->psz_fontname )))
     {
-        return VLC_TRUE;
+        return true;
     }
-    return VLC_FALSE;
+    return false;
 }
 
 static int PushFont( font_stack_t **p_font, const char *psz_name, int i_size,
@@ -1556,8 +1575,8 @@ static void IconvText( filter_t *p_filter, const char *psz_string,
 }
 
 static ft_style_t *GetStyleFromFontStack( filter_sys_t *p_sys,
-        font_stack_t **p_fonts, vlc_bool_t b_bold, vlc_bool_t b_italic,
-        vlc_bool_t b_uline )
+        font_stack_t **p_fonts, bool b_bold, bool b_italic,
+        bool b_uline )
 {
     ft_style_t   *p_style = NULL;
 
@@ -1576,7 +1595,7 @@ static ft_style_t *GetStyleFromFontStack( filter_sys_t *p_sys,
 }
 
 static int RenderTag( filter_t *p_filter, FT_Face p_face, int i_font_color,
-                      vlc_bool_t b_uline, int i_karaoke_bgcolor,
+                      bool b_uline, int i_karaoke_bgcolor,
                       line_desc_t *p_line, uint32_t *psz_unicode,
                       int *pi_pen_x, int i_pen_y, int *pi_start,
                       FT_Vector *p_result )
@@ -1584,7 +1603,7 @@ static int RenderTag( filter_t *p_filter, FT_Face p_face, int i_font_color,
     FT_BBox      line;
     int          i_yMin, i_yMax;
     int          i;
-    vlc_bool_t   b_first_on_line = VLC_TRUE;
+    bool   b_first_on_line = true;
 
     int          i_previous = 0;
     int          i_pen_x_start = *pi_pen_x;
@@ -1610,7 +1629,7 @@ static int RenderTag( filter_t *p_filter, FT_Face p_face, int i_font_color,
     i_yMax = line.yMax;
 
     if( line.xMax > 0 )
-        b_first_on_line = VLC_FALSE;
+        b_first_on_line = false;
 
     while( *psz_unicode && ( *psz_unicode != '\n' ) )
     {
@@ -1787,7 +1806,7 @@ static int HandleFontAttributes( xml_reader_t *p_xml_reader,
         {
             if( !strcasecmp( "face", psz_name ) )
             {
-                if( psz_fontname ) free( psz_fontname );
+                free( psz_fontname );
                 psz_fontname = strdup( psz_value );
             }
             else if( !strcasecmp( "size", psz_name ) )
@@ -1962,8 +1981,8 @@ static void SetupKaraoke( xml_reader_t *p_xml_reader, uint32_t *pi_k_runs,
                     (*ppi_k_run_lengths)[ *pi_k_runs - 1 ] = 0;
             }
         }
-        if( psz_name )  free( psz_name );
-        if( psz_value ) free( psz_value );
+        free( psz_name );
+        free( psz_value );
     }
 }
 
@@ -1977,7 +1996,7 @@ static int ProcessNodes( filter_t *p_filter,
                          uint32_t **ppi_run_lengths,
                          ft_style_t ***ppp_styles,
 
-                         vlc_bool_t b_karaoke,
+                         bool b_karaoke,
                          uint32_t *pi_k_runs,
                          uint32_t **ppi_k_run_lengths,
                          uint32_t **ppi_k_durations )
@@ -1991,9 +2010,9 @@ static int ProcessNodes( filter_t *p_filter,
 
     char *psz_node  = NULL;
 
-    vlc_bool_t b_italic = VLC_FALSE;
-    vlc_bool_t b_bold   = VLC_FALSE;
-    vlc_bool_t b_uline  = VLC_FALSE;
+    bool b_italic = false;
+    bool b_bold   = false;
+    bool b_uline  = false;
 
     if( VLC_SUCCESS == var_Get( p_filter, "scale", &val ))
         i_scale = val.i_int;
@@ -2009,11 +2028,11 @@ static int ProcessNodes( filter_t *p_filter,
                    ((p_font_style->i_karaoke_background_alpha & 0xff) << 24));
 
         if( p_font_style->i_style_flags & STYLE_BOLD )
-            b_bold = VLC_TRUE;
+            b_bold = true;
         if( p_font_style->i_style_flags & STYLE_ITALIC )
-            b_italic = VLC_TRUE;
+            b_italic = true;
         if( p_font_style->i_style_flags & STYLE_UNDERLINE )
-            b_uline = VLC_TRUE;
+            b_uline = true;
     }
     else
     {
@@ -2040,11 +2059,11 @@ static int ProcessNodes( filter_t *p_filter,
                     if( !strcasecmp( "font", psz_node ) )
                         PopFont( &p_fonts );
                     else if( !strcasecmp( "b", psz_node ) )
-                        b_bold   = VLC_FALSE;
+                        b_bold   = false;
                     else if( !strcasecmp( "i", psz_node ) )
-                        b_italic = VLC_FALSE;
+                        b_italic = false;
                     else if( !strcasecmp( "u", psz_node ) )
-                        b_uline  = VLC_FALSE;
+                        b_uline  = false;
 
                     free( psz_node );
                 }
@@ -2056,11 +2075,11 @@ static int ProcessNodes( filter_t *p_filter,
                     if( !strcasecmp( "font", psz_node ) )
                         rv = HandleFontAttributes( p_xml_reader, &p_fonts, i_scale );
                     else if( !strcasecmp( "b", psz_node ) )
-                        b_bold = VLC_TRUE;
+                        b_bold = true;
                     else if( !strcasecmp( "i", psz_node ) )
-                        b_italic = VLC_TRUE;
+                        b_italic = true;
                     else if( !strcasecmp( "u", psz_node ) )
-                        b_uline = VLC_TRUE;
+                        b_uline = true;
                     else if( !strcasecmp( "br", psz_node ) )
                     {
                         SetupLine( p_filter, "\n", &psz_text,
@@ -2155,7 +2174,7 @@ static int CheckForEmbeddedFont( filter_sys_t *p_sys, FT_Face *pp_face, ft_style
         {
             if( p_face )
             {
-                vlc_bool_t match = !strcasecmp( p_face->family_name,
+                bool match = !strcasecmp( p_face->family_name,
                                                 p_style->psz_fontname );
 
                 if( p_face->style_flags & FT_STYLE_FLAG_BOLD )
@@ -2182,35 +2201,15 @@ static int CheckForEmbeddedFont( filter_sys_t *p_sys, FT_Face *pp_face, ft_style
     return VLC_EGENERIC;
 }
 
-static int CheckIfFontBuildComplete( filter_t *p_filter )
+static int BuildDone( vlc_object_t *p_this, const char *psz_var,
+                       vlc_value_t oldval, vlc_value_t newval, void *param )
 {
-    filter_sys_t   *p_sys = p_filter->p_sys;
-    vlc_object_t   *p_fb = vlc_object_find_name( p_filter->p_libvlc,
-                                                 "fontlist builder",
-                                                 FIND_CHILD );
-    if( p_fb )
-    {
-        vlc_mutex_t *lock = var_AcquireMutex( "fontbuilder" );
-        vlc_value_t  val;
-
-        if( VLC_SUCCESS == var_Get( p_fb, "build-done", &val ))
-        {
-            p_sys->b_fontconfig_ok = val.b_bool;
-
-            if( p_sys->b_fontconfig_ok )
-            {
-                FcInit();
-                p_sys->p_fontconfig = FcConfigGetCurrent();
-            }
-            else
-                msg_Dbg( p_filter, "Font Build still not complete" );
-        }
-        vlc_mutex_unlock( lock );
-        vlc_object_release( p_fb );
-
-        return VLC_SUCCESS;
-    }
-    return VLC_EGENERIC;
+    (void)p_this;
+    (void)psz_var;
+    (void)oldval;
+    ((filter_sys_t*)param)->b_fontconfig_ok = newval.b_bool;
+    assert( newval.b_bool );
+    return VLC_SUCCESS;
 }
 
 static int ProcessLines( filter_t *p_filter,
@@ -2224,7 +2223,7 @@ static int ProcessLines( filter_t *p_filter,
 
                          FT_Vector *p_result,
 
-                         vlc_bool_t b_karaoke,
+                         bool b_karaoke,
                          uint32_t i_k_runs,
                          uint32_t *pi_k_run_lengths,
                          uint32_t *pi_k_durations )
@@ -2285,12 +2284,12 @@ static int ProcessLines( filter_t *p_filter,
             ! p_levels )
         {
             msg_Err( p_filter, "out of memory" );
-            if( p_levels )           free( p_levels );
-            if( p_old_positions )    free( p_old_positions );
-            if( p_new_positions )    free( p_new_positions );
-            if( p_fribidi_string )   free( p_fribidi_string );
-            if( pp_char_styles_new ) free( pp_char_styles_new );
-            if( pi_karaoke_bar )     free( pi_karaoke_bar );
+            free( p_levels );
+            free( p_old_positions );
+            free( p_new_positions );
+            free( p_fribidi_string );
+            free( pp_char_styles_new );
+            free( pi_karaoke_bar );
 
             free( pp_char_styles );
             return VLC_ENOMEM;
@@ -2398,8 +2397,8 @@ static int ProcessLines( filter_t *p_filter,
              i_start_pos += pi_k_run_lengths[ k ];
         }
     }
-    if( p_levels )         free( p_levels );
-    if( p_new_positions )  free( p_new_positions );
+    free( p_levels );
+    free( p_new_positions );
 
     FT_Vector tmp_result;
 
@@ -2429,12 +2428,6 @@ static int ProcessLines( filter_t *p_filter,
             /* Look for a match amongst our attachments first */
             CheckForEmbeddedFont( p_sys, &p_face, p_style );
 
-            if( !p_sys->b_fontconfig_ok )
-            {
-                if( VLC_EGENERIC == CheckIfFontBuildComplete( p_filter ))
-                    msg_Err( p_filter, "Can't find FontBuilder thread!" );
-            }
-
             if( ! p_face && p_sys->b_fontconfig_ok )
             {
                 char *psz_fontfile;
@@ -2468,8 +2461,7 @@ static int ProcessLines( filter_t *p_filter,
 #if defined(HAVE_FRIBIDI)
                         free( psz_text );
 #endif
-                        if( pi_karaoke_bar )
-                            free( pi_karaoke_bar );
+                        free( pi_karaoke_bar );
                         return VLC_EGENERIC;
                     }
                     free( psz_fontfile );
@@ -2495,8 +2487,7 @@ static int ProcessLines( filter_t *p_filter,
 #if defined(HAVE_FRIBIDI)
                 free( psz_text );
 #endif
-                if( pi_karaoke_bar )
-                    free( pi_karaoke_bar );
+                free( pi_karaoke_bar );
                 return VLC_EGENERIC;
             }
             p_sys->i_use_kerning =
@@ -2514,8 +2505,7 @@ static int ProcessLines( filter_t *p_filter,
 #if defined(HAVE_FRIBIDI)
                 free( psz_text );
 #endif
-                if( pi_karaoke_bar )
-                    free( pi_karaoke_bar );
+                free( pi_karaoke_bar );
                 return VLC_ENOMEM;
             }
             memcpy( psz_unicode, psz_text + i_prev,
@@ -2534,15 +2524,14 @@ static int ProcessLines( filter_t *p_filter,
 #if defined(HAVE_FRIBIDI)
                         free( psz_text );
 #endif
-                        if( pi_karaoke_bar )
-                            free( pi_karaoke_bar );
+                        free( pi_karaoke_bar );
                         return VLC_ENOMEM;
                     }
                     /* New Color mode only works in YUVA rendering mode --
                      * (RGB mode has palette constraints on it). We therefore
                      * need to populate the legacy colour fields also.
                      */
-                    p_line->b_new_color_mode = VLC_TRUE;
+                    p_line->b_new_color_mode = true;
                     p_line->i_alpha = ( p_style->i_font_color & 0xff000000 ) >> 24;
                     p_line->i_red   = ( p_style->i_font_color & 0x00ff0000 ) >> 16;
                     p_line->i_green = ( p_style->i_font_color & 0x0000ff00 ) >>  8;
@@ -2569,8 +2558,7 @@ static int ProcessLines( filter_t *p_filter,
 #if defined(HAVE_FRIBIDI)
                     free( psz_text );
 #endif
-                    if( pi_karaoke_bar )
-                        free( pi_karaoke_bar );
+                    free( pi_karaoke_bar );
                     return VLC_EGENERIC;
                 }
 
@@ -2668,13 +2656,13 @@ static int RenderHtml( filter_t *p_filter, subpicture_region_t *p_region_out,
     p_sub = stream_MemoryNew( VLC_OBJECT(p_filter),
                               (uint8_t *) p_region_in->psz_html,
                               strlen( p_region_in->psz_html ),
-                              VLC_TRUE );
+                              true );
     if( p_sub )
     {
         p_xml = xml_Create( p_filter );
         if( p_xml )
         {
-            vlc_bool_t b_karaoke = VLC_FALSE;
+            bool b_karaoke = false;
 
             p_xml_reader = xml_ReaderCreate( p_xml, p_sub );
             if( p_xml_reader )
@@ -2689,12 +2677,12 @@ static int RenderHtml( filter_t *p_filter, subpicture_region_t *p_region_out,
                         /* We're going to have to render the text a number
                          * of times to show the progress marker on the text.
                          */
-                        var_SetBool( p_filter, "text-rerender", VLC_TRUE );
-                        b_karaoke = VLC_TRUE;
+                        var_SetBool( p_filter, "text-rerender", true );
+                        b_karaoke = true;
                     }
                     else if( !strcasecmp( "text", psz_node ) )
                     {
-                        b_karaoke = VLC_FALSE;
+                        b_karaoke = false;
                     }
                     else
                     {
@@ -2781,7 +2769,7 @@ static int RenderHtml( filter_t *p_filter, subpicture_region_t *p_region_out,
 }
 
 static char* FontConfig_Select( FcConfig* priv, const char* family,
-                          vlc_bool_t b_bold, vlc_bool_t b_italic, int *i_idx )
+                          bool b_bold, bool b_italic, int *i_idx )
 {
     FcResult result;
     FcPattern *pat, *p_pat;
@@ -2897,19 +2885,18 @@ static line_desc_t *NewLine( int i_count )
         ( p_line->pi_underline_offset == NULL ) ||
         ( p_line->pi_underline_thickness == NULL ) )
     {
-        if( p_line->pi_underline_thickness )
-            free( p_line->pi_underline_thickness );
-        if( p_line->pi_underline_offset ) free( p_line->pi_underline_offset );
-        if( p_line->p_fg_rgb ) free( p_line->p_fg_rgb );
-        if( p_line->p_bg_rgb ) free( p_line->p_bg_rgb );
-        if( p_line->p_fg_bg_ratio ) free( p_line->p_fg_bg_ratio );
-        if( p_line->p_glyph_pos ) free( p_line->p_glyph_pos );
-        if( p_line->pp_glyphs ) free( p_line->pp_glyphs );
+        free( p_line->pi_underline_thickness );
+        free( p_line->pi_underline_offset );
+        free( p_line->p_fg_rgb );
+        free( p_line->p_bg_rgb );
+        free( p_line->p_fg_bg_ratio );
+        free( p_line->p_glyph_pos );
+        free( p_line->pp_glyphs );
         free( p_line );
         return NULL;
     }
     p_line->pp_glyphs[0] = NULL;
-    p_line->b_new_color_mode = VLC_FALSE;
+    p_line->b_new_color_mode = false;
 
     return p_line;
 }