From ea6d9b7aa1d88eca4b93e17ec07dc33966756077 Mon Sep 17 00:00:00 2001 From: Sigmund Augdal Helberg Date: Tue, 8 Apr 2003 07:22:10 +0000 Subject: [PATCH] modules/video_filter/Modules.am: forgot to add the osdtest module modules/video_filter/osd_text.c: fixed a bug in size/place calculations. Support gamma correction of the text. --- modules/video_filter/Modules.am | 2 +- modules/video_filter/osd_text.c | 78 +++++++++++++++++++-------------- 2 files changed, 45 insertions(+), 35 deletions(-) diff --git a/modules/video_filter/Modules.am b/modules/video_filter/Modules.am index 53986628e0..9b1fd62599 100644 --- a/modules/video_filter/Modules.am +++ b/modules/video_filter/Modules.am @@ -6,5 +6,5 @@ SOURCES_wall = modules/video_filter/wall.c SOURCES_clone = modules/video_filter/clone.c SOURCES_crop = modules/video_filter/crop.c SOURCES_motionblur = modules/video_filter/motionblur.c - +SOURCES_osdtext = modules/video_filter/osd_text.c noinst_HEADERS += modules/video_filter/filter_common.h diff --git a/modules/video_filter/osd_text.c b/modules/video_filter/osd_text.c index 35c66b252c..2815152ce7 100644 --- a/modules/video_filter/osd_text.c +++ b/modules/video_filter/osd_text.c @@ -2,7 +2,7 @@ * osd_text.c : Filter to put text on the video, using freetype2 ***************************************************************************** * Copyright (C) 2002, 2003 VideoLAN - * $Id: osd_text.c,v 1.1 2003/03/23 16:38:40 sigmunau Exp $ + * $Id: osd_text.c,v 1.2 2003/04/08 07:22:10 sigmunau Exp $ * * Authors: Sigmund Augdal * @@ -30,6 +30,7 @@ #include #include #include +#include #include "filter_common.h" @@ -114,6 +115,7 @@ struct vout_sys_t mtime_t i_end_date; vlc_mutex_t *lock; vlc_bool_t i_use_kerning; + uint8_t pi_gamma[256]; }; /* more prototypes */ static void ComputeBoundingBox( string_info_t * ); @@ -124,11 +126,14 @@ static void FreeString( string_info_t * ); ***************************************************************************** * This function allocates and initializes a Clone vout method. *****************************************************************************/ +#define gamma_value 2.0 static int Create( vlc_object_t *p_this ) { vout_thread_t *p_vout = (vout_thread_t *)p_this; char *psz_fontfile; - int i_error; + int i, i_error; + vlc_value_t val; + double gamma_inv = 1.0f / gamma_value; /* Allocate structure */ p_vout->p_sys = malloc( sizeof( vout_sys_t ) ); @@ -137,33 +142,7 @@ static int Create( vlc_object_t *p_this ) msg_Err( p_vout, "out of memory" ); return VLC_ENOMEM; } - p_vout->p_sys->p_strings = malloc( sizeof( string_info_t ) ); - if( p_vout->p_sys->p_strings == NULL ) - { - msg_Err( p_vout, "out of memory" ); - return VLC_ENOMEM; - } p_vout->p_sys->p_strings = NULL; -#if 0 - p_vout->p_sys->p_strings->i_x_margin = 20; - p_vout->p_sys->p_strings->i_y_margin = 100; - p_vout->p_sys->p_strings->i_start_date = 0; - p_vout->p_sys->p_strings->i_end_date = 0xFFFFFFFFFFFFFFFll; - p_vout->p_sys->p_strings->psz_text = "VideoLAN"; - p_vout->p_sys->p_strings->p_next = NULL; - p_vout->p_sys->p_strings->p_next = malloc(sizeof(string_info_t)); - if( p_vout->p_sys->p_strings->p_next == NULL ) - { - msg_Err( p_vout, "out of memory" ); - return VLC_ENOMEM; - } - p_vout->p_sys->p_strings->p_next->i_x_margin = 50; - p_vout->p_sys->p_strings->p_next->i_y_margin = 300; - p_vout->p_sys->p_strings->p_next->i_start_date = 0; - p_vout->p_sys->p_strings->p_next->i_end_date = 0xFFFFFFFFFFFFFFFll; - p_vout->p_sys->p_strings->p_next->psz_text = "freetype is cool!"; - p_vout->p_sys->p_strings->p_next->p_next = NULL; -#endif p_vout->p_sys->i_x_margin = 50; p_vout->p_sys->i_y_margin = 50; p_vout->p_sys->i_flags = 0; @@ -178,6 +157,12 @@ static int Create( vlc_object_t *p_this ) return VLC_ENOMEM; } vlc_mutex_init( p_vout, p_vout->p_sys->lock); + + for (i = 0; i < 256; i++) { + p_vout->p_sys->pi_gamma[i] = + (uint8_t)( pow( (double)i / 255.0f, gamma_inv) * 255.0f ); + msg_Dbg( p_vout, "%d", p_vout->p_sys->pi_gamma[i]); + } p_vout->pf_init = Init; p_vout->pf_end = End; p_vout->pf_manage = NULL; @@ -212,7 +197,8 @@ static int Create( vlc_object_t *p_this ) i_error = FT_Set_Pixel_Sizes( p_vout->p_sys->p_face, 0, config_GetInt( p_vout, "osd-fontsize" ) ); if( i_error ) { - msg_Err( p_vout, "couldn't set font size to 64" ); + msg_Err( p_vout, "couldn't set font size to %d", + config_GetInt( p_vout, "osd-fontsize" ) ); free( p_vout->p_sys ); return VLC_EGENERIC; } @@ -231,6 +217,11 @@ static int Create( vlc_object_t *p_this ) var_AddCallback( p_vout, "end-date", SetMargin, NULL ); var_Create( p_vout, "string", VLC_VAR_STRING | VLC_VAR_ISCOMMAND ); var_AddCallback( p_vout, "string", AddText, NULL ); + + val.psz_string = "Videolan"; +// var_Set( p_vout, "string", val ); +// p_vout->p_sys->p_strings->i_end_date = 0xFFFFFFFFFFFFFFF; + return VLC_SUCCESS; } @@ -261,6 +252,7 @@ static int Init( vout_thread_t *p_vout ) msg_Err( p_vout, "failed to start vout" ); return VLC_EGENERIC; } + ADD_CALLBACKS( p_vout->p_sys->p_vout, SendEvents ); ALLOCATE_DIRECTBUFFERS( VOUT_MAX_PICTURES ); @@ -348,6 +340,8 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) msleep( VOUT_OUTMEM_SLEEP ); } + vout_DatePicture( p_vout->p_sys->p_vout, + p_outpic, p_pic->date ); if( p_vout->i_changes ) { p_vout->p_sys->p_vout->i_changes = p_vout->i_changes; @@ -365,8 +359,6 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) FreeString( p_string ); } - vout_DatePicture( p_vout->p_sys->p_vout, - p_outpic, p_pic->date ); vlc_mutex_lock( p_vout->p_sys->lock ); @@ -399,7 +391,8 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) } /* pen_x = 20; pen_y = 100;*/ - if ( i_plane == 0 ) { + if ( i_plane == 0 ) + { for( p_string = p_vout->p_sys->p_strings; p_string != NULL; p_string = p_string->p_next ) { @@ -438,12 +431,14 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) 0 ); if ( i_error ) continue; p_image = (FT_BitmapGlyph)p_glyph; -#define alpha p_image->bitmap.buffer[x+ y*p_image->bitmap.width] +#define alpha p_vout->p_sys->pi_gamma[p_image->bitmap.buffer[x+ y*p_image->bitmap.width]] #define pixel p_out[(p_string->p_glyph_pos[i].y + pen_y + y - p_image->top)*i_out_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++ ) { +// pixel = alpha; +// pixel = (pixel^alpha)^pixel; pixel = ((pixel*(255-alpha))>>8) + (255*alpha>>8); } } @@ -601,7 +596,7 @@ static int AddText ( vlc_object_t *p_this, char const *psz_command, static void ComputeBoundingBox( string_info_t *p_string ) { - unsigned int i; + unsigned int i, i2; int pen_y = 0; FT_Vector result; FT_Vector line; @@ -615,8 +610,16 @@ static void ComputeBoundingBox( string_info_t *p_string ) { if ( p_string->psz_text[i] == '\n' ) { + i2 = i - 1; + while ( i2 >= 0 && p_string->psz_text[i2] ) + { + p_string->p_glyph_pos[i2].y += line.y; + i2--; + } result.x = __MAX( result.x, line.x ); result.y += line.y; + line.y = 0; + line.x = 0; pen_y = result.y; continue; } @@ -629,6 +632,12 @@ static void ComputeBoundingBox( string_info_t *p_string ) } result.x = __MAX( result.x, line.x ); result.y += line.y; + i2 = i - 1; + while ( i2 >= 0 && p_string->psz_text[i2] ) + { + p_string->p_glyph_pos[i2].y += line.y; + i2--; + } p_string->i_height = result.y; p_string->i_width = result.x; return; @@ -649,3 +658,4 @@ static void FreeString( string_info_t *p_string ) free( p_string->pp_glyphs ); free( p_string ); } + -- 2.39.2