]> git.sesse.net Git - vlc/blobdiff - modules/misc/freetype.c
fix freetype compilation for WIN32 without HAVE_FONTCONFIG
[vlc] / modules / misc / freetype.c
index e8f9bbfc3c89a320a03016494df9d671845bef68..0f68c946fcbf2caa21b0f451a6afe1099bd484ad 100644 (file)
@@ -33,7 +33,6 @@
 
 #include <vlc_common.h>
 #include <vlc_plugin.h>
-#include <vlc_osd.h>
 #include <vlc_filter.h>
 #include <vlc_stream.h>
 #include <vlc_xml.h>
@@ -266,7 +265,7 @@ struct filter_sys_t
     int            i_display_height;
 #ifdef HAVE_FONTCONFIG
     char*          psz_fontfamily;
-    xml_t         *p_xml;
+    xml_reader_t  *p_xml;
 #endif
 
     input_attachment_t **pp_font_attachments;
@@ -305,7 +304,7 @@ static int Create( vlc_object_t *p_this )
     p_filter->p_sys = p_sys = malloc( sizeof( filter_sys_t ) );
     if( !p_sys )
         return VLC_ENOMEM;
- #ifdef HAVE_FONTCONFIG
+#ifdef HAVE_FONTCONFIG
     p_sys->psz_fontfamily = NULL;
     p_sys->p_xml = NULL;
 #endif
@@ -359,8 +358,8 @@ static int Create( vlc_object_t *p_this )
             _("Please wait while your font cache is rebuilt.\n"
                 "This should take less than a few minutes."), NULL );
 
-    if( p_dialog )
-        dialog_ProgressSet( p_dialog, NULL, 0.5 );
+/*    if( p_dialog )
+        dialog_ProgressSet( p_dialog, NULL, 0.5 ); */
 
     FcConfigBuildFonts( fcConfig );
     t2 = mdate();
@@ -368,7 +367,7 @@ static int Create( vlc_object_t *p_this )
 
     if( p_dialog )
     {
-        dialog_ProgressSet( p_dialog, NULL, 1.0 );
+//        dialog_ProgressSet( p_dialog, NULL, 1.0 );
         dialog_ProgressDestroy( p_dialog );
         p_dialog = NULL;
     }
@@ -480,11 +479,11 @@ error:
 #ifdef HAVE_FONTCONFIG
     if( fontmatch ) FcPatternDestroy( fontmatch );
     if( fontpattern ) FcPatternDestroy( fontpattern );
-#endif
 
 #ifdef WIN32
     if( p_dialog )
         dialog_ProgressDestroy( p_dialog );
+#endif
 #endif
 
     if( p_sys->p_face ) FT_Done_Face( p_sys->p_face );
@@ -515,7 +514,7 @@ static void Destroy( vlc_object_t *p_this )
     }
 
 #ifdef HAVE_FONTCONFIG
-    if( p_sys->p_xml ) xml_Delete( p_sys->p_xml );
+    if( p_sys->p_xml ) xml_ReaderDelete( p_sys->p_xml );
     free( p_sys->psz_fontfamily );
 #endif
 
