]> git.sesse.net Git - vlc/commitdiff
Added and used text_style_* methods.
authorbasOS G <noxelia 4t gmail , com>
Mon, 11 May 2009 21:35:40 +0000 (23:35 +0200)
committerLaurent Aimar <fenrir@videolan.org>
Mon, 11 May 2009 21:41:33 +0000 (23:41 +0200)
It had the following functions:
- text_style_New  -- allocates default text style
- text_style_Dup  -- allocates and copies text style
- text_style_Copy -- copies text style
- text_style_Delete -- deallocates text style

NOTE that the vout_ShowText* functions will take a p_style and copy
it internally so you have to free in the caller function.
 Other modules where p_style was malloced there are now fixed to
copy before calling the vout* functions.

Original patch by basOS G with a few modifications by fenrir.

Signed-off-by: Laurent Aimar <fenrir@videolan.org>
13 files changed:
include/vlc_osd.h
modules/codec/subtitles/subsass.c
modules/codec/subtitles/subsusf.c
modules/gui/fbosd.c
modules/video_filter/dynamicoverlay/dynamicoverlay.c
modules/video_filter/dynamicoverlay/dynamicoverlay.h
modules/video_filter/dynamicoverlay/dynamicoverlay_commands.c
modules/video_filter/marq.c
modules/video_filter/rss.c
src/libvlccore.sym
src/osd/osd_text.c
src/video_output/video_text.c
src/video_output/vout_subpictures.c

index df855f662e4fb643c955b753099255a3a68c609b..0aff210871579b4b731c49bac1a387e16ece3374 100644 (file)
@@ -265,8 +265,25 @@ struct text_style_t
 #define STYLE_UNDERLINE   32
 #define STYLE_STRIKEOUT   64
 
-static const text_style_t default_text_style = { NULL, 22, 0xffffff, 0xff, STYLE_OUTLINE,
-                0x000000, 0xff, 0x000000, 0xff, 0xffffff, 0x80, 0xffffff, 0xff, 1, 0, -1 };
+/**
+ * Create a default text style
+ */
+VLC_EXPORT( text_style_t *, text_style_New, ( void ) );
+
+/**
+ * Copy a text style into another
+ */
+VLC_EXPORT( text_style_t *, text_style_Copy, ( text_style_t *, const text_style_t * ) );
+
+/**
+ * Duplicate a text style
+ */
+VLC_EXPORT( text_style_t *, text_style_Duplicate, ( const text_style_t * ) );
+
+/**
+ * Delete a text style created by text_style_New or text_style_Duplicate
+ */
+VLC_EXPORT( void, text_style_Delete, ( text_style_t * ) );
 
 /**
  * OSD menu button states
@@ -590,8 +607,8 @@ static inline void osd_SetMenuUpdate( osd_menu_t *p_osd, bool b_value )
  * object. The types are declared in the include file include/vlc_osd.h
  * @see vlc_osd.h
  */
-VLC_EXPORT( int, osd_ShowTextRelative, ( spu_t *, int, const char *, text_style_t *, int, int, int, mtime_t ) );
-VLC_EXPORT( int, osd_ShowTextAbsolute, ( spu_t *, int, const char *, text_style_t *, int, int, int, mtime_t, mtime_t ) );
+VLC_EXPORT( int, osd_ShowTextRelative, ( spu_t *, int, const char *, const text_style_t *, int, int, int, mtime_t ) );
+VLC_EXPORT( int, osd_ShowTextAbsolute, ( spu_t *, int, const char *, const text_style_t *, int, int, int, mtime_t, mtime_t ) );
 VLC_EXPORT( void, osd_Message, ( spu_t *, int, char *, ... ) LIBVLC_FORMAT( 3, 4 ) );
 
 /**
@@ -611,34 +628,9 @@ VLC_EXPORT( int, osd_Icon, ( vlc_object_t *, spu_t *, int, int, int, int, int, s
  * Vout text and widget overlays
  **********************************************************************/
 
-/**
- * Show text on the video for some time
- * \param p_vout pointer to the vout the text is to be showed on
- * \param i_channel Subpicture channel
- * \param psz_string The text to be shown
- * \param p_style Pointer to a struct with text style info
- * \param i_flags flags for alignment and such
- * \param i_hmargin horizontal margin in pixels
- * \param i_vmargin vertical margin in pixels
- * \param i_duration Amount of time the text is to be shown.
- */
-VLC_EXPORT( int, vout_ShowTextRelative, ( vout_thread_t *, int, char *, text_style_t *, int, int, int, mtime_t ) );
+VLC_EXPORT( int, vout_ShowTextRelative, ( vout_thread_t *, int, char *, const text_style_t *, int, int, int, mtime_t ) );
 
-/**
- * Show text on the video from a given start date to a given end date
- * \param p_vout pointer to the vout the text is to be showed on
- * \param i_channel Subpicture channel
- * \param psz_string The text to be shown
- * \param p_style Pointer to a struct with text style info
- * \param i_flags flags for alignment and such
- * \param i_hmargin horizontal margin in pixels
- * \param i_vmargin vertical margin in pixels
- * \param i_start the time when this string is to appear on the video
- * \param i_stop the time when this string should stop to be displayed
- *               if this is 0 the string will be shown untill the next string
- *               is about to be shown
- */
-VLC_EXPORT( int, vout_ShowTextAbsolute, ( vout_thread_t *, int, const char *, text_style_t *, int, int, int, mtime_t, mtime_t ) );
+VLC_EXPORT( int, vout_ShowTextAbsolute, ( vout_thread_t *, int, const char *, const text_style_t *, int, int, int, mtime_t, mtime_t ) );
 
 /**
  * Write an informative message at the default location,
index e642673288c6426079a4a1cf27c6679268fa018e..0284f8be380c7a618f55e57b849b1e692ef61e97 100644 (file)
@@ -38,7 +38,7 @@ void ParseSSAString( decoder_t *p_dec,
      * MarginV, Effect, Text */
     decoder_sys_t   *p_sys = p_dec->p_sys;
     subpicture_t    *p_spu = p_spu_in;
-    ssa_style_t     *p_style = NULL;
+    ssa_style_t     *p_ssa_style = NULL;
     char            *psz_new_subtitle = NULL;
     char            *psz_buffer_sub = NULL;
     char            *psz_style = NULL;
