+ int rv;
+ char *psz_fontname = NULL;
+ uint32_t i_font_color = 0xffffff;
+ int i_font_alpha = 0;
+ int i_font_size = 24;
+
+ // Default all attributes to the top font in the stack -- in case not
+ // all attributes are specified in the sub-font
+ if( VLC_SUCCESS == PeekFont( p_fonts,
+ &psz_fontname,
+ &i_font_size,
+ &i_font_color ))
+ {
+ psz_fontname = strdup( psz_fontname );
+ i_font_size = i_font_size * 1000 / i_scale;
+ }
+ i_font_alpha = (i_font_color >> 24) & 0xff;
+ i_font_color &= 0x00ffffff;
+
+ while ( xml_ReaderNextAttr( p_xml_reader ) == VLC_SUCCESS )
+ {
+ char *psz_name = xml_ReaderName( p_xml_reader );
+ char *psz_value = xml_ReaderValue( p_xml_reader );
+
+ if( psz_name && psz_value )
+ {
+ if( !strcasecmp( "face", psz_name ) )
+ {
+ if( psz_fontname ) free( psz_fontname );
+ psz_fontname = strdup( psz_value );
+ }
+ else if( !strcasecmp( "size", psz_name ) )
+ {
+ if( ( *psz_value == '+' ) || ( *psz_value == '-' ) )
+ {
+ int i_value = atoi( psz_value );
+
+ if( ( i_value >= -5 ) && ( i_value <= 5 ) )
+ i_font_size += ( i_value * i_font_size ) / 10;
+ else if( i_value < -5 )
+ i_font_size = - i_value;
+ else if( i_value > 5 )
+ i_font_size = i_value;
+ }
+ else
+ i_font_size = atoi( psz_value );
+ }
+ else if( !strcasecmp( "color", psz_name ) &&
+ ( psz_value[0] == '#' ) )
+ {
+ i_font_color = strtol( psz_value + 1, NULL, 16 );
+ i_font_color &= 0x00ffffff;
+ }
+ else if( !strcasecmp( "alpha", psz_name ) &&
+ ( psz_value[0] == '#' ) )
+ {
+ i_font_alpha = strtol( psz_value + 1, NULL, 16 );
+ i_font_alpha &= 0xff;
+ }
+ free( psz_name );
+ free( psz_value );
+ }
+ }
+ rv = PushFont( p_fonts,
+ psz_fontname,
+ i_font_size * i_scale / 1000,
+ (i_font_color & 0xffffff) | ((i_font_alpha & 0xff) << 24) );
+
+ free( psz_fontname );
+
+ return rv;
+}
+
+static int ProcessNodes( filter_t *p_filter,
+ xml_reader_t *p_xml_reader,
+ text_style_t *p_font_style,
+ UniChar *psz_text,
+ int *pi_len,
+
+ uint32_t *pi_runs,
+ uint32_t **ppi_run_lengths,
+ ATSUStyle **ppp_styles )
+{
+ int rv = VLC_SUCCESS;