@@ -535,44 +534,26 @@ static void Destroy( vlc_object_t *p_this )
 static int LoadFontsFromAttachments( filter_t *p_filter )
 {
     filter_sys_t         *p_sys = p_filter->p_sys;
-    input_thread_t       *p_input;
     input_attachment_t  **pp_attachments;
     int                   i_attachments_cnt;
-    int                   k;
-    int                   rv = VLC_SUCCESS;
 
-    p_input = (input_thread_t *)vlc_object_find( p_filter, VLC_OBJECT_INPUT, FIND_PARENT );
-    if( ! p_input )
+    if( filter_GetInputAttachments( p_filter, &pp_attachments, &i_attachments_cnt ) )
         return VLC_EGENERIC;
 
-    if( VLC_SUCCESS != input_Control( p_input, INPUT_GET_ATTACHMENTS, &pp_attachments, &i_attachments_cnt ))
-    {
-        vlc_object_release(p_input);
-        return VLC_EGENERIC;
-    }
-
     p_sys->i_font_attachments = 0;
     p_sys->pp_font_attachments = malloc( i_attachments_cnt * sizeof( input_attachment_t * ));
-    if(p_sys->pp_font_attachments )
-        rv = VLC_ENOMEM;
+    if( !p_sys->pp_font_attachments )
+        return VLC_ENOMEM;
 
-    for( k = 0; k < i_attachments_cnt; k++ )
+    for( int k = 0; k < i_attachments_cnt; k++ )
     {
         input_attachment_t *p_attach = pp_attachments[k];
 
-        if( p_sys->pp_font_attachments )
+        if( ( !strcmp( p_attach->psz_mime, "application/x-truetype-font" ) || // TTF
+              !strcmp( p_attach->psz_mime, "application/x-font-otf" ) ) &&    // OTF
+            p_attach->i_data > 0 && p_attach->p_data )
         {
-            if(( !strcmp( p_attach->psz_mime, "application/x-truetype-font" ) || // TTF
-                 !strcmp( p_attach->psz_mime, "application/x-font-otf" ) ) &&    // OTF
-               ( p_attach->i_data > 0 ) &&
-               ( p_attach->p_data != NULL ) )
-            {
-                p_sys->pp_font_attachments[ p_sys->i_font_attachments++ ] = p_attach;
-            }
-            else
-            {
-                vlc_input_attachment_Delete( p_attach );
-            }
+            p_sys->pp_font_attachments[ p_sys->i_font_attachments++ ] = p_attach;
         }
         else
         {
@@ -581,9 +562,7 @@ static int LoadFontsFromAttachments( filter_t *p_filter )
     }
     free( pp_attachments );
 
-    vlc_object_release(p_input);
-
-    return rv;
+    return VLC_SUCCESS;
 }
 
 /*****************************************************************************
@@ -1242,12 +1221,16 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
         }
         p_line->p_glyph_pos[ i ].x = i_pen_x;
         p_line->p_glyph_pos[ i ].y = i_pen_y;
-        i_error = FT_Load_Glyph( face, i_glyph_index, FT_LOAD_DEFAULT );
+        i_error = FT_Load_Glyph( face, i_glyph_index, FT_LOAD_NO_BITMAP | FT_LOAD_DEFAULT );
         if( i_error )
         {
-            msg_Err( p_filter, "unable to render text FT_Load_Glyph returned"
-                               " %d", i_error );
-            goto error;
+               i_error = FT_Load_Glyph( face, i_glyph_index, FT_LOAD_DEFAULT );
+               if( i_error )
+               {
+                   msg_Err( p_filter, "unable to render text FT_Load_Glyph returned"
+                                      " %d", i_error );
+                   goto error;
+               }
         }
         i_error = FT_Get_Glyph( glyph, &tmp_glyph );
         if( i_error )
@@ -1528,13 +1511,17 @@ static int RenderTag( filter_t *p_filter, FT_Face p_face, int i_font_color,
         p_line->p_glyph_pos[ i ].x = *pi_pen_x;
         p_line->p_glyph_pos[ i ].y = i_pen_y;
 
-        i_error = FT_Load_Glyph( p_face, i_glyph_index, FT_LOAD_DEFAULT );
+        i_error = FT_Load_Glyph( p_face, i_glyph_index, FT_LOAD_NO_BITMAP | FT_LOAD_DEFAULT );
         if( i_error )
         {
-            msg_Err( p_filter,
-                   "unable to render text FT_Load_Glyph returned %d", i_error );
-            p_line->pp_glyphs[ i ] = NULL;
-            return VLC_EGENERIC;
+               i_error = FT_Load_Glyph( p_face, i_glyph_index, FT_LOAD_DEFAULT );
+               if( i_error )
+               {
+                   msg_Err( p_filter,
+                          "unable to render text FT_Load_Glyph returned %d", i_error );
+                   p_line->pp_glyphs[ i ] = NULL;
+                   return VLC_EGENERIC;
+               }
         }
 
         /* Do synthetic styling now that Freetype supports it;
@@ -2203,7 +2190,6 @@ static int RenderHtml( filter_t *p_filter, subpicture_region_t *p_region_out,
 {
     int          rv = VLC_SUCCESS;
     stream_t     *p_sub = NULL;
-    xml_reader_t *p_xml_reader = NULL;
 
     if( !p_region_in || !p_region_in->psz_html )
         return VLC_EGENERIC;
@@ -2215,114 +2201,106 @@ static int RenderHtml( filter_t *p_filter, subpicture_region_t *p_region_out,
                               (uint8_t *) p_region_in->psz_html,
                               strlen( p_region_in->psz_html ),
                               true );
-    if( p_sub )
+    if( unlikely(p_sub == NULL) )
+        return VLC_SUCCESS;
+
+    xml_reader_t *p_xml_reader = p_filter->p_sys->p_xml;
+    bool b_karaoke = false;
+
+    if( !p_xml_reader )
+        p_xml_reader = xml_ReaderCreate( p_filter, p_sub );
+    else
+        p_xml_reader = xml_ReaderReset( p_xml_reader, p_sub );
+
+    p_filter->p_sys->p_xml = p_xml_reader;
+    if( p_xml_reader )
     {
-        if( !p_filter->p_sys->p_xml ) p_filter->p_sys->p_xml = xml_Create( p_filter );
-        if( p_filter->p_sys->p_xml )
+        /* Look for Root Node */
+        if( xml_ReaderRead( p_xml_reader ) == 1 )
         {
-            bool b_karaoke = false;
+            char *psz_node = xml_ReaderName( p_xml_reader );
 
-            p_xml_reader = xml_ReaderCreate( p_filter->p_sys->p_xml, p_sub );
-            if( p_xml_reader )
+            if( !strcasecmp( "karaoke", psz_node ) )
             {
-                /* Look for Root Node */
-                if( xml_ReaderRead( p_xml_reader ) == 1 )
-                {
-                    char *psz_node = xml_ReaderName( p_xml_reader );
-
-                    if( !strcasecmp( "karaoke", psz_node ) )
-                    {
-                        /* 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", true );
-                        b_karaoke = true;
-                    }
-                    else if( !strcasecmp( "text", psz_node ) )
-                    {
-                        b_karaoke = false;
-                    }
-                    else
-                    {
-                        /* Only text and karaoke tags are supported */
-                        msg_Dbg( p_filter, "Unsupported top-level tag '%s' ignored.", psz_node );
-                        xml_ReaderDelete( p_filter->p_sys->p_xml, p_xml_reader );
-                        p_xml_reader = NULL;
-                        rv = VLC_EGENERIC;
-                    }
-
-                    free( psz_node );
-                }
+                /* 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", true );
+                b_karaoke = true;
             }
-
-            if( p_xml_reader )
+            else if( !strcasecmp( "text", psz_node ) )
             {
-                uint32_t   *psz_text;
-                int         i_len = 0;
-                uint32_t    i_runs = 0;
-                uint32_t    i_k_runs = 0;
-                uint32_t   *pi_run_lengths = NULL;
-                uint32_t   *pi_k_run_lengths = NULL;
-                uint32_t   *pi_k_durations = NULL;
-                ft_style_t  **pp_styles = NULL;
-                FT_Vector    result;
-                line_desc_t  *p_lines = NULL;
-
-                psz_text = (uint32_t *)malloc( strlen( p_region_in->psz_html ) *
-                                                sizeof( uint32_t ) );
-                if( psz_text )
-                {
-                    uint32_t k;
-
-                    rv = ProcessNodes( p_filter, p_xml_reader,
-                                  p_region_in->p_style, psz_text, &i_len,
-                                  &i_runs, &pi_run_lengths, &pp_styles,
+                b_karaoke = false;
+            }
+            else
+            {
+                /* Only text and karaoke tags are supported */
+                msg_Dbg( p_filter, "Unsupported top-level tag '%s' ignored.", psz_node );
+                p_filter->p_sys->p_xml = xml_ReaderReset( p_xml_reader, NULL );
+                p_xml_reader = NULL;
+                rv = VLC_EGENERIC;
+            }
 
-                                  b_karaoke, &i_k_runs, &pi_k_run_lengths,
-                                  &pi_k_durations );
+            free( psz_node );
+        }
+    }
 
