Render the glyph for each character only once, and not once for each frame.

Should speed up things a bit.
parent 4c2181e9
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* freetype.c : Put text on the video, using freetype2 * freetype.c : Put text on the video, using freetype2
***************************************************************************** *****************************************************************************
* Copyright (C) 2002, 2003 VideoLAN * Copyright (C) 2002, 2003 VideoLAN
* $Id: freetype.c,v 1.2 2003/07/19 14:41:30 sigmunau Exp $ * $Id: freetype.c,v 1.3 2003/07/19 15:15:01 sigmunau Exp $
* *
* Authors: Sigmund Augdal <sigmunau@idi.ntnu.no> * Authors: Sigmund Augdal <sigmunau@idi.ntnu.no>
* *
...@@ -82,7 +82,7 @@ struct subpicture_sys_t ...@@ -82,7 +82,7 @@ struct subpicture_sys_t
/** The string associated with this subpicture */ /** The string associated with this subpicture */
byte_t *psz_text; byte_t *psz_text;
/** NULL-terminated list of glyphs making the string */ /** NULL-terminated list of glyphs making the string */
FT_Glyph *pp_glyphs; FT_BitmapGlyph *pp_glyphs;
/** list of relative positions for the glyphs */ /** list of relative positions for the glyphs */
FT_Vector *p_glyph_pos; FT_Vector *p_glyph_pos;
}; };
...@@ -206,7 +206,7 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -206,7 +206,7 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic,
const subpicture_t *p_subpic ) const subpicture_t *p_subpic )
{ {
subpicture_sys_t *p_string = p_subpic->p_sys; subpicture_sys_t *p_string = p_subpic->p_sys;
int i_plane, i_error,x,y,pen_x, pen_y; int i_plane, x, y, pen_x, pen_y;
unsigned int i; unsigned int i;
for( i_plane = 0 ; i_plane < p_pic->i_planes ; i_plane++ ) for( i_plane = 0 ; i_plane < p_pic->i_planes ; i_plane++ )
...@@ -241,19 +241,12 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -241,19 +241,12 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic,
{ {
if( p_string->pp_glyphs[i] ) if( p_string->pp_glyphs[i] )
{ {
FT_Glyph p_glyph = p_string->pp_glyphs[i]; FT_BitmapGlyph p_glyph = p_string->pp_glyphs[ i ];
FT_BitmapGlyph p_image; #define alpha p_vout->p_text_renderer_data->pi_gamma[ p_glyph->bitmap.buffer[ x + y * p_glyph->bitmap.width ] ]
i_error = FT_Glyph_To_Bitmap( &p_glyph, #define pixel p_in[ ( p_string->p_glyph_pos[ i ].y + pen_y + y - p_glyph->top ) * i_pitch+x + pen_x + p_string->p_glyph_pos[ i ].x + p_glyph->left ]
FT_RENDER_MODE_NORMAL, for(y = 0; y < p_glyph->bitmap.rows; y++ )
&p_string->p_glyph_pos[i],
0 );
if ( i_error ) continue;
p_image = (FT_BitmapGlyph)p_glyph;
#define alpha p_vout->p_text_renderer_data->pi_gamma[p_image->bitmap.buffer[x+ y*p_image->bitmap.width]]
#define pixel p_in[(p_string->p_glyph_pos[i].y + pen_y + y - p_image->top)*i_pitch+x+pen_x+p_string->p_glyph_pos[i].x+p_image->left]
for(y = 0; y < p_image->bitmap.rows; y++ )
{ {
for( x = 0; x < p_image->bitmap.width; x++ ) for( x = 0; x < p_glyph->bitmap.width; x++ )
{ {
// pixel = alpha; // pixel = alpha;
// pixel = (pixel^alpha)^pixel; // pixel = (pixel^alpha)^pixel;
...@@ -261,7 +254,6 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic, ...@@ -261,7 +254,6 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic,
( 255 * alpha >> 8 ); ( 255 * alpha >> 8 );
} }
} }
FT_Done_Glyph( p_glyph );
} }
} }
} }
...@@ -284,6 +276,7 @@ static int AddText ( vout_thread_t *p_vout, byte_t *psz_string, ...@@ -284,6 +276,7 @@ static int AddText ( vout_thread_t *p_vout, byte_t *psz_string,
FT_BBox line; FT_BBox line;
FT_BBox glyph_size; FT_BBox glyph_size;
FT_Vector result; FT_Vector result;
FT_Glyph tmp_glyph;
result.x = 0; result.x = 0;
result.y = 0; result.y = 0;
...@@ -380,14 +373,20 @@ static int AddText ( vout_thread_t *p_vout, byte_t *psz_string, ...@@ -380,14 +373,20 @@ static int AddText ( vout_thread_t *p_vout, byte_t *psz_string,
msg_Err( p_vout, "FT_Load_Glyph returned %d", i_error ); msg_Err( p_vout, "FT_Load_Glyph returned %d", i_error );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
i_error = FT_Get_Glyph( glyph, &p_string->pp_glyphs[ i ] ); i_error = FT_Get_Glyph( glyph, &tmp_glyph );
if ( i_error ) if ( i_error )
{ {
msg_Err( p_vout, "FT_Get_Glyph returned %d", i_error ); msg_Err( p_vout, "FT_Get_Glyph returned %d", i_error );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
FT_Glyph_Get_CBox( p_string->pp_glyphs[i], FT_Glyph_Get_CBox( tmp_glyph, ft_glyph_bbox_pixels, &glyph_size );
ft_glyph_bbox_pixels, &glyph_size ); i_error = FT_Glyph_To_Bitmap( &tmp_glyph,
FT_RENDER_MODE_NORMAL,
&p_string->p_glyph_pos[i],
1 );
if ( i_error ) continue;
p_string->pp_glyphs[ i ] = (FT_BitmapGlyph)tmp_glyph;
/* Do rest */ /* Do rest */
line.xMax = p_string->p_glyph_pos[i].x + glyph_size.xMax - glyph_size.xMin; line.xMax = p_string->p_glyph_pos[i].x + glyph_size.xMax - glyph_size.xMin;
line.yMax = __MAX( line.yMax, glyph_size.yMax ); line.yMax = __MAX( line.yMax, glyph_size.yMax );
...@@ -416,7 +415,7 @@ static void FreeString( subpicture_t *p_subpic ) ...@@ -416,7 +415,7 @@ static void FreeString( subpicture_t *p_subpic )
subpicture_sys_t *p_string = p_subpic->p_sys; subpicture_sys_t *p_string = p_subpic->p_sys;
for ( i = 0; p_string->pp_glyphs[ i ] != NULL; i++ ) for ( i = 0; p_string->pp_glyphs[ i ] != NULL; i++ )
{ {
FT_Done_Glyph( p_string->pp_glyphs[ i ] ); FT_Done_Glyph( (FT_Glyph)p_string->pp_glyphs[ i ] );
} }
free( p_string->psz_text ); free( p_string->psz_text );
free( p_string->p_glyph_pos ); free( p_string->p_glyph_pos );
......
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