@@ -118,12 +118,12 @@ void ParseSSAString( decoder_t *p_dec,
     for( i = 0; i < p_sys->i_ssa_styles; i++ )
     {
         if( !strcmp( p_sys->pp_ssa_styles[i]->psz_stylename, psz_style ) )
-            p_style = p_sys->pp_ssa_styles[i];
+            p_ssa_style = p_sys->pp_ssa_styles[i];
     }
     free( psz_style );
 
     p_spu->p_region->psz_text = psz_new_subtitle;
-    if( p_style == NULL )
+    if( p_ssa_style == NULL )
     {
         p_spu->p_region->i_align = SUBPICTURE_ALIGN_BOTTOM | p_sys->i_align;
         p_spu->p_region->i_x = p_sys->i_align ? 20 : 0;
@@ -131,18 +131,18 @@ void ParseSSAString( decoder_t *p_dec,
     }
     else
     {
-        msg_Dbg( p_dec, "style is: %s", p_style->psz_stylename);
-        p_spu->p_region->p_style = &p_style->font_style;
-        p_spu->p_region->i_align = p_style->i_align;
-        if( p_style->i_align & SUBPICTURE_ALIGN_LEFT )
+        msg_Dbg( p_dec, "style is: %s", p_ssa_style->psz_stylename );
+        p_spu->p_region->p_style = text_style_Duplicate( &p_ssa_style->font_style );
+        p_spu->p_region->i_align = p_ssa_style->i_align;
+        if( p_ssa_style->i_align & SUBPICTURE_ALIGN_LEFT )
         {
-            p_spu->p_region->i_x = (i_margin_l) ? i_margin_l : p_style->i_margin_h;
+            p_spu->p_region->i_x = (i_margin_l) ? i_margin_l : p_ssa_style->i_margin_h;
         }
-        else if( p_style->i_align & SUBPICTURE_ALIGN_RIGHT )
+        else if( p_ssa_style->i_align & SUBPICTURE_ALIGN_RIGHT )
         {
-            p_spu->p_region->i_x = (i_margin_r) ? i_margin_r : p_style->i_margin_h;
+            p_spu->p_region->i_x = (i_margin_r) ? i_margin_r : p_ssa_style->i_margin_h;
         }
-        p_spu->p_region->i_y = (i_margin_v) ? i_margin_v : p_style->i_margin_v;
+        p_spu->p_region->i_y = (i_margin_v) ? i_margin_v : p_ssa_style->i_margin_v;
     }
 }
 
@@ -233,52 +233,52 @@ void ParseSSAHeader( decoder_t *p_dec )
                     &i_border, &i_outline, &i_shadow, &i_align, &i_margin_l,
                     &i_margin_r, &i_margin_v ) == 16 )
                 {
-                    ssa_style_t *p_style = malloc( sizeof(ssa_style_t) );
+                    ssa_style_t *p_ssa_style = malloc( sizeof(ssa_style_t) );
 
-                    p_style->psz_stylename = strdup( psz_temp_stylename );
-                    p_style->font_style.psz_fontname = strdup( psz_temp_fontname );
-                    p_style->font_style.i_font_size = i_font_size;
+                    p_ssa_style->psz_stylename = strdup( psz_temp_stylename );
+                    p_ssa_style->font_style.psz_fontname = strdup( psz_temp_fontname );
+                    p_ssa_style->font_style.i_font_size = i_font_size;
 
-                    ParseColor( psz_temp_color1, &p_style->font_style.i_font_color, NULL );
-                    ParseColor( psz_temp_color4, &p_style->font_style.i_shadow_color, NULL );
-                    p_style->font_style.i_outline_color = p_style->font_style.i_shadow_color;
-                    p_style->font_style.i_font_alpha = p_style->font_style.i_outline_alpha
-                                                     = p_style->font_style.i_shadow_alpha = 0x00;
-                    p_style->font_style.i_style_flags = 0;
-                    if( i_bold ) p_style->font_style.i_style_flags |= STYLE_BOLD;
-                    if( i_italic ) p_style->font_style.i_style_flags |= STYLE_ITALIC;
+                    ParseColor( psz_temp_color1, &p_ssa_style->font_style.i_font_color, NULL );
+                    ParseColor( psz_temp_color4, &p_ssa_style->font_style.i_shadow_color, NULL );
+                    p_ssa_style->font_style.i_outline_color = p_ssa_style->font_style.i_shadow_color;
+                    p_ssa_style->font_style.i_font_alpha = p_ssa_style->font_style.i_outline_alpha
+                                                     = p_ssa_style->font_style.i_shadow_alpha = 0x00;
+                    p_ssa_style->font_style.i_style_flags = 0;
+                    if( i_bold ) p_ssa_style->font_style.i_style_flags |= STYLE_BOLD;
+                    if( i_italic ) p_ssa_style->font_style.i_style_flags |= STYLE_ITALIC;
 
                     if( i_border == 1 )
-                        p_style->font_style.i_style_flags |= (STYLE_ITALIC | STYLE_OUTLINE);
+                        p_ssa_style->font_style.i_style_flags |= (STYLE_ITALIC | STYLE_OUTLINE);
                     else if( i_border == 3 )
                     {
-                        p_style->font_style.i_style_flags |= STYLE_BACKGROUND;
-                        p_style->font_style.i_background_color = p_style->font_style.i_shadow_color;
-                        p_style->font_style.i_background_alpha = p_style->font_style.i_shadow_alpha;
+                        p_ssa_style->font_style.i_style_flags |= STYLE_BACKGROUND;
+                        p_ssa_style->font_style.i_background_color = p_ssa_style->font_style.i_shadow_color;
+                        p_ssa_style->font_style.i_background_alpha = p_ssa_style->font_style.i_shadow_alpha;
                     }
-                    p_style->font_style.i_shadow_width = i_shadow;
-                    p_style->font_style.i_outline_width = i_outline;
+                    p_ssa_style->font_style.i_shadow_width = i_shadow;
+                    p_ssa_style->font_style.i_outline_width = i_outline;
 
-                    p_style->i_align = 0;
+                    p_ssa_style->i_align = 0;
                     if( i_align == 1 || i_align == 5 || i_align == 9 )
-                        p_style->i_align |= SUBPICTURE_ALIGN_LEFT;
+                        p_ssa_style->i_align |= SUBPICTURE_ALIGN_LEFT;
                     if( i_align == 3 || i_align == 7 || i_align == 11 )
-                        p_style->i_align |= SUBPICTURE_ALIGN_RIGHT;
+                        p_ssa_style->i_align |= SUBPICTURE_ALIGN_RIGHT;
                     if( i_align < 4 )
-                        p_style->i_align |= SUBPICTURE_ALIGN_BOTTOM;
+                        p_ssa_style->i_align |= SUBPICTURE_ALIGN_BOTTOM;
                     else if( i_align < 8 )
-                        p_style->i_align |= SUBPICTURE_ALIGN_TOP;
+                        p_ssa_style->i_align |= SUBPICTURE_ALIGN_TOP;
 
-                    p_style->i_margin_h = ( p_style->i_align & SUBPICTURE_ALIGN_RIGHT ) ?
+                    p_ssa_style->i_margin_h = ( p_ssa_style->i_align & SUBPICTURE_ALIGN_RIGHT ) ?
                                                         i_margin_r : i_margin_l;
-                    p_style->i_margin_v = i_margin_v;
-                    p_style->i_margin_percent_h = 0;
-                    p_style->i_margin_percent_v = 0;
+                    p_ssa_style->i_margin_v = i_margin_v;
+                    p_ssa_style->i_margin_percent_h = 0;
+                    p_ssa_style->i_margin_percent_v = 0;
 
-                    p_style->font_style.i_karaoke_background_color = 0xffffff;
-                    p_style->font_style.i_karaoke_background_alpha = 0xff;
+                    p_ssa_style->font_style.i_karaoke_background_color = 0xffffff;
+                    p_ssa_style->font_style.i_karaoke_background_alpha = 0xff;
 
-                    TAB_APPEND( p_sys->i_ssa_styles, p_sys->pp_ssa_styles, p_style );
+                    TAB_APPEND( p_sys->i_ssa_styles, p_sys->pp_ssa_styles, p_ssa_style );
                 }
                 else msg_Warn( p_dec, "SSA v4 styleline parsing failed" );
             }