-                    p_region_out->i_x = p_region_in->i_x;
-                    p_region_out->i_y = p_region_in->i_y;
+    if( p_xml_reader )
+    {
+        uint32_t   *psz_text;
+        int         i_len = 0;
+        uint32_t    i_runs = 0;
+        uint32_t    i_k_runs = 0;
+        uint32_t   *pi_run_lengths = NULL;
+        uint32_t   *pi_k_run_lengths = NULL;
+        uint32_t   *pi_k_durations = NULL;
+        ft_style_t  **pp_styles = NULL;
+        FT_Vector    result;
+        line_desc_t  *p_lines = NULL;
+
+        psz_text = (uint32_t *)malloc( strlen( p_region_in->psz_html ) *
+                                       sizeof( uint32_t ) );
+        if( psz_text )
+        {
+            rv = ProcessNodes( p_filter, p_xml_reader,
+                               p_region_in->p_style, psz_text, &i_len,
+                               &i_runs, &pi_run_lengths, &pp_styles,
+                               b_karaoke, &i_k_runs, &pi_k_run_lengths,
+                               &pi_k_durations );
 
-                    if(( rv == VLC_SUCCESS ) && ( i_len > 0 ))
-                    {
-                        rv = ProcessLines( p_filter, psz_text, i_len, i_runs,
-                                pi_run_lengths, pp_styles, &p_lines, &result,
-                                b_karaoke, i_k_runs, pi_k_run_lengths,
-                                pi_k_durations );
-                    }
+            p_region_out->i_x = p_region_in->i_x;
+            p_region_out->i_y = p_region_in->i_y;
 
-                    for( k=0; k<i_runs; k++)
-                        DeleteStyle( pp_styles[k] );
-                    free( pp_styles );
-                    free( pi_run_lengths );
-                    free( psz_text );
+            if(( rv == VLC_SUCCESS ) && ( i_len > 0 ))
+            {
+                rv = ProcessLines( p_filter, psz_text, i_len, i_runs,
+                                   pi_run_lengths, pp_styles, &p_lines,
+                                   &result, b_karaoke, i_k_runs,
+                                   pi_k_run_lengths, pi_k_durations );
+            }
 
-                    /* Don't attempt to render text that couldn't be layed out
-                     * properly.
-                     */
-                    if(( rv == VLC_SUCCESS ) && ( i_len > 0 ))
-                    {
-                        if( var_InheritBool( p_filter, "freetype-yuvp" ) )
-                        {
-                            Render( p_filter, p_region_out, p_lines,
-                                    result.x, result.y );
-                        }
-                        else
-                        {
-                            RenderYUVA( p_filter, p_region_out, p_lines,
-                                    result.x, result.y );
-                        }
-                    }
-                }
-                FreeLines( p_lines );
+            for( uint_fast32_t k=0; k<i_runs; k++)
+                 DeleteStyle( pp_styles[k] );
+            free( pp_styles );
+            free( pi_run_lengths );
+            free( psz_text );
 
-                xml_ReaderDelete( p_filter->p_sys->p_xml, p_xml_reader );
+            /* Don't attempt to render text that couldn't be layed out
+             * properly. */
+            if(( rv == VLC_SUCCESS ) && ( i_len > 0 ))
+            {
+                if( var_InheritBool( p_filter, "freetype-yuvp" ) )
+                    Render( p_filter, p_region_out, p_lines,
+                            result.x, result.y );
+                else
+                    RenderYUVA( p_filter, p_region_out, p_lines,
+                                result.x, result.y );
             }
         }
-        stream_Delete( p_sub );
+        p_filter->p_sys->p_xml = xml_ReaderReset( p_xml_reader, NULL );
+        FreeLines( p_lines );
     }
-
+    stream_Delete( p_sub );
     return rv;
 }