Commit 223ebac6 authored by Mark Moriarty's avatar Mark Moriarty

freetype.c Change opacity to 0...255, add --freetype-color hex_RGB shortcut

parent 20f007d0
...@@ -82,9 +82,12 @@ static line_desc_t *NewLine( byte_t * ); ...@@ -82,9 +82,12 @@ static line_desc_t *NewLine( byte_t * );
#define FONTSIZE_LONGTEXT N_("The size of the fonts used by the osd module. " \ #define FONTSIZE_LONGTEXT N_("The size of the fonts used by the osd module. " \
"If set to something different than 0 this option will override the " \ "If set to something different than 0 this option will override the " \
"relative font size " ) "relative font size " )
#define OPACITY_TEXT N_("Opacity, 0..100%") #define OPACITY_TEXT N_("Opacity, 0..255")
#define OPACITY_LONGTEXT N_("The opacity (inverse of transparency) of overlay text. " \ #define OPACITY_LONGTEXT N_("The opacity (inverse of transparency) of overlay text. " \
"0 = totally transparent, 100 = totally opaque. " ) "0 = totally transparent, 255 = totally opaque. " )
#define COLOR_TEXT N_("Color, RGB, 0x000000 - 0xFFFFFF")
#define COLOR_LONGTEXT N_("The color of overlay text. 1 byte for each color, hexadecimal." \
"#000000 = all colors off, 0xFF0000 = just Red, 0xFFFFFF = all color on [White]" )
#define FONTSIZER_TEXT N_("Font size") #define FONTSIZER_TEXT N_("Font size")
#define FONTSIZER_LONGTEXT N_("The size of the fonts used by the osd module" ) #define FONTSIZER_LONGTEXT N_("The size of the fonts used by the osd module" )
...@@ -101,8 +104,10 @@ vlc_module_begin(); ...@@ -101,8 +104,10 @@ vlc_module_begin();
VLC_FALSE ); VLC_FALSE );
add_integer( "freetype-fontsize", 0, NULL, FONTSIZE_TEXT, add_integer( "freetype-fontsize", 0, NULL, FONTSIZE_TEXT,
FONTSIZE_LONGTEXT, VLC_TRUE ); FONTSIZE_LONGTEXT, VLC_TRUE );
add_integer( "freetype-opacity", 100, NULL, OPACITY_TEXT, add_integer( "freetype-opacity", 255, NULL, OPACITY_TEXT,
OPACITY_LONGTEXT, VLC_TRUE ); OPACITY_LONGTEXT, VLC_TRUE );
add_integer( "freetype-color", 0xFFFFFF, NULL, COLOR_TEXT,
COLOR_LONGTEXT, VLC_TRUE );
add_integer( "freetype-rel-fontsize", 16, NULL, FONTSIZER_TEXT, add_integer( "freetype-rel-fontsize", 16, NULL, FONTSIZER_TEXT,
FONTSIZER_LONGTEXT, VLC_FALSE ); FONTSIZER_LONGTEXT, VLC_FALSE );
change_integer_list( pi_sizes, ppsz_sizes_text, 0 ); change_integer_list( pi_sizes, ppsz_sizes_text, 0 );
...@@ -136,7 +141,8 @@ struct line_desc_t ...@@ -136,7 +141,8 @@ struct line_desc_t
line_desc_t *p_next; line_desc_t *p_next;
}; };
static void Render ( filter_t *, subpicture_t *, subpicture_data_t * ); static void Render ( filter_t *, subpicture_t *, subpicture_data_t *, uint8_t,
uint8_t, uint8_t, uint8_t );
static void FreeString( subpicture_data_t * ); static void FreeString( subpicture_data_t * );
static void FreeLine( line_desc_t * ); static void FreeLine( line_desc_t * );
...@@ -151,7 +157,8 @@ struct filter_sys_t ...@@ -151,7 +157,8 @@ struct filter_sys_t
FT_Library p_library; /* handle to library */ FT_Library p_library; /* handle to library */
FT_Face p_face; /* handle to face object */ FT_Face p_face; /* handle to face object */
vlc_bool_t i_use_kerning; vlc_bool_t i_use_kerning;
int i_opacity; /* default is opaque */ uint8_t i_opacity;
uint8_t i_red, i_green, i_blue; /* color components */
uint8_t pi_gamma[256]; uint8_t pi_gamma[256];
}; };
...@@ -178,7 +185,11 @@ static int Create( vlc_object_t *p_this ) ...@@ -178,7 +185,11 @@ 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_opacity = 100; /* default to fully opaque */ /* default to opaque letters, white (all colors set to 255): */
p_sys->i_opacity = 255;
p_sys->i_red = 255;
p_sys->i_green = 255;
p_sys->i_blue = 255;
for( i = 0; i < 256; i++ ) for( i = 0; i < 256; i++ )
{ {
...@@ -193,6 +204,8 @@ static int Create( vlc_object_t *p_this ) ...@@ -193,6 +204,8 @@ static int Create( vlc_object_t *p_this )
VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_filter, "freetype-opacity", var_Create( p_filter, "freetype-opacity",
VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_filter, "freetype-color",
VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
/* Look what method was requested */ /* Look what method was requested */
var_Get( p_filter, "freetype-font", &val ); var_Get( p_filter, "freetype-font", &val );
...@@ -244,12 +257,24 @@ static int Create( vlc_object_t *p_this ) ...@@ -244,12 +257,24 @@ static int Create( vlc_object_t *p_this )
var_Get( p_filter, "freetype-opacity", &val ); var_Get( p_filter, "freetype-opacity", &val );
if( val.i_int ) if( val.i_int )
{ {
if ( ( val.i_int > -1 ) && ( val.i_int < 101 ) ) /* valid range 0 to 100% */ if ( ( val.i_int > -1 ) && ( val.i_int < 256 ) ) /* valid range 0 to 255 */
{ {
p_sys->i_opacity = val.i_int; p_sys->i_opacity = val.i_int;
} }
else msg_Warn(p_filter, "Invalid freetype opacity specified, using 100%"); else msg_Warn(p_filter, "Invalid freetype opacity specified, using 255");
}
var_Get( p_filter, "freetype-color", &val );
if( val.i_int )
{
if ( ( val.i_int > -1 ) && ( val.i_int < 0xFFFFFF ) ) /* valid range */
{
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);
}
else msg_Warn(p_filter, "Invalid freetype color specified, using white [0xFFFFFF]");
} }
var_Get( p_filter, "freetype-fontsize", &val ); var_Get( p_filter, "freetype-fontsize", &val );
if( val.i_int ) if( val.i_int )
{ {
...@@ -307,13 +332,20 @@ static void Destroy( vlc_object_t *p_this ) ...@@ -307,13 +332,20 @@ 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 void Render( filter_t *p_filter, subpicture_t *p_spu,
subpicture_data_t *p_string ) subpicture_data_t *p_string, uint8_t opacity,
uint8_t red, uint8_t green, uint8_t blue )
{ {
filter_sys_t *p_sys = p_filter->p_sys; filter_sys_t *p_sys = p_filter->p_sys;
line_desc_t *p_line; line_desc_t *p_line;
uint8_t *p_y, *p_u, *p_v, *p_a; uint8_t *p_y, *p_u, *p_v, *p_a;
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 */
/* calculate text color components: */
i_y = (uint8_t) (0.257 * red) + (0.504 * green) + (0.098 * blue) + 16;
i_u = (uint8_t) -(0.148 * red) - (0.291 * green) + (0.439 * blue) + 128;
i_v = (uint8_t) (0.439 * red) - (0.368 * green) - (0.071 * blue) + 128;
/* Create a new subpicture region */ /* Create a new subpicture region */
memset( &fmt, 0, sizeof(video_format_t) ); memset( &fmt, 0, sizeof(video_format_t) );
...@@ -343,7 +375,7 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu, ...@@ -343,7 +375,7 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu,
memset( p_a, 0x00, i_pitch * p_spu->p_region->fmt.i_height ); memset( p_a, 0x00, i_pitch * p_spu->p_region->fmt.i_height );
#define pi_gamma p_sys->pi_gamma #define pi_gamma p_sys->pi_gamma
#define opacity p_sys->i_opacity /* #define opacity p_sys->i_opacity */
for( p_line = p_string->p_lines; p_line != NULL; p_line = p_line->p_next ) for( p_line = p_string->p_lines; p_line != NULL; p_line = p_line->p_next )
{ {
...@@ -372,16 +404,16 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu, ...@@ -372,16 +404,16 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu,
i_offset -= i_pitch; i_offset -= i_pitch;
p_a[i_offset + x] = ((uint16_t)p_a[i_offset + x] + p_a[i_offset + x] = ((uint16_t)p_a[i_offset + x] +
pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]])*opacity/200; pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]])*opacity/512;
i_offset += i_pitch; x--; i_offset += i_pitch; x--;
p_a[i_offset + x] = ((uint16_t)p_a[i_offset + x] + p_a[i_offset + x] = ((uint16_t)p_a[i_offset + x] +
pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]])*opacity/200; pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]])*opacity/512;
x += 2; x += 2;
p_a[i_offset + x] = ((uint16_t)p_a[i_offset + x] + p_a[i_offset + x] = ((uint16_t)p_a[i_offset + x] +
pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]])*opacity/200; pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]])*opacity/512;
i_offset += i_pitch; x--; i_offset += i_pitch; x--;
p_a[i_offset + x] = ((uint16_t)p_a[i_offset + x] + p_a[i_offset + x] = ((uint16_t)p_a[i_offset + x] +
pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]])*opacity/200; pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]])*opacity/512;
i_offset -= i_pitch; i_offset -= i_pitch;
} }
i_offset += i_pitch; i_offset += i_pitch;
...@@ -396,7 +428,8 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu, ...@@ -396,7 +428,8 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu,
for( x = 0; x < p_glyph->bitmap.width; x++, i_bitmap_offset++ ) for( x = 0; x < p_glyph->bitmap.width; x++, i_bitmap_offset++ )
{ {
p_y[i_offset + x] = p_y[i_offset + x] =
pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]]*opacity/100; pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]]*opacity/256;
p_u[i_offset + x] = i_u; p_v[i_offset + x] = i_v;
} }
i_offset += i_pitch; i_offset += i_pitch;
} }
...@@ -659,7 +692,8 @@ static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block ) ...@@ -659,7 +692,8 @@ static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block )
#undef face #undef face
#undef glyph #undef glyph
Render( p_filter, p_subpic, p_string ); 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 ); FreeString( p_string );
block_Release( p_block ); block_Release( p_block );
if( psz_unicode_orig ) free( psz_unicode_orig ); if( psz_unicode_orig ) free( psz_unicode_orig );
......
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