@@ -294,55 +294,55 @@ void ParseSSAHeader( decoder_t *p_dec )
                     &i_underline, &i_strikeout, &i_scale_x, &i_scale_y, &i_spacing, &i_border, &i_outline,
                     &i_shadow, &i_align, &i_margin_l, &i_margin_r, &i_margin_v ) == 21 )
                 {
-                    ssa_style_t *p_style = malloc( sizeof(ssa_style_t) );
-
-                    p_style->psz_stylename = strdup( psz_temp_stylename );
-                    p_style->font_style.psz_fontname = strdup( psz_temp_fontname );
-                    p_style->font_style.i_font_size = i_font_size;
-                    ParseColor( psz_temp_color1, &p_style->font_style.i_font_color,
-                                &p_style->font_style.i_font_alpha );
-                    ParseColor( psz_temp_color3, &p_style->font_style.i_outline_color,
-                                &p_style->font_style.i_outline_alpha );
-                    ParseColor( psz_temp_color4, &p_style->font_style.i_shadow_color,
-                                &p_style->font_style.i_shadow_alpha );
-
-                    p_style->font_style.i_style_flags = 0;
-                    if( i_bold ) p_style->font_style.i_style_flags |= STYLE_BOLD;
-                    if( i_italic ) p_style->font_style.i_style_flags |= STYLE_ITALIC;
-                    if( i_underline ) p_style->font_style.i_style_flags |= STYLE_UNDERLINE;
-                    if( i_strikeout ) p_style->font_style.i_style_flags |= STYLE_STRIKEOUT;
-                    if( i_border == 1 ) p_style->font_style.i_style_flags |= (STYLE_ITALIC | STYLE_OUTLINE);
+                    ssa_style_t *p_ssa_style = malloc( sizeof(ssa_style_t) );
+
+                    p_ssa_style->psz_stylename = strdup( psz_temp_stylename );
+                    p_ssa_style->font_style.psz_fontname = strdup( psz_temp_fontname );
+                    p_ssa_style->font_style.i_font_size = i_font_size;
+                    ParseColor( psz_temp_color1, &p_ssa_style->font_style.i_font_color,
+                                &p_ssa_style->font_style.i_font_alpha );
+                    ParseColor( psz_temp_color3, &p_ssa_style->font_style.i_outline_color,
+                                &p_ssa_style->font_style.i_outline_alpha );
+                    ParseColor( psz_temp_color4, &p_ssa_style->font_style.i_shadow_color,
+                                &p_ssa_style->font_style.i_shadow_alpha );
+
+                    p_ssa_style->font_style.i_style_flags = 0;
+                    if( i_bold ) p_ssa_style->font_style.i_style_flags |= STYLE_BOLD;
+                    if( i_italic ) p_ssa_style->font_style.i_style_flags |= STYLE_ITALIC;
+                    if( i_underline ) p_ssa_style->font_style.i_style_flags |= STYLE_UNDERLINE;
+                    if( i_strikeout ) p_ssa_style->font_style.i_style_flags |= STYLE_STRIKEOUT;
+                    if( i_border == 1 ) p_ssa_style->font_style.i_style_flags |= (STYLE_ITALIC | STYLE_OUTLINE);
                     else if( i_border == 3 )
                     {
-                        p_style->font_style.i_style_flags |= STYLE_BACKGROUND;
-                        p_style->font_style.i_background_color = p_style->font_style.i_shadow_color;
-                        p_style->font_style.i_background_alpha = p_style->font_style.i_shadow_alpha;
+                        p_ssa_style->font_style.i_style_flags |= STYLE_BACKGROUND;
+                        p_ssa_style->font_style.i_background_color = p_ssa_style->font_style.i_shadow_color;
+                        p_ssa_style->font_style.i_background_alpha = p_ssa_style->font_style.i_shadow_alpha;
                     }
-                    p_style->font_style.i_shadow_width  = ( i_border == 1 ) ? i_shadow : 0;
-                    p_style->font_style.i_outline_width = ( i_border == 1 ) ? i_outline : 0;
-                    p_style->font_style.i_spacing = i_spacing;
-                    //p_style->font_style.f_angle = f_angle;
+                    p_ssa_style->font_style.i_shadow_width  = ( i_border == 1 ) ? i_shadow : 0;
+                    p_ssa_style->font_style.i_outline_width = ( i_border == 1 ) ? i_outline : 0;
+                    p_ssa_style->font_style.i_spacing = i_spacing;
+                    //p_ssa_style->font_style.f_angle = f_angle;
 
-                    p_style->i_align = 0;
+                    p_ssa_style->i_align = 0;
                     if( i_align == 0x1 || i_align == 0x4 || i_align == 0x7 )
-                        p_style->i_align |= SUBPICTURE_ALIGN_LEFT;
+                        p_ssa_style->i_align |= SUBPICTURE_ALIGN_LEFT;
                     if( i_align == 0x3 || i_align == 0x6 || i_align == 0x9 )
-                        p_style->i_align |= SUBPICTURE_ALIGN_RIGHT;
+                        p_ssa_style->i_align |= SUBPICTURE_ALIGN_RIGHT;
                     if( i_align == 0x7 || i_align == 0x8 || i_align == 0x9 )
-                        p_style->i_align |= SUBPICTURE_ALIGN_TOP;
+                        p_ssa_style->i_align |= SUBPICTURE_ALIGN_TOP;
                     if( i_align == 0x1 || i_align == 0x2 || i_align == 0x3 )
-                        p_style->i_align |= SUBPICTURE_ALIGN_BOTTOM;
-                    p_style->i_margin_h = ( p_style->i_align & SUBPICTURE_ALIGN_RIGHT ) ?
+                        p_ssa_style->i_align |= SUBPICTURE_ALIGN_BOTTOM;
+                    p_ssa_style->i_margin_h = ( p_ssa_style->i_align & SUBPICTURE_ALIGN_RIGHT ) ?
                                             i_margin_r : i_margin_l;
-                    p_style->i_margin_v = i_margin_v;
-                    p_style->i_margin_percent_h = 0;
-                    p_style->i_margin_percent_v = 0;
+                    p_ssa_style->i_margin_v = i_margin_v;
+                    p_ssa_style->i_margin_percent_h = 0;
+                    p_ssa_style->i_margin_percent_v = 0;
 
-                    p_style->font_style.i_karaoke_background_color = 0xffffff;
-                    p_style->font_style.i_karaoke_background_alpha = 0xff;
+                    p_ssa_style->font_style.i_karaoke_background_color = 0xffffff;
+                    p_ssa_style->font_style.i_karaoke_background_alpha = 0xff;
 
                     /*TODO: Ignored: angle i_scale_x|y (fontscaling), i_encoding */
-                    TAB_APPEND( p_sys->i_ssa_styles, p_sys->pp_ssa_styles, p_style );
+                    TAB_APPEND( p_sys->i_ssa_styles, p_sys->pp_ssa_styles, p_ssa_style );
                 }
                 else msg_Dbg( p_dec, "SSA V4+ styleline parsing failed" );
             }
