Commit e2da2cb0 authored by Bernie Purcell's avatar Bernie Purcell

RGB and alpha --> ARGB - similar to freetype.c

Remove an imbrication in XML parsing, again similar to freetype.c
parent 69b82164
...@@ -63,7 +63,7 @@ static int RenderYUVA( filter_t *p_filter, subpicture_region_t *p_region, ...@@ -63,7 +63,7 @@ static int RenderYUVA( filter_t *p_filter, subpicture_region_t *p_region,
uint32_t i_runs, uint32_t *pi_run_lengths, uint32_t i_runs, uint32_t *pi_run_lengths,
ATSUStyle *pp_styles ); ATSUStyle *pp_styles );
static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size,
int i_font_color, int i_font_alpha, uint32_t i_font_color,
vlc_bool_t b_bold, vlc_bool_t b_italic, vlc_bool_t b_bold, vlc_bool_t b_italic,
vlc_bool_t b_uline ); vlc_bool_t b_uline );
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
...@@ -91,8 +91,7 @@ struct font_stack_t ...@@ -91,8 +91,7 @@ struct font_stack_t
{ {
char *psz_name; char *psz_name;
int i_size; int i_size;
int i_color; uint32_t i_color;
int i_alpha;
font_stack_t *p_next; font_stack_t *p_next;
}; };
...@@ -382,7 +381,8 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out, ...@@ -382,7 +381,8 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
if( psz_utf16_str != NULL ) if( psz_utf16_str != NULL )
{ {
ATSUStyle p_style = CreateStyle( p_sys->psz_font_name, i_font_size, ATSUStyle p_style = CreateStyle( p_sys->psz_font_name, i_font_size,
i_font_color, i_font_alpha, (i_font_color & 0xfffffff) |
((i_font_alpha & 0xff) << 24),
VLC_FALSE, VLC_FALSE, VLC_FALSE ); VLC_FALSE, VLC_FALSE, VLC_FALSE );
if( p_style ) if( p_style )
{ {
...@@ -398,7 +398,7 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out, ...@@ -398,7 +398,7 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
} }
static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, int i_font_color, int i_font_alpha, static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, uint32_t i_font_color,
vlc_bool_t b_bold, vlc_bool_t b_italic, vlc_bool_t b_uline ) vlc_bool_t b_bold, vlc_bool_t b_italic, vlc_bool_t b_uline )
{ {
ATSUStyle p_style; ATSUStyle p_style;
...@@ -408,7 +408,7 @@ static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, int i_font_co ...@@ -408,7 +408,7 @@ static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, int i_font_co
float f_red = (float)(( i_font_color & 0x00FF0000 ) >> 16) / 255.0; float f_red = (float)(( i_font_color & 0x00FF0000 ) >> 16) / 255.0;
float f_green = (float)(( i_font_color & 0x0000FF00 ) >> 8) / 255.0; float f_green = (float)(( i_font_color & 0x0000FF00 ) >> 8) / 255.0;
float f_blue = (float)( i_font_color & 0x000000FF ) / 255.0; float f_blue = (float)( i_font_color & 0x000000FF ) / 255.0;
float f_alpha = ( 255.0 - (float)i_font_alpha) / 255.0; float f_alpha = ( 255.0 - (float)(( i_font_color & 0xFF000000 ) >> 24)) / 255.0;
ATSUFontID font; ATSUFontID font;
Fixed font_size = IntToFixed( i_font_size ); Fixed font_size = IntToFixed( i_font_size );
...@@ -451,7 +451,7 @@ static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, int i_font_co ...@@ -451,7 +451,7 @@ static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, int i_font_co
} }
static int PushFont( font_stack_t **p_font, const char *psz_name, int i_size, static int PushFont( font_stack_t **p_font, const char *psz_name, int i_size,
int i_color, int i_alpha ) uint32_t i_color )
{ {
font_stack_t *p_new; font_stack_t *p_new;
...@@ -471,7 +471,6 @@ static int PushFont( font_stack_t **p_font, const char *psz_name, int i_size, ...@@ -471,7 +471,6 @@ static int PushFont( font_stack_t **p_font, const char *psz_name, int i_size,
p_new->i_size = i_size; p_new->i_size = i_size;
p_new->i_color = i_color; p_new->i_color = i_color;
p_new->i_alpha = i_alpha;
if( !*p_font ) if( !*p_font )
{ {
...@@ -518,7 +517,7 @@ static int PopFont( font_stack_t **p_font ) ...@@ -518,7 +517,7 @@ static int PopFont( font_stack_t **p_font )
} }
static int PeekFont( font_stack_t **p_font, char **psz_name, int *i_size, static int PeekFont( font_stack_t **p_font, char **psz_name, int *i_size,
int *i_color, int *i_alpha ) uint32_t *i_color )
{ {
font_stack_t *p_last; font_stack_t *p_last;
...@@ -533,7 +532,6 @@ static int PeekFont( font_stack_t **p_font, char **psz_name, int *i_size, ...@@ -533,7 +532,6 @@ static int PeekFont( font_stack_t **p_font, char **psz_name, int *i_size,
*psz_name = p_last->psz_name; *psz_name = p_last->psz_name;
*i_size = p_last->i_size; *i_size = p_last->i_size;
*i_color = p_last->i_color; *i_color = p_last->i_color;
*i_alpha = p_last->i_alpha;
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -544,22 +542,101 @@ static ATSUStyle GetStyleFromFontStack( filter_sys_t *p_sys, font_stack_t **p_fo ...@@ -544,22 +542,101 @@ static ATSUStyle GetStyleFromFontStack( filter_sys_t *p_sys, font_stack_t **p_fo
ATSUStyle p_style = NULL; ATSUStyle p_style = NULL;
char *psz_fontname = NULL; char *psz_fontname = NULL;
int i_font_color = p_sys->i_font_color; uint32_t i_font_color = p_sys->i_font_color;
int i_font_alpha = 0;
int i_font_size = p_sys->i_font_size; int i_font_size = p_sys->i_font_size;
if( VLC_SUCCESS == PeekFont( p_fonts, &psz_fontname, &i_font_size, &i_font_color, &i_font_alpha ) ) if( VLC_SUCCESS == PeekFont( p_fonts, &psz_fontname, &i_font_size, &i_font_color ) )
{ {
p_style = CreateStyle( psz_fontname, i_font_size, i_font_color, i_font_alpha, p_style = CreateStyle( psz_fontname, i_font_size, i_font_color,
b_bold, b_italic, b_uline ); b_bold, b_italic, b_uline );
} }
return p_style; return p_style;
} }
static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader, static int HandleFontAttributes( xml_reader_t *p_xml_reader,
text_style_t *p_font_style, UniChar *psz_text, int *pi_len, font_stack_t **p_fonts )
uint32_t *pi_runs, uint32_t **ppi_run_lengths, {
ATSUStyle **ppp_styles) 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_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_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 )
{ {
filter_sys_t *p_sys = p_filter->p_sys; filter_sys_t *p_sys = p_filter->p_sys;
UniChar *psz_text_orig = psz_text; UniChar *psz_text_orig = psz_text;
...@@ -577,8 +654,8 @@ static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader, ...@@ -577,8 +654,8 @@ static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader,
rv = PushFont( &p_fonts, rv = PushFont( &p_fonts,
p_font_style->psz_fontname, p_font_style->psz_fontname,
p_font_style->i_font_size, p_font_style->i_font_size,
p_font_style->i_font_color, (p_font_style->i_font_color & 0xffffff) |
p_font_style->i_font_alpha ); ((p_font_style->i_font_alpha & 0xff) << 24) );
if( p_font_style->i_style_flags & STYLE_BOLD ) if( p_font_style->i_style_flags & STYLE_BOLD )
b_bold = VLC_TRUE; b_bold = VLC_TRUE;
...@@ -592,7 +669,7 @@ static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader, ...@@ -592,7 +669,7 @@ static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader,
rv = PushFont( &p_fonts, rv = PushFont( &p_fonts,
p_sys->psz_font_name, p_sys->psz_font_name,
p_sys->i_font_size, p_sys->i_font_size,
p_sys->i_font_color, 0 ); p_sys->i_font_color );
} }
if( rv != VLC_SUCCESS ) if( rv != VLC_SUCCESS )
return rv; return rv;
...@@ -625,78 +702,13 @@ static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader, ...@@ -625,78 +702,13 @@ static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader,
if( psz_node ) if( psz_node )
{ {
if( !strcasecmp( "font", psz_node ) ) if( !strcasecmp( "font", psz_node ) )
{ rv = HandleFontAttributes( p_xml_reader, &p_fonts );
char *psz_fontname = NULL;
int 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, &i_font_alpha ))
{
psz_fontname = strdup( psz_fontname );
}
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 );
}
}
PushFont( &p_fonts, psz_fontname, i_font_size, i_font_color, i_font_alpha );
free( psz_fontname );
}
else if( !strcasecmp( "b", psz_node ) ) else if( !strcasecmp( "b", psz_node ) )
{
b_bold = VLC_TRUE; b_bold = VLC_TRUE;
}
else if( !strcasecmp( "i", psz_node ) ) else if( !strcasecmp( "i", psz_node ) )
{
b_italic = VLC_TRUE; b_italic = VLC_TRUE;
}
else if( !strcasecmp( "u", psz_node ) ) else if( !strcasecmp( "u", psz_node ) )
{
b_uline = VLC_TRUE; b_uline = VLC_TRUE;
}
else if( !strcasecmp( "br", psz_node ) ) else if( !strcasecmp( "br", psz_node ) )
{ {
uint32_t i_string_length; uint32_t i_string_length;
......
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