From a504fae36cad1af4fc65f9829cedd892da262ed7 Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Tue, 8 Mar 2005 01:23:54 +0000 Subject: [PATCH] * include/vlc_filter.h, vlc_video.h, src/video_output/vout_subpictures.c: new simpler and more powerful text renderer api. * modules/misc/freetype.c: rewrite to the new api + outputs YUVP subpicture regions now. --- include/vlc_filter.h | 3 +- include/vlc_video.h | 10 +- modules/misc/freetype.c | 330 ++++++++++++---------------- modules/video_filter/marq.c | 12 +- modules/video_filter/time.c | 14 +- src/video_output/vout_subpictures.c | 24 +- 6 files changed, 161 insertions(+), 232 deletions(-) diff --git a/include/vlc_filter.h b/include/vlc_filter.h index e99875a90e..26d8ee0b15 100644 --- a/include/vlc_filter.h +++ b/include/vlc_filter.h @@ -58,8 +58,7 @@ struct filter_t int, int, int ); subpicture_t * ( *pf_sub_filter ) ( filter_t *, mtime_t ); - /* pf_render_string maps to RenderText in freetype.c */ - subpicture_region_t *( *pf_render_string ) ( filter_t *, subpicture_t *, subpicture_region_t * ); + int ( *pf_render_text ) ( filter_t *, subpicture_region_t *, subpicture_region_t * ); /* * Buffers allocation diff --git a/include/vlc_video.h b/include/vlc_video.h index b5f21e4fa0..68d2e2ec13 100644 --- a/include/vlc_video.h +++ b/include/vlc_video.h @@ -204,12 +204,14 @@ struct subpicture_region_t video_format_t fmt; /**< format of the picture */ picture_t picture; /**< picture comprising this region */ - char *psz_text; /**< text string comprising this region */ - int i_x; /**< position of region */ int i_y; /**< position of region */ - int i_font_color, i_font_opacity; /**< controls for text subpictures */ - int i_font_size; + + char *psz_text; /**< text string comprising this region */ + int i_text_color; /**< text color (RGB native endianess) */ + int i_text_alpha; /**< text transparency */ + int i_text_size; /**< text size */ + subpicture_region_t *p_next; /**< next region in the list */ subpicture_region_t *p_cache; /**< modified version of this region */ /**@}*/ diff --git a/modules/misc/freetype.c b/modules/misc/freetype.c index d6fac92745..f45319652e 100644 --- a/modules/misc/freetype.c +++ b/modules/misc/freetype.c @@ -71,8 +71,8 @@ static int Create ( vlc_object_t * ); static void Destroy( vlc_object_t * ); /* The RenderText call maps to pf_render_string, defined in vlc_filter.h */ -static subpicture_region_t *RenderText( filter_t *, subpicture_t *, - subpicture_region_t* ); +static int RenderText( filter_t *, subpicture_region_t *, + subpicture_region_t * ); static line_desc_t *NewLine( byte_t * ); /***************************************************************************** @@ -85,11 +85,12 @@ static line_desc_t *NewLine( byte_t * ); "If set to something different than 0 this option will override the " \ "relative font size " ) #define OPACITY_TEXT N_("Opacity, 0..255") -#define OPACITY_LONGTEXT N_("The opacity (inverse of transparency) of overlay text. " \ - "1 = transparent, 255 = totally opaque. " ) +#define OPACITY_LONGTEXT N_("The opacity (inverse of transparency) of " \ + "overlay text. 0 = transparent, 255 = totally opaque. " ) #define COLOR_TEXT N_("Text Default Color") -#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 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_LONGTEXT N_("The size of the fonts used by the osd module" ) @@ -136,32 +137,23 @@ vlc_module_begin(); set_callbacks( Create, Destroy ); vlc_module_end(); -/** - * Private data in a subpicture. Describes a string. - */ -typedef struct subpicture_data_t -{ - int i_width; - int i_height; - /** The string associated with this subpicture */ - byte_t *psz_text; - line_desc_t *p_lines; - -} subpicture_data_t; - struct line_desc_t { /** NULL-terminated list of glyphs making the string */ FT_BitmapGlyph *pp_glyphs; /** list of relative positions for the glyphs */ FT_Vector *p_glyph_pos; + int i_height; int i_width; + int i_red, i_green, i_blue; + int i_alpha; + line_desc_t *p_next; }; -static subpicture_region_t *Render( filter_t *, subpicture_t *, subpicture_data_t *, uint8_t, int, int, int ); -static void FreeString( subpicture_data_t * ); +static int Render( filter_t *, subpicture_region_t *, line_desc_t *, int, int); +static void FreeLines( line_desc_t * ); static void FreeLine( line_desc_t * ); /***************************************************************************** @@ -175,12 +167,9 @@ struct filter_sys_t FT_Library p_library; /* handle to library */ FT_Face p_face; /* handle to face object */ vlc_bool_t i_use_kerning; - 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_font_opacity; + int i_font_color; int i_font_size; - uint8_t i_opacity; /* function var to render */ - uint8_t pi_gamma[256]; }; /***************************************************************************** @@ -193,7 +182,7 @@ static int Create( vlc_object_t *p_this ) filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys; char *psz_fontfile = NULL; - int i, i_error; + int i_error; vlc_value_t val; /* Allocate structure */ @@ -206,9 +195,6 @@ static int Create( vlc_object_t *p_this ) p_sys->p_face = 0; p_sys->p_library = 0; p_sys->i_font_size = 0; - - for( i = 0; i < 256; i++ ) p_sys->pi_gamma[i] = i + (256 - i) / 16; - p_sys->pi_gamma[0] = 0; var_Create( p_filter, "freetype-font", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); @@ -223,11 +209,7 @@ static int Create( vlc_object_t *p_this ) 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 < 0x01000000 ) ) /* valid range */ - { - p_sys->i_font_color = val.i_int; - } - else msg_Warn(p_filter, "Invalid freetype color specified, using white [0xFFFFFF]"); + p_sys->i_font_color = __MIN( val.i_int, 0xFFFFFF ); /* Look what method was requested */ var_Get( p_filter, "freetype-font", &val ); @@ -292,7 +274,7 @@ static int Create( vlc_object_t *p_this ) 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); + 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 ) @@ -302,7 +284,7 @@ static int Create( vlc_object_t *p_this ) } if( psz_fontfile ) free( psz_fontfile ); - p_filter->pf_render_string = RenderText; + p_filter->pf_render_text = RenderText; p_filter->p_sys = p_sys; return VLC_SUCCESS; @@ -334,54 +316,61 @@ static void Destroy( vlc_object_t *p_this ) ***************************************************************************** * This function merges the previously rendered freetype glyphs into a picture *****************************************************************************/ -static subpicture_region_t *Render( filter_t *p_filter, subpicture_t *p_spu, - subpicture_data_t *p_string, - uint8_t opacity, - int red, int green, int blue) +static int Render( filter_t *p_filter, subpicture_region_t *p_region, + line_desc_t *p_line, int i_width, int i_height ) { - filter_sys_t *p_sys = p_filter->p_sys; - line_desc_t *p_line; - uint8_t *p_y, *p_u, *p_v, *p_a; + uint8_t *p_dst; video_format_t fmt; int i, x, y, i_pitch; - uint8_t i_y, i_u, i_v; /* YUV values, derived from incoming RGB */ - subpicture_region_t *p_region; - - /* Calculate text color components */ - i_y = (uint8_t)(( 66 * red + 129 * green + 25 * blue + 128) >> 8) + 16; - i_u = (uint8_t)(( -38 * red - 74 * green + 112 * blue + 128) >> 8) + 128; - i_v = (uint8_t)(( 112 * red - 94 * green - 18 * blue + 128) >> 8) + 128; + uint8_t i_y; /* YUV values, derived from incoming RGB */ + int8_t i_u, i_v; + subpicture_region_t *p_region_tmp; /* Create a new subpicture region */ memset( &fmt, 0, sizeof(video_format_t) ); - fmt.i_chroma = VLC_FOURCC('Y','U','V','A'); + fmt.i_chroma = VLC_FOURCC('Y','U','V','P'); fmt.i_aspect = VOUT_ASPECT_FACTOR; - 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_width = fmt.i_visible_width = i_width + 2; + fmt.i_height = fmt.i_visible_height = i_height + 2; fmt.i_x_offset = fmt.i_y_offset = 0; - p_region = p_spu->pf_create_region( VLC_OBJECT(p_filter), &fmt ); - if( !p_region ) + p_region_tmp = spu_CreateRegion( p_filter, &fmt ); + if( !p_region_tmp ) { msg_Err( p_filter, "cannot allocate SPU region" ); - return NULL; + return VLC_EGENERIC; } - p_region->i_x = p_region->i_y = 0; - p_y = p_region->picture.Y_PIXELS; - p_u = p_region->picture.U_PIXELS; - p_v = p_region->picture.V_PIXELS; - p_a = p_region->picture.A_PIXELS; + p_region->fmt = p_region_tmp->fmt; + p_region->picture = p_region_tmp->picture; + free( p_region_tmp ); + + /* Calculate text color components */ + i_y = (uint8_t)(( 66 * p_line->i_red + 129 * p_line->i_green + + 25 * p_line->i_blue + 128) >> 8) + 16; + i_u = (int8_t)(( -38 * p_line->i_red - 74 * p_line->i_green + + 112 * p_line->i_blue + 128) >> 8) + 128; + i_v = (int8_t)(( 112 * p_line->i_red - 94 * p_line->i_green - + 18 * p_line->i_blue + 128) >> 8) + 128; + + /* Build palette */ + fmt.p_palette->i_entries = 256; + for( i = 0; i < fmt.p_palette->i_entries; i++ ) + { + fmt.p_palette->palette[i][0] = i * i_y / 256; + fmt.p_palette->palette[i][1] = i_u; + fmt.p_palette->palette[i][2] = i_v; + fmt.p_palette->palette[i][3] = + i + (256 - i) * (256 / (255 - p_line->i_alpha)) / 16; + } + fmt.p_palette->palette[0][3] = 0; + + p_dst = p_region->picture.Y_PIXELS; i_pitch = p_region->picture.Y_PITCH; /* Initialize the region pixels */ - memset( p_y, 0x00, i_pitch * p_region->fmt.i_height ); - memset( p_u, 0x80, i_pitch * p_region->fmt.i_height ); - memset( p_v, 0x80, i_pitch * p_region->fmt.i_height ); - memset( p_a, 0x00, i_pitch * p_region->fmt.i_height ); - -#define pi_gamma p_sys->pi_gamma + memset( p_dst, 0, i_pitch * p_region->fmt.i_height ); - for( p_line = p_string->p_lines; p_line != NULL; p_line = p_line->p_next ) + for( ; p_line != NULL; p_line = p_line->p_next ) { int i_glyph_tmax = 0; int i_bitmap_offset, i_offset; @@ -403,21 +392,21 @@ static subpicture_region_t *Render( filter_t *p_filter, subpicture_t *p_spu, { for( x = 0; x < p_glyph->bitmap.width; x++, i_bitmap_offset++ ) { - if( !pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]] ) + if( !p_glyph->bitmap.buffer[i_bitmap_offset] ) continue; i_offset -= i_pitch; - p_a[i_offset + x] = ((uint16_t)p_a[i_offset + x] + - pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]])*opacity/512; + p_dst[i_offset + x] = ((uint16_t)p_dst[i_offset + x]*2 + + p_glyph->bitmap.buffer[i_bitmap_offset])/3; i_offset += i_pitch; x--; - p_a[i_offset + x] = ((uint16_t)p_a[i_offset + x] + - pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]])*opacity/512; + p_dst[i_offset + x] = ((uint16_t)p_dst[i_offset + x]*2 + + p_glyph->bitmap.buffer[i_bitmap_offset])/3; x += 2; - p_a[i_offset + x] = ((uint16_t)p_a[i_offset + x] + - pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]])*opacity/512; + p_dst[i_offset + x] = ((uint16_t)p_dst[i_offset + x]*2 + + p_glyph->bitmap.buffer[i_bitmap_offset])/3; i_offset += i_pitch; x--; - p_a[i_offset + x] = ((uint16_t)p_a[i_offset + x] + - pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]])*opacity/512; + p_dst[i_offset + x] = ((uint16_t)p_dst[i_offset + x]*2 + + p_glyph->bitmap.buffer[i_bitmap_offset])/3; i_offset -= i_pitch; } i_offset += i_pitch; @@ -431,39 +420,34 @@ static subpicture_region_t *Render( filter_t *p_filter, subpicture_t *p_spu, { for( x = 0; x < p_glyph->bitmap.width; x++, i_bitmap_offset++ ) { - 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; + if( p_glyph->bitmap.buffer[i_bitmap_offset] > 16 ) + p_dst[i_offset+x] = p_glyph->bitmap.buffer[i_bitmap_offset]; } i_offset += i_pitch; } - -#undef pi_gamma } } - return p_region; + + return VLC_SUCCESS; } /** - * This function receives a string and creates a subpicture for it. It - * also calculates the size needed for this string, and renders the + * This function renders a text subpicture region into another one. + * It also calculates the size needed for this string, and renders the * needed glyphs into memory. It is used as pf_add_string callback in * the vout method by this module */ -static subpicture_region_t *RenderText( filter_t *p_filter, - subpicture_t *p_subpic, - subpicture_region_t *p_region ) +static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out, + subpicture_region_t *p_region_in ) { filter_sys_t *p_sys = p_filter->p_sys; - subpicture_data_t *p_string = 0; - line_desc_t *p_line = 0, *p_next = 0, *p_prev = 0; + line_desc_t *p_lines = 0, *p_line = 0, *p_next = 0, *p_prev = 0; int i, i_pen_y, i_pen_x, i_error, i_glyph_index, i_previous; uint32_t *psz_unicode, *psz_unicode_orig = 0, i_char, *psz_line_start; int i_string_length; char *psz_string; vlc_iconv_t iconv_handle = (vlc_iconv_t)(-1); - int i_font_color, i_font_opacity, i_font_size; - subpicture_region_t *p_res; + int i_font_color, i_font_alpha, i_font_size, i_red, i_green, i_blue; FT_BBox line; FT_BBox glyph_size; @@ -471,29 +455,25 @@ static subpicture_region_t *RenderText( filter_t *p_filter, FT_Glyph tmp_glyph; /* Sanity check */ - if( !p_region ) return NULL; - psz_string = p_region->psz_text; - 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.y = 0; - line.xMin = 0; - line.xMax = 0; - line.yMin = 0; - line.yMax = 0; - - /* Create and initialize private data for the subpicture */ - p_string = malloc( sizeof(subpicture_data_t) ); - if( !p_string ) - { - msg_Err( p_filter, "out of memory" ); - goto error; - } - p_string->p_lines = 0; - p_string->psz_text = strdup( psz_string ); + if( !p_region_in || !p_region_out ) return VLC_EGENERIC; + psz_string = p_region_in->psz_text; + if( !psz_string || !*psz_string ) return VLC_EGENERIC; + + i_font_color = 0xFFFFFF;//p_region_in->i_text_color; + if( i_font_color == 0xFFFFFF ) i_font_color = p_sys->i_font_color; + + i_font_alpha = p_region_in->i_text_alpha; + if( !i_font_alpha ) i_font_alpha = 255 - p_sys->i_font_opacity; + + i_font_size = p_region_in->i_text_size; + if( !i_font_size ) i_font_size = p_sys->i_font_size; + + i_red = ( i_font_color & 0x00FF0000 ) >> 16; + i_green = ( i_font_color & 0x0000FF00 ) >> 8; + i_blue = i_font_color & 0x000000FF; + + result.x = result.y = 0; + line.xMin = line.xMax = line.yMin = line.yMax = 0; psz_unicode = psz_unicode_orig = malloc( ( strlen(psz_string) + 1 ) * sizeof(uint32_t) ); @@ -569,17 +549,14 @@ static subpicture_region_t *RenderText( filter_t *p_filter, /* Calculate relative glyph positions and a bounding box for the * entire string */ - p_line = NewLine( psz_string ); - if( p_line == NULL ) + if( !(p_line = NewLine( psz_string )) ) { msg_Err( p_filter, "out of memory" ); goto error; } - p_string->p_lines = p_line; - i_pen_x = 0; - i_pen_y = 0; - i_previous = 0; - i = 0; + p_lines = p_line; + i_pen_x = i_pen_y = 0; + i_previous = i = 0; psz_line_start = psz_unicode; #define face p_sys->p_face @@ -596,8 +573,7 @@ static subpicture_region_t *RenderText( filter_t *p_filter, if( i_char == '\n' ) { psz_line_start = psz_unicode; - p_next = NewLine( psz_string ); - if( p_next == NULL ) + if( !(p_next = NewLine( psz_string )) ) { msg_Err( p_filter, "out of memory" ); goto error; @@ -606,21 +582,21 @@ static subpicture_region_t *RenderText( filter_t *p_filter, p_line->i_width = line.xMax; p_line->i_height = face->size->metrics.height >> 6; p_line->pp_glyphs[ i ] = NULL; + p_line->i_alpha = i_font_alpha; + p_line->i_red = i_red; + p_line->i_green = i_green; + p_line->i_blue = i_blue; p_prev = p_line; p_line = p_next; result.x = __MAX( result.x, line.xMax ); result.y += face->size->metrics.height >> 6; i_pen_x = 0; - i_previous = 0; - line.xMin = 0; - line.xMax = 0; - line.yMin = 0; - line.yMax = 0; + i_previous = i = 0; + line.xMin = line.xMax = line.yMin = line.yMax = 0; i_pen_y += face->size->metrics.height >> 6; #if 0 msg_Dbg( p_filter, "Creating new line, i is %d", i ); #endif - i = 0; continue; } @@ -649,26 +625,21 @@ static subpicture_region_t *RenderText( filter_t *p_filter, goto error; } FT_Glyph_Get_CBox( tmp_glyph, ft_glyph_bbox_pixels, &glyph_size ); - i_error = FT_Glyph_To_Bitmap( &tmp_glyph, ft_render_mode_normal, - NULL, 1 ); + i_error = FT_Glyph_To_Bitmap( &tmp_glyph, ft_render_mode_normal, 0, 1); if( i_error ) continue; p_line->pp_glyphs[ i ] = (FT_BitmapGlyph)tmp_glyph; /* Do rest */ - line.xMax = p_line->p_glyph_pos[i].x + glyph_size.xMax - glyph_size.xMin + ((FT_BitmapGlyph)tmp_glyph)->left; - if( line.xMax > p_filter->fmt_out.video.i_visible_width - 20 ) + line.xMax = p_line->p_glyph_pos[i].x + glyph_size.xMax - + glyph_size.xMin + ((FT_BitmapGlyph)tmp_glyph)->left; + if( line.xMax > (int)p_filter->fmt_out.video.i_visible_width - 20 ) { p_line->pp_glyphs[ i ] = NULL; FreeLine( p_line ); p_line = NewLine( psz_string ); - if( p_prev ) - { - p_prev->p_next = p_line; - } - else - { - p_string->p_lines = p_line; - } + if( p_prev ) p_prev->p_next = p_line; + else p_lines = p_line; + while( psz_unicode > psz_line_start && *psz_unicode != ' ' ) { psz_unicode--; @@ -680,17 +651,12 @@ static subpicture_region_t *RenderText( filter_t *p_filter, } else { - *psz_unicode = '\n'; } psz_unicode = psz_line_start; i_pen_x = 0; - i_previous = 0; - line.xMin = 0; - line.xMax = 0; - line.yMin = 0; - line.yMax = 0; - i = 0; + i_previous = i = 0; + line.xMin = line.xMax = line.yMin = line.yMax = 0; continue; } line.yMax = __MAX( line.yMax, glyph_size.yMax ); @@ -704,46 +670,29 @@ static subpicture_region_t *RenderText( filter_t *p_filter, p_line->i_width = line.xMax; p_line->i_height = face->size->metrics.height >> 6; p_line->pp_glyphs[ i ] = NULL; + p_line->i_alpha = i_font_alpha; + p_line->i_red = i_red; + p_line->i_green = i_green; + p_line->i_blue = i_blue; result.x = __MAX( result.x, line.xMax ); result.y += line.yMax - line.yMin; - p_string->i_height = result.y; - p_string->i_width = result.x; #undef face #undef glyph -/* check to see whether to use the default color/opacity, or another one: */ - if( i_font_color < 0 ) - { - p_sys->i_blue = p_sys->i_font_color & 0x000000FF; - p_sys->i_green = ( p_sys->i_font_color & 0x0000FF00 ) >> 8; - p_sys->i_red = ( p_sys->i_font_color & 0x00FF0000 ) >> 16; - } - else - { - p_sys->i_blue = i_font_color & 0x000000FF; - p_sys->i_green = ( i_font_color & 0x0000FF00 ) >> 8; - p_sys->i_red = ( i_font_color & 0x00FF0000 ) >> 16; - } - if( i_font_opacity < 0 ) - { - p_sys->i_opacity = p_sys->i_font_opacity; - } - else - { - p_sys->i_opacity = (uint8_t)( i_font_opacity & 0x000000FF ); - } - 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 ); - FreeString( p_string ); + p_region_out->i_x = p_region_in->i_x; + p_region_out->i_y = p_region_in->i_y; + + Render( p_filter, p_region_out, p_line, result.x, result.y ); + if( psz_unicode_orig ) free( psz_unicode_orig ); - return p_res; + FreeLines( p_lines ); + return VLC_SUCCESS; error: - FreeString( p_string ); - if( p_subpic ) p_filter->pf_sub_buffer_del( p_filter, p_subpic ); if( psz_unicode_orig ) free( psz_unicode_orig ); - return NULL; + FreeLines( p_lines ); + return VLC_EGENERIC; } static void FreeLine( line_desc_t *p_line ) @@ -758,30 +707,25 @@ static void FreeLine( line_desc_t *p_line ) free( p_line ); } -static void FreeString( subpicture_data_t *p_string ) +static void FreeLines( line_desc_t *p_lines ) { line_desc_t *p_line, *p_next; - if( !p_string ) return; + if( !p_lines ) return; - for( p_line = p_string->p_lines; p_line != NULL; p_line = p_next ) + for( p_line = p_lines; p_line != NULL; p_line = p_next ) { p_next = p_line->p_next; FreeLine( p_line ); } - - free( p_string->psz_text ); - free( p_string ); } static line_desc_t *NewLine( byte_t *psz_string ) { int i_count; line_desc_t *p_line = malloc( sizeof(line_desc_t) ); - if( !p_line ) - { - return NULL; - } + + if( !p_line ) return NULL; p_line->i_height = 0; p_line->i_width = 0; p_line->p_next = NULL; @@ -790,8 +734,7 @@ static line_desc_t *NewLine( byte_t *psz_string ) * sure the string is utf8. Better be safe than sorry. */ i_count = strlen( psz_string ); - p_line->pp_glyphs = malloc( sizeof(FT_BitmapGlyph) - * ( i_count + 1 ) ); + p_line->pp_glyphs = malloc( sizeof(FT_BitmapGlyph) * ( i_count + 1 ) ); if( p_line->pp_glyphs == NULL ) { free( p_line ); @@ -799,8 +742,7 @@ static line_desc_t *NewLine( byte_t *psz_string ) } p_line->pp_glyphs[0] = NULL; - p_line->p_glyph_pos = malloc( sizeof( FT_Vector ) - * i_count + 1 ); + p_line->p_glyph_pos = malloc( sizeof( FT_Vector ) * i_count + 1 ); if( p_line->p_glyph_pos == NULL ) { free( p_line->pp_glyphs ); diff --git a/modules/video_filter/marq.c b/modules/video_filter/marq.c index adf828955e..f84a98fe5d 100644 --- a/modules/video_filter/marq.c +++ b/modules/video_filter/marq.c @@ -84,8 +84,8 @@ struct filter_sys_t "displayed, in milliseconds. Default value is " \ "0 (remain forever).") #define OPACITY_TEXT N_("Opacity, -1..255") -#define OPACITY_LONGTEXT N_("The opacity (inverse of transparency) of overlay text. " \ - "-1 = use freetype-opacity, 0 = transparent, 255 = totally opaque. " ) +#define OPACITY_LONGTEXT N_("The opacity (inverse of transparency) of " \ + "overlay text. 0 = transparent, 255 = totally opaque. " ) #define SIZE_TEXT N_("Font size, pixels") #define SIZE_LONGTEXT N_("Specify the font size, in pixels, " \ "with -1 = use freetype-fontsize" ) @@ -123,7 +123,7 @@ vlc_module_begin(); add_integer( "marq-position", 5, NULL, POS_TEXT, POS_LONGTEXT, VLC_TRUE ); /* 5 sets the default to top [1] left [4] */ change_integer_list( pi_pos_values, ppsz_pos_descriptions, 0 ); - add_integer_with_range( "marq-opacity", -1, -1, 255, NULL, + add_integer_with_range( "marq-opacity", 0, 0, 255, NULL, OPACITY_TEXT, OPACITY_LONGTEXT, VLC_FALSE ); add_integer( "marq-color", -1, NULL, COLOR_TEXT, COLOR_LONGTEXT, VLC_TRUE ); change_integer_list( pi_color_values, ppsz_color_descriptions, 0 ); @@ -276,9 +276,9 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date ) p_spu->i_y = p_sys->i_yoff; p_spu->b_absolute = VLC_TRUE; } - p_spu->p_region->i_font_color = p_sys->i_font_color; - p_spu->p_region->i_font_opacity = p_sys->i_font_opacity; - p_spu->p_region->i_font_size = p_sys->i_font_size; + p_spu->p_region->i_text_color = p_sys->i_font_color; + p_spu->p_region->i_text_alpha = p_sys->i_font_opacity; + p_spu->p_region->i_text_size = p_sys->i_font_size; p_sys->b_need_update = VLC_FALSE; diff --git a/modules/video_filter/time.c b/modules/video_filter/time.c index c64c37475e..2df0f8e6bf 100644 --- a/modules/video_filter/time.c +++ b/modules/video_filter/time.c @@ -72,9 +72,9 @@ struct filter_sys_t #define POSX_LONGTEXT N_("X offset, from the left screen edge" ) #define POSY_TEXT N_("Y offset, from the top") #define POSY_LONGTEXT N_("Y offset, down from the top" ) -#define OPACITY_TEXT N_("Opacity, -1..255") -#define OPACITY_LONGTEXT N_("The opacity (inverse of transparency) of overlay text. " \ - "-1 = use freetype-opacity, 0 = transparent, 255 = totally opaque. " ) +#define OPACITY_TEXT N_("Opacity, 0..255") +#define OPACITY_LONGTEXT N_("The opacity (inverse of transparency) of " \ + "overlay text. 0 = transparent, 255 = totally opaque. " ) #define SIZE_TEXT N_("Font size, pixels") #define SIZE_LONGTEXT N_("Specify the font size, in pixels, " \ "with -1 = use freetype-fontsize" ) @@ -109,7 +109,7 @@ vlc_module_begin(); add_integer( "time-position", 9, NULL, POS_TEXT, POS_LONGTEXT, VLC_TRUE ); /* 9 sets the default to bottom-left, minimizing jitter */ change_integer_list( pi_pos_values, ppsz_pos_descriptions, 0 ); - add_integer_with_range( "time-opacity", -1, -1, 255, NULL, + add_integer_with_range( "time-opacity", 0, 0, 255, NULL, OPACITY_TEXT, OPACITY_LONGTEXT, VLC_FALSE ); add_integer( "time-color", -1, NULL, COLOR_TEXT, COLOR_LONGTEXT, VLC_TRUE ); change_integer_list( pi_color_values, ppsz_color_descriptions, 0 ); @@ -269,9 +269,9 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date ) p_spu->i_y = p_sys->i_yoff; p_spu->b_absolute = VLC_TRUE; } - p_spu->p_region->i_font_color = p_sys->i_font_color; - p_spu->p_region->i_font_opacity = p_sys->i_font_opacity; - p_spu->p_region->i_font_size = p_sys->i_font_size; + p_spu->p_region->i_text_color = p_sys->i_font_color; + p_spu->p_region->i_text_alpha = 255 - p_sys->i_font_opacity; + p_spu->p_region->i_text_size = p_sys->i_font_size; return p_spu; } diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c index e03f21518b..54ee55d3d7 100644 --- a/src/video_output/vout_subpictures.c +++ b/src/video_output/vout_subpictures.c @@ -257,9 +257,7 @@ subpicture_region_t *__spu_CreateRegion( vlc_object_t *p_this, p_region->p_cache = 0; p_region->fmt = *p_fmt; p_region->psz_text = 0; - p_region->i_font_color = -1; /* default to using freetype-color -opacity */ - p_region->i_font_opacity = -1; - p_region->i_font_size = -1; /* and the freetype fontsize */ + p_region->i_text_color = 0xFFFFFF; if( p_fmt->i_chroma == VLC_FOURCC('Y','U','V','P') ) p_fmt->p_palette = p_region->fmt.p_palette = @@ -302,9 +300,7 @@ subpicture_region_t *__spu_MakeRegion( vlc_object_t *p_this, p_region->p_cache = 0; p_region->fmt = *p_fmt; p_region->psz_text = 0; - p_region->i_font_color = -1; /* default to using freetype-color -opacity */ - p_region->i_font_opacity = -1; - p_region->i_font_size = -1; /* and the freetype fontsize */ + p_region->i_text_color = 0xFFFFFF; if( p_fmt->i_chroma == VLC_FOURCC('Y','U','V','P') ) p_fmt->p_palette = p_region->fmt.p_palette = @@ -582,20 +578,10 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt, if( p_region->fmt.i_chroma == VLC_FOURCC('T','E','X','T') ) { if( p_spu->p_text && p_spu->p_text->p_module && - p_spu->p_text->pf_render_string ) + p_spu->p_text->pf_render_text ) { - /* TODO: do it in a less hacky way - * (modify text renderer API) */ - subpicture_region_t *p_tmp_region; - /* the actual call to RenderText in freetype.c: */ - p_tmp_region = p_spu->p_text->pf_render_string( - p_spu->p_text, p_subpic, p_region ); - - if( p_tmp_region ) - { -// p_subpic->pf_destroy_region( p_spu, p_region ); - p_region = p_tmp_region; - } + p_spu->p_text->pf_render_text( p_spu->p_text, + p_region, p_region ); } } -- 2.39.2