index 330e167ab3c10f21b9cb53c7e77628ee90370e81..717f8da1272fa517d270a0d7c036781d8f531ff7 100644 (file)
@@ -146,6 +146,7 @@ static void CloseDecoder( vlc_object_t *p_this )
                 continue;
 
             free( p_sys->pp_ssa_styles[i]->psz_stylename );
+            //FIXME: Make font_style a pointer and use text_style_* functions
             free( p_sys->pp_ssa_styles[i]->font_style.psz_fontname );
             free( p_sys->pp_ssa_styles[i] );
         }
@@ -261,7 +262,7 @@ static char *GrabAttributeValue( const char *psz_attribute,
 
 static ssa_style_t *ParseStyle( decoder_sys_t *p_sys, char *psz_subtitle )
 {
-    ssa_style_t *p_style   = NULL;
+    ssa_style_t *p_ssa_style = NULL;
     char        *psz_style = GrabAttributeValue( "style", psz_subtitle );
 
     if( psz_style )
@@ -271,11 +272,11 @@ static ssa_style_t *ParseStyle( decoder_sys_t *p_sys, char *psz_subtitle )
         for( i = 0; i < p_sys->i_ssa_styles; i++ )
         {
             if( !strcmp( p_sys->pp_ssa_styles[i]->psz_stylename, psz_style ) )
-                p_style = p_sys->pp_ssa_styles[i];
+                p_ssa_style = p_sys->pp_ssa_styles[i];
         }
         free( psz_style );
     }
-    return p_style;
+    return p_ssa_style;
 }
 
 static int ParsePositionAttributeList( char *psz_subtitle, int *i_align,
@@ -390,7 +391,7 @@ static subpicture_region_t *CreateTextRegion( decoder_t *p_dec,
 
     if( p_text_region != NULL )
     {
-        ssa_style_t  *p_style = NULL;
+        ssa_style_t  *p_ssa_style = NULL;
 
         p_text_region->psz_text = NULL;
         p_text_region->psz_html = strndup( psz_subtitle, i_len );
@@ -400,34 +401,34 @@ static subpicture_region_t *CreateTextRegion( decoder_t *p_dec,
             return NULL;
         }
 
-        p_style = ParseStyle( p_sys, p_text_region->psz_html );
-        if( !p_style )
+        p_ssa_style = ParseStyle( p_sys, p_text_region->psz_html );
+        if( !p_ssa_style )
         {
             int i;
 
             for( i = 0; i < p_sys->i_ssa_styles; i++ )
             {
                 if( !strcasecmp( p_sys->pp_ssa_styles[i]->psz_stylename, "Default" ) )
-                    p_style = p_sys->pp_ssa_styles[i];
+                    p_ssa_style = p_sys->pp_ssa_styles[i];
             }
         }
 
-        if( p_style )
+        if( p_ssa_style )
         {
-            msg_Dbg( p_dec, "style is: %s", p_style->psz_stylename );
+            msg_Dbg( p_dec, "style is: %s", p_ssa_style->psz_stylename );
 
-            p_text_region->p_style = &p_style->font_style;
-            p_text_region->i_align = p_style->i_align;
+            p_text_region->p_style = text_style_Duplicate( &p_ssa_style->font_style );
+            p_text_region->i_align = p_ssa_style->i_align;
 
             /* TODO: Setup % based offsets properly, without adversely affecting
              *       everything else in vlc. Will address with separate patch,
              *       to prevent this one being any more complicated.
 
-                     * p_style->i_margin_percent_h;
-                     * p_style->i_margin_percent_v;
+                     * p_ssa_style->i_margin_percent_h;
+                     * p_ssa_style->i_margin_percent_v;
              */
-            p_text_region->i_x         = p_style->i_margin_h;
-            p_text_region->i_y         = p_style->i_margin_v;
+            p_text_region->i_x         = p_ssa_style->i_margin_h;
+            p_text_region->i_y         = p_ssa_style->i_margin_v;
 
         }
         else
@@ -532,7 +533,7 @@ static void ParseUSFHeaderTags( decoder_t *p_dec, xml_reader_t *p_xml_reader )
 {
     decoder_sys_t *p_sys = p_dec->p_sys;
     char *psz_node;
-    ssa_style_t *p_style = NULL;
+    ssa_style_t *p_ssa_style = NULL;
     int i_style_level = 0;
     int i_metadata_level = 0;
 
@@ -565,9 +566,9 @@ static void ParseUSFHeaderTags( decoder_t *p_dec, xml_reader_t *p_xml_reader )
                     case 2:
                         if( !strcasecmp( "style", psz_node ) )
                         {
-                            TAB_APPEND( p_sys->i_ssa_styles, p_sys->pp_ssa_styles, p_style );
+                            TAB_APPEND( p_sys->i_ssa_styles, p_sys->pp_ssa_styles, p_ssa_style );
 
-                            p_style = NULL;
+                            p_ssa_style = NULL;
                             i_style_level--;
                         }
                         break;
@@ -612,8 +613,8 @@ static void ParseUSFHeaderTags( decoder_t *p_dec, xml_reader_t *p_xml_reader )
                 {
                     i_style_level++;
 
-                    p_style = calloc( 1, sizeof(ssa_style_t) );
-                    if( ! p_style )
+                    p_ssa_style = calloc( 1, sizeof(ssa_style_t) );
+                    if( !p_ssa_style )
                     {
                         free( psz_node );
                         return;
@@ -630,9 +631,11 @@ static void ParseUSFHeaderTags( decoder_t *p_dec, xml_reader_t *p_xml_reader )
                         {
                             ssa_style_t *p_default_style = p_sys->pp_ssa_styles[i];
 
-                            memcpy( p_style, p_default_style, sizeof( ssa_style_t ) );
-                            p_style->font_style.psz_fontname = strdup( p_style->font_style.psz_fontname );
-                            p_style->psz_stylename = NULL;
+                            memcpy( p_ssa_style, p_default_style, sizeof( ssa_style_t ) );
+                            //FIXME: Make font_style a pointer. Actually we double copy some data here,
+                            //   we use text_style_Copy to avoid copying psz_fontname, though .
+                            text_style_Copy( &p_ssa_style->font_style, &p_default_style->font_style );
+                            p_ssa_style->psz_stylename = NULL;
                         }
                     }
 
@@ -644,7 +647,7 @@ static void ParseUSFHeaderTags( decoder_t *p_dec, xml_reader_t *p_xml_reader )
                         if( psz_name && psz_value )
                         {
                             if( !strcasecmp( "name", psz_name ) )
-                                p_style->psz_stylename = strdup( psz_value);
+                                p_ssa_style->psz_stylename = strdup( psz_value );
                         }
                         free( psz_name );
                         free( psz_value );
@@ -661,8 +664,8 @@ static void ParseUSFHeaderTags( decoder_t *p_dec, xml_reader_t *p_xml_reader )
                         {
                             if( !strcasecmp( "face", psz_name ) )
                             {
-                                free( p_style->font_style.psz_fontname );
-                                p_style->font_style.psz_fontname = strdup( psz_value );
+                                free( p_ssa_style->font_style.psz_fontname );
+                                p_ssa_style->font_style.psz_fontname = strdup( psz_value );
                             }
                             else if( !strcasecmp( "size", psz_name ) )
                             {
@@ -671,44 +674,44 @@ static void ParseUSFHeaderTags( decoder_t *p_dec, xml_reader_t *p_xml_reader )
                                     int i_value = atoi( psz_value );
 
                                     if( ( i_value >= -5 ) && ( i_value <= 5 ) )
-                                        p_style->font_style.i_font_size  +=
-                                            ( i_value * p_style->font_style.i_font_size ) / 10;
+                                        p_ssa_style->font_style.i_font_size  +=
+                                            ( i_value * p_ssa_style->font_style.i_font_size ) / 10;
                                     else if( i_value < -5 )
-                                        p_style->font_style.i_font_size  = - i_value;
+                                        p_ssa_style->font_style.i_font_size  = - i_value;
                                     else if( i_value > 5 )
-                                        p_style->font_style.i_font_size  = i_value;
+                                        p_ssa_style->font_style.i_font_size  = i_value;
                                 }
                                 else
-                                    p_style->font_style.i_font_size  = atoi( psz_value );
+                                    p_ssa_style->font_style.i_font_size  = atoi( psz_value );
                             }
                             else if( !strcasecmp( "italic", psz_name ) )
                             {
                                 if( !strcasecmp( "yes", psz_value ))
-                                    p_style->font_style.i_style_flags |= STYLE_ITALIC;
+                                    p_ssa_style->font_style.i_style_flags |= STYLE_ITALIC;
                                 else
-                                    p_style->font_style.i_style_flags &= ~STYLE_ITALIC;
+                                    p_ssa_style->font_style.i_style_flags &= ~STYLE_ITALIC;
                             }
                             else if( !strcasecmp( "weight", psz_name ) )
                             {
                                 if( !strcasecmp( "bold", psz_value ))
-                                    p_style->font_style.i_style_flags |= STYLE_BOLD;
+                                    p_ssa_style->font_style.i_style_flags |= STYLE_BOLD;
                                 else
-                                    p_style->font_style.i_style_flags &= ~STYLE_BOLD;
+                                    p_ssa_style->font_style.i_style_flags &= ~STYLE_BOLD;
                             }
                             else if( !strcasecmp( "underline", psz_name ) )
                             {
                                 if( !strcasecmp( "yes", psz_value ))
-                                    p_style->font_style.i_style_flags |= STYLE_UNDERLINE;
+                                    p_ssa_style->font_style.i_style_flags |= STYLE_UNDERLINE;
                                 else
-                                    p_style->font_style.i_style_flags &= ~STYLE_UNDERLINE;
+                                    p_ssa_style->font_style.i_style_flags &= ~STYLE_UNDERLINE;
                             }
                             else if( !strcasecmp( "color", psz_name ) )
                             {
                                 if( *psz_value == '#' )
                                 {
                                     unsigned long col = strtol(psz_value+1, NULL, 16);
-                                    p_style->font_style.i_font_color = (col & 0x00ffffff);
-                                    p_style->font_style.i_font_alpha = (col >> 24) & 0xff;
+                                    p_ssa_style->font_style.i_font_color = (col & 0x00ffffff);
+                                    p_ssa_style->font_style.i_font_alpha = (col >> 24) & 0xff;
                                 }
                             }
                             else if( !strcasecmp( "outline-color", psz_name ) )
@@ -716,39 +719,39 @@ static void ParseUSFHeaderTags( decoder_t *p_dec, xml_reader_t *p_xml_reader )
                                 if( *psz_value == '#' )
                                 {
                                     unsigned long col = strtol(psz_value+1, NULL, 16);
-                                    p_style->font_style.i_outline_color = (col & 0x00ffffff);
-                                    p_style->font_style.i_outline_alpha = (col >> 24) & 0xff;
+                                    p_ssa_style->font_style.i_outline_color = (col & 0x00ffffff);
+                                    p_ssa_style->font_style.i_outline_alpha = (col >> 24) & 0xff;
                                 }
                             }
                             else if( !strcasecmp( "outline-level", psz_name ) )
                             {
-                                p_style->font_style.i_outline_width = atoi( psz_value );
+                                p_ssa_style->font_style.i_outline_width = atoi( psz_value );
                             }
                             else if( !strcasecmp( "shadow-color", psz_name ) )
                             {
                                 if( *psz_value == '#' )
                                 {
                                     unsigned long col = strtol(psz_value+1, NULL, 16);
-                                    p_style->font_style.i_shadow_color = (col & 0x00ffffff);
-                                    p_style->font_style.i_shadow_alpha = (col >> 24) & 0xff;
+                                    p_ssa_style->font_style.i_shadow_color = (col & 0x00ffffff);
+                                    p_ssa_style->font_style.i_shadow_alpha = (col >> 24) & 0xff;
                                 }
                             }
                             else if( !strcasecmp( "shadow-level", psz_name ) )
                             {
-                                p_style->font_style.i_shadow_width = atoi( psz_value );
+                                p_ssa_style->font_style.i_shadow_width = atoi( psz_value );
                             }
                             else if( !strcasecmp( "back-color", psz_name ) )
                             {
                                 if( *psz_value == '#' )
                                 {
                                     unsigned long col = strtol(psz_value+1, NULL, 16);
-                                    p_style->font_style.i_karaoke_background_color = (col & 0x00ffffff);
-                                    p_style->font_style.i_karaoke_background_alpha = (col >> 24) & 0xff;
+                                    p_ssa_style->font_style.i_karaoke_background_color = (col & 0x00ffffff);
+                                    p_ssa_style->font_style.i_karaoke_background_alpha = (col >> 24) & 0xff;
                                 }
                             }
                             else if( !strcasecmp( "spacing", psz_name ) )
                             {
-                                p_style->font_style.i_spacing = atoi( psz_value );
+                                p_ssa_style->font_style.i_spacing = atoi( psz_value );
                             }
                         }
                         free( psz_name );
@@ -767,48 +770,48 @@ static void ParseUSFHeaderTags( decoder_t *p_dec, xml_reader_t *p_xml_reader )
                             if( !strcasecmp( "alignment", psz_name ) )
                             {
                                 if( !strcasecmp( "TopLeft", psz_value ) )
-                                    p_style->i_align = SUBPICTURE_ALIGN_TOP | SUBPICTURE_ALIGN_LEFT;
+                                    p_ssa_style->i_align = SUBPICTURE_ALIGN_TOP | SUBPICTURE_ALIGN_LEFT;
                                 else if( !strcasecmp( "TopCenter", psz_value ) )
-                                    p_style->i_align = SUBPICTURE_ALIGN_TOP;
+                                    p_ssa_style->i_align = SUBPICTURE_ALIGN_TOP;
                                 else if( !strcasecmp( "TopRight", psz_value ) )
-                                    p_style->i_align = SUBPICTURE_ALIGN_TOP | SUBPICTURE_ALIGN_RIGHT;
+                                    p_ssa_style->i_align = SUBPICTURE_ALIGN_TOP | SUBPICTURE_ALIGN_RIGHT;
                                 else if( !strcasecmp( "MiddleLeft", psz_value ) )
-                                    p_style->i_align = SUBPICTURE_ALIGN_LEFT;
+                                    p_ssa_style->i_align = SUBPICTURE_ALIGN_LEFT;
                                 else if( !strcasecmp( "MiddleCenter", psz_value ) )
-                                    p_style->i_align = 0;
+                                    p_ssa_style->i_align = 0;
                                 else if( !strcasecmp( "MiddleRight", psz_value ) )
-                                    p_style->i_align = SUBPICTURE_ALIGN_RIGHT;
+                                    p_ssa_style->i_align = SUBPICTURE_ALIGN_RIGHT;
                                 else if( !strcasecmp( "BottomLeft", psz_value ) )
-                                    p_style->i_align = SUBPICTURE_ALIGN_BOTTOM | SUBPICTURE_ALIGN_LEFT;
+                                    p_ssa_style->i_align = SUBPICTURE_ALIGN_BOTTOM | SUBPICTURE_ALIGN_LEFT;
                                 else if( !strcasecmp( "BottomCenter", psz_value ) )
-                                    p_style->i_align = SUBPICTURE_ALIGN_BOTTOM;
+                                    p_ssa_style->i_align = SUBPICTURE_ALIGN_BOTTOM;
                                 else if( !strcasecmp( "BottomRight", psz_value ) )
-                                    p_style->i_align = SUBPICTURE_ALIGN_BOTTOM | SUBPICTURE_ALIGN_RIGHT;
+                                    p_ssa_style->i_align = SUBPICTURE_ALIGN_BOTTOM | SUBPICTURE_ALIGN_RIGHT;
                             }
                             else if( !strcasecmp( "horizontal-margin", psz_name ) )
                             {
                                 if( strchr( psz_value, '%' ) )
                                 {
-                                    p_style->i_margin_h = 0;
-                                    p_style->i_margin_percent_h = atoi( psz_value );
+                                    p_ssa_style->i_margin_h = 0;
+                                    p_ssa_style->i_margin_percent_h = atoi( psz_value );
                                 }
                                 else
                                 {
-                                    p_style->i_margin_h = atoi( psz_value );
-                                    p_style->i_margin_percent_h = 0;
+                                    p_ssa_style->i_margin_h = atoi( psz_value );
+                                    p_ssa_style->i_margin_percent_h = 0;
                                 }
                             }
                             else if( !strcasecmp( "vertical-margin", psz_name ) )
                             {
                                 if( strchr( psz_value, '%' ) )
                                 {
-                                    p_style->i_margin_v = 0;
-                                    p_style->i_margin_percent_v = atoi( psz_value );
+                                    p_ssa_style->i_margin_v = 0;
+                                    p_ssa_style->i_margin_percent_v = atoi( psz_value );
                                 }
                                 else
                                 {
-                                    p_style->i_margin_v = atoi( psz_value );
-                                    p_style->i_margin_percent_v = 0;
+                                    p_ssa_style->i_margin_v = atoi( psz_value );
+                                    p_ssa_style->i_margin_percent_v = 0;
                                 }
                             }
                         }
@@ -821,7 +824,7 @@ static void ParseUSFHeaderTags( decoder_t *p_dec, xml_reader_t *p_xml_reader )
                 break;
         }
     }
