All: change of text-renderer api. Now pf_render_text takes a subpicture and

a subpicture region, and returns a new region in the given subpicture.
freetype.c: additional cleanup (coding style, cosmetics)
parent 32d45977
...@@ -59,7 +59,7 @@ struct filter_t ...@@ -59,7 +59,7 @@ struct filter_t
subpicture_t * ( *pf_sub_filter ) ( filter_t *, mtime_t ); subpicture_t * ( *pf_sub_filter ) ( filter_t *, mtime_t );
/* pf_render_string maps to RenderText in freetype.c */ /* pf_render_string maps to RenderText in freetype.c */
subpicture_t * ( *pf_render_string ) ( filter_t *, block_t *, int, int, int ); subpicture_region_t *( *pf_render_string ) ( filter_t *, subpicture_t *, subpicture_region_t * );
/* /*
* Buffers allocation * Buffers allocation
......
...@@ -71,7 +71,7 @@ static int Create ( vlc_object_t * ); ...@@ -71,7 +71,7 @@ static int Create ( vlc_object_t * );
static void Destroy( vlc_object_t * ); static void Destroy( vlc_object_t * );
/* The RenderText call maps to pf_render_string, defined in vlc_filter.h */ /* The RenderText call maps to pf_render_string, defined in vlc_filter.h */
static subpicture_t *RenderText( filter_t *, block_t *, int, int, int ); static subpicture_region_t *RenderText( filter_t *, subpicture_t *, subpicture_region_t* );//block_t *, int, int, int );
static line_desc_t *NewLine( byte_t * ); static line_desc_t *NewLine( byte_t * );
/***************************************************************************** /*****************************************************************************
...@@ -153,7 +153,7 @@ struct line_desc_t ...@@ -153,7 +153,7 @@ struct line_desc_t
line_desc_t *p_next; line_desc_t *p_next;
}; };
static void Render ( filter_t *, subpicture_t *, subpicture_data_t *, uint8_t, static subpicture_region_t *Render ( filter_t *, subpicture_t *, subpicture_data_t *, uint8_t,
int, int, int ); int, int, int );
static void FreeString( subpicture_data_t * ); static void FreeString( subpicture_data_t * );
static void FreeLine( line_desc_t * ); static void FreeLine( line_desc_t * );
...@@ -328,8 +328,9 @@ static void Destroy( vlc_object_t *p_this ) ...@@ -328,8 +328,9 @@ static void Destroy( vlc_object_t *p_this )
***************************************************************************** *****************************************************************************
* This function merges the previously rendered freetype glyphs into a picture * This function merges the previously rendered freetype glyphs into a picture
*****************************************************************************/ *****************************************************************************/
static void Render( filter_t *p_filter, subpicture_t *p_spu, static subpicture_region_t *Render( filter_t *p_filter, subpicture_t *p_spu,
subpicture_data_t *p_string, uint8_t opacity, subpicture_data_t *p_string,
uint8_t opacity,
int red, int green, int blue) int red, int green, int blue)
{ {
filter_sys_t *p_sys = p_filter->p_sys; filter_sys_t *p_sys = p_filter->p_sys;
...@@ -338,6 +339,7 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu, ...@@ -338,6 +339,7 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu,
video_format_t fmt; video_format_t fmt;
int i, x, y, i_pitch; int i, x, y, i_pitch;
uint8_t i_y, i_u, i_v; /* YUV values, derived from incoming RGB */ uint8_t i_y, i_u, i_v; /* YUV values, derived from incoming RGB */
subpicture_region_t *p_region;
/* calculate text color components: */ /* calculate text color components: */
i_y = (uint8_t) ( ( 66 * red + 129 * green + 25 * blue + 128) >> 8) + 16; i_y = (uint8_t) ( ( 66 * red + 129 * green + 25 * blue + 128) >> 8) + 16;
...@@ -351,25 +353,25 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu, ...@@ -351,25 +353,25 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu,
fmt.i_width = fmt.i_visible_width = p_string->i_width + 2; fmt.i_width = fmt.i_visible_width = p_string->i_width + 2;
fmt.i_height = fmt.i_visible_height = p_string->i_height + 2; fmt.i_height = fmt.i_visible_height = p_string->i_height + 2;
fmt.i_x_offset = fmt.i_y_offset = 0; fmt.i_x_offset = fmt.i_y_offset = 0;
p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt ); p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt );
if( !p_spu->p_region ) if( !p_region )
{ {
msg_Err( p_filter, "cannot allocate SPU region" ); msg_Err( p_filter, "cannot allocate SPU region" );
return; return NULL;
} }
p_spu->p_region->i_x = p_spu->p_region->i_y = 0; p_region->i_x = p_region->i_y = 0;
p_y = p_spu->p_region->picture.Y_PIXELS; p_y = p_region->picture.Y_PIXELS;
p_u = p_spu->p_region->picture.U_PIXELS; p_u = p_region->picture.U_PIXELS;
p_v = p_spu->p_region->picture.V_PIXELS; p_v = p_region->picture.V_PIXELS;
p_a = p_spu->p_region->picture.A_PIXELS; p_a = p_region->picture.A_PIXELS;
i_pitch = p_spu->p_region->picture.Y_PITCH; i_pitch = p_region->picture.Y_PITCH;
/* Initialize the region pixels */ /* Initialize the region pixels */
memset( p_y, 0x00, i_pitch * p_spu->p_region->fmt.i_height ); memset( p_y, 0x00, i_pitch * p_region->fmt.i_height );
memset( p_u, 0x80, i_pitch * p_spu->p_region->fmt.i_height ); memset( p_u, 0x80, i_pitch * p_region->fmt.i_height );
memset( p_v, 0x80, i_pitch * p_spu->p_region->fmt.i_height ); memset( p_v, 0x80, i_pitch * p_region->fmt.i_height );
memset( p_a, 0x00, i_pitch * p_spu->p_region->fmt.i_height ); memset( p_a, 0x00, i_pitch * p_region->fmt.i_height );
#define pi_gamma p_sys->pi_gamma #define pi_gamma p_sys->pi_gamma
...@@ -433,6 +435,7 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu, ...@@ -433,6 +435,7 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu,
#undef pi_gamma #undef pi_gamma
} }
} }
return p_region;
} }
/** /**
...@@ -441,11 +444,11 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu, ...@@ -441,11 +444,11 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu,
* needed glyphs into memory. It is used as pf_add_string callback in * needed glyphs into memory. It is used as pf_add_string callback in
* the vout method by this module * the vout method by this module
*/ */
static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block, static subpicture_region_t *RenderText( filter_t *p_filter,
int font_color, int font_opacity, int font_size ) subpicture_t *p_subpic,
subpicture_region_t *p_region )
{ {
filter_sys_t *p_sys = p_filter->p_sys; filter_sys_t *p_sys = p_filter->p_sys;
subpicture_t *p_subpic = 0;
subpicture_data_t *p_string = 0; subpicture_data_t *p_string = 0;
line_desc_t *p_line = 0, *p_next = 0, *p_prev = 0; line_desc_t *p_line = 0, *p_next = 0, *p_prev = 0;
int i, i_pen_y, i_pen_x, i_error, i_glyph_index, i_previous; int i, i_pen_y, i_pen_x, i_error, i_glyph_index, i_previous;
...@@ -453,6 +456,8 @@ static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block, ...@@ -453,6 +456,8 @@ static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block,
int i_string_length; int i_string_length;
char *psz_string; char *psz_string;
vlc_iconv_t iconv_handle = (vlc_iconv_t)(-1); vlc_iconv_t iconv_handle = (vlc_iconv_t)(-1);
int i_font_color, i_font_opacity, i_font_size;
subpicture_region_t *p_res;
FT_BBox line; FT_BBox line;
FT_BBox glyph_size; FT_BBox glyph_size;
...@@ -460,9 +465,12 @@ static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block, ...@@ -460,9 +465,12 @@ static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block,
FT_Glyph tmp_glyph; FT_Glyph tmp_glyph;
/* Sanity check */ /* Sanity check */
if( !p_block ) return NULL; if( !p_region ) return NULL;
psz_string = p_block->p_buffer; psz_string = p_region->psz_text;
if( !psz_string || !*psz_string ) goto error; if( !psz_string || !*psz_string ) goto error;
i_font_color = p_region->i_font_color;
i_font_opacity = p_region->i_font_opacity;
i_font_size = p_region->i_font_size;
result.x = 0; result.x = 0;
result.y = 0; result.y = 0;
...@@ -471,15 +479,6 @@ static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block, ...@@ -471,15 +479,6 @@ static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block,
line.yMin = 0; line.yMin = 0;
line.yMax = 0; line.yMax = 0;
/* Create and initialize a subpicture */
p_subpic = p_filter->pf_sub_buffer_new( p_filter );
if( !p_subpic ) goto error;
p_subpic->i_start = p_block->i_pts;
p_subpic->i_stop = p_block->i_pts + p_block->i_length;
p_subpic->b_ephemer = (p_block->i_length == 0);
p_subpic->b_absolute = VLC_FALSE;
/* Create and initialize private data for the subpicture */ /* Create and initialize private data for the subpicture */
p_string = malloc( sizeof(subpicture_data_t) ); p_string = malloc( sizeof(subpicture_data_t) );
if( !p_string ) if( !p_string )
...@@ -511,13 +510,13 @@ static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block, ...@@ -511,13 +510,13 @@ static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block,
/* Set up the glyphs for the desired font size. By definition, /* 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 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 */ have failed. Using -1 as a flag to use the freetype-fontsize */
if ( font_size < 0 ) if ( i_font_size < 0 )
{ {
FT_Set_Pixel_Sizes( p_sys->p_face, 0, p_sys->i_font_size ); FT_Set_Pixel_Sizes( p_sys->p_face, 0, p_sys->i_font_size );
} }
else else
{ {
i_error = FT_Set_Pixel_Sizes( p_sys->p_face, 0, font_size ); i_error = FT_Set_Pixel_Sizes( p_sys->p_face, 0, i_font_size );
if( i_error ) if( i_error )
{ {
msg_Warn( p_filter, "Invalid font size to RenderText, using %d", msg_Warn( p_filter, "Invalid font size to RenderText, using %d",
...@@ -707,38 +706,36 @@ static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block, ...@@ -707,38 +706,36 @@ static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block,
#undef face #undef face
#undef glyph #undef glyph
/* check to see whether to use the default color/opacity, or another one: */ /* check to see whether to use the default color/opacity, or another one: */
if( font_color < 0 ) if( i_font_color < 0 )
{ {
p_sys->i_blue = p_sys->i_font_color & 0x000000FF; p_sys->i_blue = p_sys->i_font_color & 0x000000FF;
p_sys->i_green = (p_sys->i_font_color & 0x0000FF00)/256; p_sys->i_green = ( p_sys->i_font_color & 0x0000FF00 ) >> 8;
p_sys->i_red = (p_sys->i_font_color & 0x00FF0000)/(256*256); p_sys->i_red = ( p_sys->i_font_color & 0x00FF0000 ) >> 16;
} }
else else
{ {
p_sys->i_blue = font_color & 0x000000FF; p_sys->i_blue = i_font_color & 0x000000FF;
p_sys->i_green = (font_color & 0x0000FF00)/256; p_sys->i_green = ( i_font_color & 0x0000FF00 ) >> 8;
p_sys->i_red = (font_color & 0x00FF0000)/(256*256); p_sys->i_red = ( i_font_color & 0x00FF0000 ) >> 16;
} }
if( font_opacity < 0 ) if( i_font_opacity < 0 )
{ {
p_sys->i_opacity = p_sys->i_font_opacity; p_sys->i_opacity = p_sys->i_font_opacity;
} }
else else
{ {
p_sys->i_opacity = (uint8_t) ( font_opacity & 0x000000FF ); p_sys->i_opacity = (uint8_t)( i_font_opacity & 0x000000FF );
} }
Render( p_filter, p_subpic, p_string, p_sys->i_opacity, p_res = Render( p_filter, p_subpic, p_string, p_sys->i_opacity,
p_sys->i_red, p_sys->i_green, p_sys->i_blue ); p_sys->i_red, p_sys->i_green, p_sys->i_blue );
FreeString( p_string ); FreeString( p_string );
block_Release( p_block );
if( psz_unicode_orig ) free( psz_unicode_orig ); if( psz_unicode_orig ) free( psz_unicode_orig );
return p_subpic; return p_res;
error: error:
FreeString( p_string ); FreeString( p_string );
if( p_subpic ) p_filter->pf_sub_buffer_del( p_filter, p_subpic ); if( p_subpic ) p_filter->pf_sub_buffer_del( p_filter, p_subpic );
block_Release( p_block );
if( psz_unicode_orig ) free( psz_unicode_orig ); if( psz_unicode_orig ) free( psz_unicode_orig );
return NULL; return NULL;
} }
......
...@@ -553,33 +553,15 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, ...@@ -553,33 +553,15 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
{ {
/* TODO: do it in a less hacky way /* TODO: do it in a less hacky way
* (modify text renderer API) */ * (modify text renderer API) */
subpicture_t *p_subpic_tmp; subpicture_region_t *p_tmp_region;
subpicture_region_t tmp_region;
block_t *p_new_block =
block_New( p_spu, strlen(p_region->psz_text) + 1 );
if( p_new_block )
{
memcpy( p_new_block->p_buffer, p_region->psz_text,
p_new_block->i_buffer );
p_new_block->i_pts = p_new_block->i_dts =
p_subpic->i_start;
p_new_block->i_length =
p_subpic->i_start - p_subpic->i_stop;
/* the actual call to RenderText in freetype.c: */ /* the actual call to RenderText in freetype.c: */
p_subpic_tmp = p_spu->p_text->pf_render_string( p_tmp_region = p_spu->p_text->pf_render_string(
p_spu->p_text, p_new_block, p_spu->p_text, p_subpic, p_region );
p_region->i_font_color, p_region->i_font_opacity,
p_region->i_font_size);
if( p_subpic_tmp ) if( p_tmp_region )
{ {
tmp_region = *p_region; // p_subpic->pf_destroy_region( p_spu, p_region );
*p_region = *p_subpic_tmp->p_region; p_region = p_tmp_region;
p_region->p_next = tmp_region.p_next;
*p_subpic_tmp->p_region = tmp_region;
p_spu->p_text->pf_sub_buffer_del( p_spu->p_text,
p_subpic_tmp );
}
} }
} }
} }
...@@ -613,7 +595,6 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, ...@@ -613,7 +595,6 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
{ {
picture_t *p_pic; picture_t *p_pic;
p_spu->p_scale->fmt_in.video = p_region->fmt; p_spu->p_scale->fmt_in.video = p_region->fmt;
p_spu->p_scale->fmt_out.video = p_region->fmt; p_spu->p_scale->fmt_out.video = p_region->fmt;
......
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