static int Create ( vlc_object_t * );
static void Destroy( vlc_object_t * );
-static subpicture_t *RenderText( filter_t *, block_t * );
+/* The RenderText call maps to pf_render_string, defined in vlc_filter.h */
+static subpicture_t *RenderText( filter_t *, block_t *, int, int );
static line_desc_t *NewLine( byte_t * );
-static int FreetypeCallback( vlc_object_t *p_this, char const *psz_var,
- vlc_value_t oldval, vlc_value_t newval,
- void *p_data );
-
/*****************************************************************************
* Module descriptor
VLC_FALSE );
add_integer( "freetype-fontsize", 0, NULL, FONTSIZE_TEXT,
FONTSIZE_LONGTEXT, VLC_TRUE );
+ /* opacity valid on 0..255, with default 255 = fully opaque */
add_integer_with_range( "freetype-opacity", 255, 0, 255, NULL,
OPACITY_TEXT, OPACITY_LONGTEXT, VLC_FALSE );
- add_integer( "freetype-color", 0xFFFFFF, NULL, COLOR_TEXT, COLOR_LONGTEXT, VLC_TRUE );
+ /* hook to the color values list, with default 0x00ffffff = white */
+ add_integer( "freetype-color", 0x00FFFFFF, NULL, COLOR_TEXT, COLOR_LONGTEXT, VLC_TRUE );
change_integer_list( pi_color_values, ppsz_color_descriptions, 0 );
add_integer( "freetype-rel-fontsize", 16, NULL, FONTSIZER_TEXT,
FT_Library p_library; /* handle to library */
FT_Face p_face; /* handle to face object */
vlc_bool_t i_use_kerning;
- uint8_t i_opacity;
- uint8_t i_defaultopacity; /* freetype-opacity */
- uint8_t i_tempopacity; /* font-opacity dynamic changes */
- int i_tempcolor; /* font-color dynamic changes */
- int i_defaultcolor; /* freetype-color */
- int i_red, i_green, i_blue; /* color components */
+ uint8_t i_font_opacity; /* freetype-opacity */
+ int i_font_color; /* freetype-color */
+ int i_red, i_blue, i_green; /* function vars to render */
+ uint8_t i_opacity; /* function var to render */
uint8_t pi_gamma[256];
- vlc_bool_t b_need_color; /* flag for font color changes */
- vlc_bool_t b_need_opacity; /* flag for font opacity changes */
};
/*****************************************************************************
int i, i_error;
int i_fontsize = 0;
vlc_value_t val;
- vlc_object_t *p_input;
/* Allocate structure */
p_sys = malloc( sizeof( filter_sys_t ) );
p_sys->p_face = 0;
p_sys->p_library = 0;
- /* Hook used for callback variables */
- p_input = vlc_object_find( p_this, VLC_OBJECT_INPUT, FIND_ANYWHERE );
- if( !p_input )
- {
- return VLC_ENOOBJ;
- }
-
- /* accessible variables, to allow individual text subfilters to set their own values */
- p_sys->i_tempcolor = var_CreateGetInteger( p_input->p_libvlc , "font-color" );
- p_sys->i_tempopacity = var_CreateGetInteger( p_input->p_libvlc , "font-opacity" );
- var_AddCallback( p_input->p_libvlc, "font-color", FreetypeCallback, p_sys );
- var_AddCallback( p_input->p_libvlc, "font-opacity", FreetypeCallback, p_sys );
- vlc_object_release( p_input ); /* free the hook */
-
- /* default to opaque letters, white (all colors set to 255): */
- p_sys->i_opacity = 255;
- p_sys->i_defaultopacity = 255;
- p_sys->i_red = 255;
- p_sys->i_green = 255;
- p_sys->i_blue = 255;
- p_sys->i_defaultcolor = 0x00FFFFFF;
-
- /* miscellaneous initialization */
- p_sys->b_need_color = VLC_FALSE; /* inversion of true/false */
- p_sys->b_need_opacity = VLC_FALSE;
-
for( i = 0; i < 256; i++ )
{
p_sys->pi_gamma[i] = (uint8_t)( pow( (double)i * 255.0f, 0.5f ) );
VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_filter, "freetype-opacity", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
var_Get( p_filter, "freetype-opacity", &val );
- p_sys->i_opacity = __MAX( __MIN( val.i_int, 255 ), 0 );
- p_sys->i_defaultopacity = p_sys->i_opacity;
+ p_sys->i_font_opacity = __MAX( __MIN( val.i_int, 255 ), 0 );
var_Create( p_filter, "freetype-color", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Get( p_filter, "freetype-color", &val );
if ( ( val.i_int > -1 ) && ( val.i_int < 0x00FFFFFF ) ) /* valid range */
{
- p_sys->i_defaultcolor = val.i_int;
- p_sys->i_blue = val.i_int & 0x000000FF;
- p_sys->i_green = (val.i_int & 0x0000FF00)/256;
- p_sys->i_red = (val.i_int & 0x00FF0000)/(256*256);
+ p_sys->i_font_color = val.i_int;
}
else msg_Warn(p_filter, "Invalid freetype color specified, using white [0xFFFFFF]");
*****************************************************************************/
static void Destroy( vlc_object_t *p_this )
{
- vlc_object_t *p_input;
-
filter_t *p_filter = (filter_t *)p_this;
filter_sys_t *p_sys = p_filter->p_sys;
- p_input = vlc_object_find( p_this, VLC_OBJECT_INPUT, FIND_ANYWHERE );
- if( !p_input )
- {
- return;
- }
- var_Destroy( p_input->p_libvlc , "font-color" );
- var_Destroy( p_input->p_libvlc , "font-opacity" );
- vlc_object_release( p_input );
-
FT_Done_Face( p_sys->p_face );
FT_Done_FreeType( p_sys->p_library );
free( p_sys );
{
for( x = 0; x < p_glyph->bitmap.width; x++, i_bitmap_offset++ )
{
- p_y[i_offset + x] = i_y*pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]] *
- opacity / ( 256 * 256 );
+ p_y[i_offset + x] = i_y*opacity*pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]]/(256*256);
p_u[i_offset + x] = i_u;
p_v[i_offset + x] = i_v;
}
* needed glyphs into memory. It is used as pf_add_string callback in
* the vout method by this module
*/
-static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block )
+static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block,
+ int font_color, int font_opacity )
{
filter_sys_t *p_sys = p_filter->p_sys;
subpicture_t *p_subpic = 0;
#undef face
#undef glyph
-
/* check to see whether to use the default color/opacity, or another one: */
- if( !p_sys->b_need_color )
+ if( font_color < 0 )
{
- p_sys->i_blue = p_sys->i_tempcolor & 0x000000FF;
- p_sys->i_green = (p_sys->i_tempcolor & 0x0000FF00)/256;
- p_sys->i_red = (p_sys->i_tempcolor & 0x00FF0000)/(256*256);
+ p_sys->i_blue = p_sys->i_font_color & 0x000000FF;
+ p_sys->i_green = (p_sys->i_font_color & 0x0000FF00)/256;
+ p_sys->i_red = (p_sys->i_font_color & 0x00FF0000)/(256*256);
}
else
{
- p_sys->i_blue = p_sys->i_defaultcolor & 0x000000FF;
- p_sys->i_green = (p_sys->i_defaultcolor & 0x0000FF00)/256;
- p_sys->i_red = (p_sys->i_defaultcolor & 0x00FF0000)/(256*256);
- p_sys->b_need_color = VLC_FALSE;
- }
- if( !p_sys->b_need_opacity )
+ p_sys->i_blue = font_color & 0x000000FF;
+ p_sys->i_green = (font_color & 0x0000FF00)/256;
+ p_sys->i_red = (font_color & 0x00FF0000)/(256*256);
+ }
+ if( font_opacity < 0 )
{
- p_sys->i_opacity = p_sys->i_tempopacity;
+ p_sys->i_opacity = p_sys->i_font_opacity;
}
else
{
- p_sys->i_opacity = p_sys->i_defaultopacity;
- p_sys->b_need_opacity = VLC_FALSE;
+ p_sys->i_opacity = (uint8_t) ( font_opacity & 0x000000FF );
}
-
+
Render( p_filter, p_subpic, p_string, p_sys->i_opacity,
p_sys->i_red, p_sys->i_green, p_sys->i_blue );
FreeString( p_string );
return p_line;
}
-/**********************************************************************
- * Callback to update params on the fly
- **********************************************************************/
-static int FreetypeCallback( vlc_object_t *p_this, char const *psz_var,
- vlc_value_t oldval, vlc_value_t newval,
- void *p_data )
-{
- filter_sys_t *p_sys = (filter_sys_t *) p_data;
-
- if ( !strncmp( psz_var, "font-color", 8 ) )
- {
- p_sys->i_tempcolor = newval.i_int;
- p_sys->b_need_color = VLC_TRUE;
- }
- else if ( !strncmp( psz_var, "font-opacity", 8 ) )
- {
- p_sys->i_tempopacity = newval.i_int;
- p_sys->b_need_opacity = VLC_TRUE;
- }
- return VLC_SUCCESS;
-}