-    free( p_style );
+    free( p_ssa_style );
 }
 
 
index 9af2a75873aeed672c3bc0508633a66fe3debeb3..900b23cc913b5c4e574c0b621618f0c4696c8aa6 100644 (file)
@@ -310,20 +310,19 @@ static int Create( vlc_object_t *p_this )
     if( !p_intf->p_sys )
         return VLC_ENOMEM;
 
-    p_sys->p_style = malloc( sizeof( text_style_t ) );
+    p_sys->p_style = text_style_New();
     if( !p_sys->p_style )
     {
         free( p_intf->p_sys );
         return VLC_ENOMEM;
     }
-    vlc_memcpy( p_sys->p_style, &default_text_style, sizeof( text_style_t ) );
 
     p_intf->pf_run = Run;
 
     p_sys->p_image = image_HandlerCreate( p_this );
     if( !p_sys->p_image )
     {
-        free( p_sys->p_style );
+        text_style_Delete( p_sys->p_style );
         free( p_sys );
         return VLC_ENOMEM;
     }
@@ -520,7 +519,7 @@ static void Destroy( vlc_object_t *p_this )
     if( p_sys->p_overlay )
         picture_Release( p_sys->p_overlay );
 
-    free( p_sys->p_style );
+    text_style_Delete( p_sys->p_style );
     free( p_sys );
 }
 
