Commit f0c25f96 authored by Gildas Bazin's avatar Gildas Bazin

* modules/misc/freetype.c: handle size change properly.

parent ce9f5deb
...@@ -75,6 +75,8 @@ static int RenderText( filter_t *, subpicture_region_t *, ...@@ -75,6 +75,8 @@ static int RenderText( filter_t *, subpicture_region_t *,
subpicture_region_t * ); subpicture_region_t * );
static line_desc_t *NewLine( byte_t * ); static line_desc_t *NewLine( byte_t * );
static int SetFontSize( filter_t *, int );
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
*****************************************************************************/ *****************************************************************************/
...@@ -170,6 +172,9 @@ struct filter_sys_t ...@@ -170,6 +172,9 @@ struct filter_sys_t
uint8_t i_font_opacity; uint8_t i_font_opacity;
int i_font_color; int i_font_color;
int i_font_size; int i_font_size;
int i_default_font_size;
int i_display_height;
}; };
/***************************************************************************** /*****************************************************************************
...@@ -186,7 +191,7 @@ static int Create( vlc_object_t *p_this ) ...@@ -186,7 +191,7 @@ static int Create( vlc_object_t *p_this )
vlc_value_t val; vlc_value_t val;
/* Allocate structure */ /* Allocate structure */
p_sys = malloc( sizeof( filter_sys_t ) ); p_filter->p_sys = p_sys = malloc( sizeof( filter_sys_t ) );
if( !p_sys ) if( !p_sys )
{ {
msg_Err( p_filter, "out of memory" ); msg_Err( p_filter, "out of memory" );
...@@ -195,6 +200,7 @@ static int Create( vlc_object_t *p_this ) ...@@ -195,6 +200,7 @@ static int Create( vlc_object_t *p_this )
p_sys->p_face = 0; p_sys->p_face = 0;
p_sys->p_library = 0; p_sys->p_library = 0;
p_sys->i_font_size = 0; p_sys->i_font_size = 0;
p_sys->i_display_height = 0;
var_Create( p_filter, "freetype-font", var_Create( p_filter, "freetype-font",
VLC_VAR_STRING | VLC_VAR_DOINHERIT ); VLC_VAR_STRING | VLC_VAR_DOINHERIT );
...@@ -258,34 +264,12 @@ static int Create( vlc_object_t *p_this ) ...@@ -258,34 +264,12 @@ static int Create( vlc_object_t *p_this )
p_sys->i_use_kerning = FT_HAS_KERNING( p_sys->p_face ); p_sys->i_use_kerning = FT_HAS_KERNING( p_sys->p_face );
var_Get( p_filter, "freetype-fontsize", &val ); var_Get( p_filter, "freetype-fontsize", &val );
if( val.i_int ) p_sys->i_default_font_size = val.i_int;
{ if( SetFontSize( p_filter, 0 ) != VLC_SUCCESS ) goto error;
p_sys->i_font_size = val.i_int;
}
else
{
var_Get( p_filter, "freetype-rel-fontsize", &val );
p_sys->i_font_size = (int)p_filter->fmt_out.video.i_height / val.i_int;
}
if( p_sys->i_font_size <= 0 )
{
msg_Warn( p_filter, "Invalid fontsize, using 12" );
p_sys->i_font_size = 12;
}
msg_Dbg( p_filter, "Using fontsize: %i", p_sys->i_font_size );
i_error = FT_Set_Pixel_Sizes( p_sys->p_face, 0, p_sys->i_font_size );
if( i_error )
{
msg_Err( p_filter, "couldn't set font size to %d", p_sys->i_font_size );
goto error;
}
if( psz_fontfile ) free( psz_fontfile ); if( psz_fontfile ) free( psz_fontfile );
p_filter->pf_render_text = RenderText; p_filter->pf_render_text = RenderText;
p_filter->p_sys = p_sys;
return VLC_SUCCESS; return VLC_SUCCESS;
error: error:
...@@ -467,7 +451,7 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out, ...@@ -467,7 +451,7 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
if( !i_font_alpha ) i_font_alpha = 255 - p_sys->i_font_opacity; if( !i_font_alpha ) i_font_alpha = 255 - p_sys->i_font_opacity;
i_font_size = __MAX( __MIN( p_region_in->i_text_size, 255 ), 0 ); i_font_size = __MAX( __MIN( p_region_in->i_text_size, 255 ), 0 );
if( !i_font_size ) i_font_size = p_sys->i_font_size; SetFontSize( p_filter, i_font_size );
i_red = ( i_font_color & 0x00FF0000 ) >> 16; i_red = ( i_font_color & 0x00FF0000 ) >> 16;
i_green = ( i_font_color & 0x0000FF00 ) >> 8; i_green = ( i_font_color & 0x0000FF00 ) >> 8;
...@@ -494,24 +478,6 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out, ...@@ -494,24 +478,6 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
goto error; goto error;
} }
/* Set up the glyphs for the desired font size. By definition,
p_sys->i_font_size is a valid value, else the initial Create would
have failed. Using -1 as a flag to use the freetype-fontsize */
if ( i_font_size < 0 )
{
FT_Set_Pixel_Sizes( p_sys->p_face, 0, p_sys->i_font_size );
}
else
{
i_error = FT_Set_Pixel_Sizes( p_sys->p_face, 0, i_font_size );
if( i_error )
{
msg_Warn( p_filter, "Invalid font size to RenderText, using %d",
p_sys->i_font_size );
FT_Set_Pixel_Sizes( p_sys->p_face, 0, p_sys->i_font_size );
}
}
{ {
char *p_in_buffer, *p_out_buffer; char *p_in_buffer, *p_out_buffer;
size_t i_in_bytes, i_out_bytes, i_out_bytes_left, i_ret; size_t i_in_bytes, i_out_bytes, i_out_bytes_left, i_ret;
...@@ -753,3 +719,48 @@ static line_desc_t *NewLine( byte_t *psz_string ) ...@@ -753,3 +719,48 @@ static line_desc_t *NewLine( byte_t *psz_string )
return p_line; return p_line;
} }
static int SetFontSize( filter_t *p_filter, int i_size )
{
filter_sys_t *p_sys = p_filter->p_sys;
if( i_size && i_size == p_sys->i_font_size ) return VLC_SUCCESS;
if( !i_size )
{
vlc_value_t val;
if( !p_sys->i_default_font_size &&
p_sys->i_display_height == (int)p_filter->fmt_out.video.i_height )
return VLC_SUCCESS;
if( p_sys->i_default_font_size )
{
i_size = p_sys->i_default_font_size;
}
else
{
var_Get( p_filter, "freetype-rel-fontsize", &val );
i_size = (int)p_filter->fmt_out.video.i_height / val.i_int;
p_filter->p_sys->i_display_height =
p_filter->fmt_out.video.i_height;
}
if( i_size <= 0 )
{
msg_Warn( p_filter, "Invalid fontsize, using 12" );
i_size = 12;
}
msg_Dbg( p_filter, "Using fontsize: %i", i_size );
}
p_sys->i_font_size = i_size;
if( FT_Set_Pixel_Sizes( p_sys->p_face, 0, i_size ) )
{
msg_Err( p_filter, "couldn't set font size to %d", i_size );
return VLC_EGENERIC;
}
return VLC_SUCCESS;
}
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