@@ -865,7 +864,7 @@ static picture_t *RenderText( intf_thread_t *p_intf, const char *psz_string,
             subpicture_region_Delete( p_region );
             return NULL;
         }
-        p_region->p_style = p_style;
+        p_region->p_style = text_style_Duplicate( p_style );
         p_region->i_align = OSD_ALIGN_LEFT | OSD_ALIGN_TOP;
 
         if( p_sys->p_text->pf_render_text )
index c015c4ccbc16c91f84f85cb64f0e18f2ea91fa65..8d2fce48f1c880a411e812eb5dab5ac31605307b 100644 (file)
@@ -358,9 +358,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
         if( p_overlay->format.i_chroma == VLC_FOURCC('T','E','X','T') )
         {
             p_region->psz_text = strdup( p_overlay->data.p_text );
-            p_region->p_style = malloc( sizeof(struct text_style_t) );
-            if( p_region->p_style )
-                *p_region->p_style = p_overlay->fontstyle;
+            p_region->p_style = text_style_Duplicate( p_overlay->p_fontstyle );
         }
         else
         {
index 8eb500a527a32bfc0c9de63395e930f00c63e41c..a40c73dfb636a273d6924a253ed931a6ca73d002 100644 (file)
@@ -122,7 +122,7 @@ typedef struct overlay_t
     bool b_active;
 
     video_format_t format;
-    struct text_style_t fontstyle;
+    struct text_style_t *p_fontstyle;
     union {
         picture_t *p_pic;
         char *p_text;
index 3f3f5b82fc5e513dff7f3d5beea1bf936c92297e..95bdd85d95a0d3f62cc8105f008d3119c86520aa 100644 (file)
@@ -58,7 +58,7 @@ overlay_t *OverlayCreate( void )
     p_ovl->b_active = false;
     vout_InitFormat( &p_ovl->format, VLC_FOURCC( '\0','\0','\0','\0') , 0, 0,
                      VOUT_ASPECT_FACTOR );
-    memcpy( &p_ovl->fontstyle, &default_text_style, sizeof(struct text_style_t) );
+    p_ovl->p_fontstyle = text_style_New();
     p_ovl->data.p_text = NULL;
 
     return p_ovl;
@@ -68,6 +68,7 @@ int OverlayDestroy( overlay_t *p_ovl )
 {
     if( p_ovl->data.p_text != NULL )
         free( p_ovl->data.p_text );
+    text_style_Delete( p_ovl->p_fontstyle );
 
     return VLC_SUCCESS;
 }
@@ -636,7 +637,7 @@ static int exec_GetTextAlpha( filter_t *p_filter,
     if( p_ovl == NULL )
         return VLC_EGENERIC;
 
-    p_results->fontstyle.i_font_alpha = p_ovl->fontstyle.i_font_alpha;
+    p_results->fontstyle.i_font_alpha = p_ovl->p_fontstyle->i_font_alpha;
     return VLC_SUCCESS;
 }
 
@@ -649,7 +650,7 @@ static int exec_GetTextColor( filter_t *p_filter,
     if( p_ovl == NULL )
         return VLC_EGENERIC;
 
-    p_results->fontstyle.i_font_color = p_ovl->fontstyle.i_font_color;
+    p_results->fontstyle.i_font_color = p_ovl->p_fontstyle->i_font_color;
     return VLC_SUCCESS;
 }
 
@@ -662,7 +663,7 @@ static int exec_GetTextSize( filter_t *p_filter,
     if( p_ovl == NULL )
         return VLC_EGENERIC;
 
-    p_results->fontstyle.i_font_size = p_ovl->fontstyle.i_font_size;
+    p_results->fontstyle.i_font_size = p_ovl->p_fontstyle->i_font_size;
     return VLC_SUCCESS;
 }
 
@@ -725,7 +726,7 @@ static int exec_SetTextAlpha( filter_t *p_filter,
     if( p_ovl == NULL )
         return VLC_EGENERIC;
 
-    p_ovl->fontstyle.i_font_alpha = p_params->fontstyle.i_font_alpha;
+    p_ovl->p_fontstyle->i_font_alpha = p_params->fontstyle.i_font_alpha;
     p_sys->b_updated = p_ovl->b_active;
     return VLC_SUCCESS;
 }
@@ -741,7 +742,7 @@ static int exec_SetTextColor( filter_t *p_filter,
     if( p_ovl == NULL )
         return VLC_EGENERIC;
 
-    p_ovl->fontstyle.i_font_color = p_params->fontstyle.i_font_color;
+    p_ovl->p_fontstyle->i_font_color = p_params->fontstyle.i_font_color;
     p_sys->b_updated = p_ovl->b_active;
     return VLC_SUCCESS;
 }
@@ -757,7 +758,7 @@ static int exec_SetTextSize( filter_t *p_filter,
     if( p_ovl == NULL )
         return VLC_EGENERIC;
 
-    p_ovl->fontstyle.i_font_size = p_params->fontstyle.i_font_size;
+    p_ovl->p_fontstyle->i_font_size = p_params->fontstyle.i_font_size;
     p_sys->b_updated = p_ovl->b_active;
     return VLC_SUCCESS;
 }
index 0d2565f61dfb18d42b172f9b38ddc8bf40e4f2a3..1d8388b7a7c3c0a2b57f0903aad70a98e224f819 100644 (file)
@@ -204,8 +204,7 @@ static int CreateFilter( vlc_object_t *p_this )
         return VLC_ENOMEM;
 
     vlc_mutex_init( &p_sys->lock );
-    p_sys->p_style = malloc( sizeof( text_style_t ) );
-    memcpy( p_sys->p_style, &default_text_style, sizeof( text_style_t ) );
+    p_sys->p_style = text_style_New();
 
     config_ChainParse( p_filter, CFG_PREFIX, ppsz_filter_options,
                        p_filter->p_cfg );
@@ -242,7 +241,7 @@ static void DestroyFilter( vlc_object_t *p_this )
     filter_t *p_filter = (filter_t *)p_this;
     filter_sys_t *p_sys = p_filter->p_sys;
 
-    free( p_sys->p_style );
+    text_style_Delete( p_sys->p_style );
     free( p_sys->psz_marquee );
 
     /* Delete the marquee variables */
@@ -323,7 +322,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
     p_spu->p_region->i_x = p_sys->i_xoff;
     p_spu->p_region->i_y = p_sys->i_yoff;
 
-    p_spu->p_region->p_style = p_sys->p_style;
+    p_spu->p_region->p_style = text_style_Duplicate( p_sys->p_style );
 
 out:
     vlc_mutex_unlock( &p_sys->lock );
index 8eef177220630dd8bde0f8792924646dd62b459e..c08083aa643b689a5f041ae33fa10731f7e86e0a 100644 (file)
@@ -272,7 +272,7 @@ static int CreateFilter( vlc_object_t *p_this )
     }
     p_sys->psz_marquee[p_sys->i_length] = '\0';
 
-    p_sys->p_style = malloc( sizeof( text_style_t ));
+    p_sys->p_style = text_style_New();
     if( p_sys->p_style == NULL )
     {
         free( p_sys->psz_marquee );
@@ -282,7 +282,6 @@ static int CreateFilter( vlc_object_t *p_this )
         free( p_sys );
         return VLC_ENOMEM;
     }
-    memcpy( p_sys->p_style, &default_text_style, sizeof( text_style_t ));
 
     p_sys->i_xoff = var_CreateGetInteger( p_filter, CFG_PREFIX "x" );
     p_sys->i_yoff = var_CreateGetInteger( p_filter, CFG_PREFIX "y" );
@@ -299,7 +298,7 @@ static int CreateFilter( vlc_object_t *p_this )
     if( FetchRSS( p_filter ) )
     {
         msg_Err( p_filter, "failed while fetching RSS ... too bad" );
-        free( p_sys->p_style );
+        text_style_Delete( p_sys->p_style );
         free( p_sys->psz_marquee );
         vlc_mutex_unlock( &p_sys->lock );
         vlc_mutex_destroy( &p_sys->lock );
@@ -311,7 +310,7 @@ static int CreateFilter( vlc_object_t *p_this )
 
     if( p_sys->i_feeds == 0 )
     {
-        free( p_sys->p_style );
+        text_style_Delete( p_sys->p_style );
         free( p_sys->psz_marquee );
         vlc_mutex_unlock( &p_sys->lock );
         vlc_mutex_destroy( &p_sys->lock );
@@ -323,7 +322,7 @@ static int CreateFilter( vlc_object_t *p_this )
     {
         if( p_sys->p_feeds[i_feed].i_items == 0 )
         {
-            free( p_sys->p_style );
+            text_style_Delete( p_sys->p_style );
             free( p_sys->psz_marquee );
             FreeRSS( p_filter );
             vlc_mutex_unlock( &p_sys->lock );
@@ -351,7 +350,7 @@ static void DestroyFilter( vlc_object_t *p_this )
 
     vlc_mutex_lock( &p_sys->lock );
 
-    free( p_sys->p_style );
+    text_style_Delete( p_sys->p_style );
     free( p_sys->psz_marquee );
     free( p_sys->psz_urls );
     FreeRSS( p_filter );
@@ -530,7 +529,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
         p_spu->b_absolute = false;
     }
 
-    p_spu->p_region->p_style = p_sys->p_style;
+    p_spu->p_region->p_style = text_style_Duplicate( p_sys->p_style );
 
     if( p_feed->p_pic )
     {
index d72c10f8051a2271ad641244972b59e4f3f6cc6d..1d1a52ded8b7a362868fcfc313cb6cddfb971824 100644 (file)
@@ -534,4 +534,8 @@ vout_ShowTextAbsolute
 vout_ShowTextRelative
 vout_UnlinkPicture
 __xml_Create
+text_style_Copy
+text_style_Delete
+text_style_Duplicate
+text_style_New
 xml_Delete
index 2c7a1c557939d6ec570e9623e339a8fd3d3dcd60..7ae4be9b5d6990f09c587d23e6a5b9f1eed960e7 100644 (file)
  * \param p_spu pointer to the subpicture queue the text is to be showed on
  * \param i_channel Subpicture channel
  * \param psz_string The text to be shown
- * \param p_style Pointer to a struct with text style info
+ * \param p_style Pointer to a struct with text style info (it is duplicated)
  * \param i_flags flags for alignment and such
  * \param i_hmargin horizontal margin in pixels
  * \param i_vmargin vertical margin in pixels
  * \param i_duration Amount of time the text is to be shown.
  */
 int osd_ShowTextRelative( spu_t *p_spu, int i_channel,
-                           const char *psz_string, text_style_t *p_style,
+                           const char *psz_string, const text_style_t *p_style,
                            int i_flags, int i_hmargin, int i_vmargin,
                            mtime_t i_duration )
 {
@@ -58,7 +58,7 @@ int osd_ShowTextRelative( spu_t *p_spu, int i_channel,
  * \param p_spu pointer to the subpicture queue the text is to be showed on
  * \param i_channel Subpicture channel
  * \param psz_string The text to be shown
- * \param p_style Pointer to a struct with text style info
+ * \param p_style Pointer to a struct with text style info (it is duplicated)
  * \param i_flags flags for alignment and such
  * \param i_hmargin horizontal margin in pixels
  * \param i_vmargin vertical margin in pixels
@@ -68,7 +68,7 @@ int osd_ShowTextRelative( spu_t *p_spu, int i_channel,
  *               is about to be shown
  */
 int osd_ShowTextAbsolute( spu_t *p_spu_channel, int i_channel,
-                           const char *psz_string, text_style_t *p_style,
+                           const char *psz_string, const text_style_t *p_style,
                            int i_flags, int i_hmargin, int i_vmargin,
                            mtime_t i_start, mtime_t i_stop )
 {
index d0e7a0ac3c7ca4e8faea8c94bf2f1891c5a2aa94..d153b2017930268071485efb764a8a7c3c31b4ab 100644 (file)
  * \param p_vout pointer to the vout the text is to be showed on
  * \param i_channel Subpicture channel
  * \param psz_string The text to be shown
- * \param p_style Pointer to a struct with text style info
+ * \param p_style Pointer to a struct with text style info (it is duplicated if non NULL)
  * \param i_flags flags for alignment and such
  * \param i_hmargin horizontal margin in pixels
  * \param i_vmargin vertical margin in pixels
  * \param i_duration Amount of time the text is to be shown.
  */
 int vout_ShowTextRelative( vout_thread_t *p_vout, int i_channel,
-                           char *psz_string, text_style_t *p_style,
+                           char *psz_string, const text_style_t *p_style,
                            int i_flags, int i_hmargin, int i_vmargin,
                            mtime_t i_duration )
 {
@@ -59,7 +59,7 @@ int vout_ShowTextRelative( vout_thread_t *p_vout, int i_channel,
  * \param p_vout pointer to the vout the text is to be showed on
  * \param i_channel Subpicture channel
  * \param psz_string The text to be shown
- * \param p_style Pointer to a struct with text style info
+ * \param p_style Pointer to a struct with text style info (it is duplicated if non NULL)
  * \param i_flags flags for alignment and such
  * \param i_hmargin horizontal margin in pixels
  * \param i_vmargin vertical margin in pixels
@@ -69,14 +69,12 @@ int vout_ShowTextRelative( vout_thread_t *p_vout, int i_channel,
  *               is about to be shown
  */
 int vout_ShowTextAbsolute( vout_thread_t *p_vout, int i_channel,
-                           const char *psz_string, text_style_t *p_style,
+                           const char *psz_string, const text_style_t *p_style,
                            int i_flags, int i_hmargin, int i_vmargin,
                            mtime_t i_start, mtime_t i_stop )
 {
-    (void)p_style;
     subpicture_t *p_spu;
     video_format_t fmt;
-    /* (void)p_style; FIXME: <-- why ask for this if it's unused?!? */
 
     if( !psz_string ) return VLC_EGENERIC;
 
@@ -110,6 +108,8 @@ int vout_ShowTextAbsolute( vout_thread_t *p_vout, int i_channel,
     p_spu->p_region->i_align = i_flags & SUBPICTURE_ALIGN_MASK;
     p_spu->p_region->i_x = i_hmargin;
     p_spu->p_region->i_y = i_vmargin;
+    if( p_style )
+        p_spu->p_region->p_style = text_style_Duplicate( p_style );
 
     spu_DisplaySubpicture( p_vout->p_spu, p_spu );
 
@@ -151,3 +151,69 @@ void __vout_OSDMessage( vlc_object_t *p_caller, int i_channel,
         va_end( args );
     }
 }
+
+/* */
+text_style_t *text_style_New( void )
+{
+    text_style_t *p_style = calloc( 1, sizeof(*p_style) );
+    if( !p_style )
+        return NULL;
+
+    /* initialize to default text style */
+    p_style->psz_fontname = NULL;
+    p_style->i_font_size = 22;
+    p_style->i_font_color = 0xffffff;
+    p_style->i_font_alpha = 0xff;
+    p_style->i_style_flags = STYLE_OUTLINE;
+    p_style->i_outline_color = 0x000000;
+    p_style->i_outline_alpha = 0xff;
+    p_style->i_shadow_color = 0x000000;
+    p_style->i_shadow_alpha = 0xff;
+    p_style->i_background_color = 0xffffff;
+    p_style->i_background_alpha = 0x80;
+    p_style->i_karaoke_background_color = 0xffffff;
+    p_style->i_karaoke_background_alpha = 0xff;
+    p_style->i_outline_width = 1;
+    p_style->i_shadow_width = 0;
+    p_style->i_spacing = -1;
+
+    return p_style;
+}
+
+text_style_t *text_style_Copy( text_style_t *p_dst, const text_style_t *p_src )
+{
+    if( !p_src )
+        return p_dst;
+
+    /* */
+    if( p_dst->psz_fontname )
+        free( p_dst->psz_fontname );
+
+    /* */
+    *p_dst = *p_src;
+
+    /* */
+    if( p_dst->psz_fontname )
+        p_dst->psz_fontname = strdup( p_dst->psz_fontname );
+
+    return p_dst;
+}
+
+text_style_t *text_style_Duplicate( const text_style_t *p_src )
+{
+    if( !p_src )
+        return NULL;
+
+    text_style_t *p_dst = calloc( 1, sizeof(*p_dst) );
+    if( p_dst )
+        text_style_Copy( p_dst, p_src );
+    return p_dst;
+}
+
+void text_style_Delete( text_style_t *p_style )
+{
+    if( p_style )
+        free( p_style->psz_fontname );
+    free( p_style );
+}
+
index 393b4bbcec3d1de87bc771e50e4f65ae9e7d29ff..104a9b2f6fc095ef180a90469b2d0fbf57955597 100644 (file)
@@ -779,7 +779,8 @@ void subpicture_region_Delete( subpicture_region_t *p_region )
 
     free( p_region->psz_text );
     free( p_region->psz_html );
-    //free( p_region->p_style ); FIXME --fenrir plugin does not allocate the memory for it. I think it might lead to segfault, video renderer can live longer than the decoder
+    if( p_region->p_style )
+        text_style_Delete( p_region->p_style );
     free( p_region );
 }