[vlc-commits] Added margin when using a background in freetype.

Laurent Aimar git at videolan.org
Sat Jun 25 20:23:19 CEST 2011


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Sat Jun 18 22:08:18 2011 +0200| [5bcb0a0314fcd31c00d4e594fde9e7056682903e] | committer: Laurent Aimar

Added margin when using a background in freetype.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5bcb0a0314fcd31c00d4e594fde9e7056682903e
---

 modules/misc/text_renderer/freetype.c |   35 +++++++++++++++++++++-----------
 1 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/modules/misc/text_renderer/freetype.c b/modules/misc/text_renderer/freetype.c
index 0181d83..1524ca3 100644
--- a/modules/misc/text_renderer/freetype.c
+++ b/modules/misc/text_renderer/freetype.c
@@ -755,17 +755,20 @@ static inline void BlendYUVALine( picture_t *p_picture,
 static int RenderYUVA( filter_t *p_filter,
                        subpicture_region_t *p_region,
                        line_desc_t *p_line_head,
-                       FT_BBox *p_bbox )
+                       FT_BBox *p_bbox,
+                       int i_margin )
 {
     filter_sys_t *p_sys = p_filter->p_sys;
 
     /* Create a new subpicture region */
+    const int i_text_width  = p_bbox->xMax - p_bbox->xMin;
+    const int i_text_height = p_bbox->yMax - p_bbox->yMin;
     video_format_t fmt;
     video_format_Init( &fmt, VLC_CODEC_YUVA );
     fmt.i_width          =
-    fmt.i_visible_width  = p_bbox->xMax - p_bbox->xMin;
+    fmt.i_visible_width  = i_text_width  + 2 * i_margin;
     fmt.i_height         =
-    fmt.i_visible_height = p_bbox->yMax - p_bbox->yMin;
+    fmt.i_visible_height = i_text_height + 2 * i_margin;
 
     picture_t *p_picture = p_region->p_picture = picture_NewFromFormat( &fmt );
     if( !p_region->p_picture )
@@ -789,16 +792,16 @@ static int RenderYUVA( filter_t *p_filter,
     /* Render all lines */
     for( line_desc_t *p_line = p_line_head; p_line != NULL; p_line = p_line->p_next )
     {
-        /* Left offset to take into account alignment */
-        int i_align_left = 0;
-        if( p_line->i_width < fmt.i_visible_width )
+        int i_align_left = i_margin;
+        if( p_line->i_width < i_text_width )
         {
+            /* Left offset to take into account alignment */
             if( (p_region->i_align & 0x3) == SUBPICTURE_ALIGN_RIGHT )
-                i_align_left = ( fmt.i_visible_width - p_line->i_width );
+                i_align_left += ( i_text_width - p_line->i_width );
             else if( (p_region->i_align & 0x3) != SUBPICTURE_ALIGN_LEFT )
-                i_align_left = ( fmt.i_visible_width - p_line->i_width ) / 2;
+                i_align_left += ( i_text_width - p_line->i_width ) / 2;
         }
-        int i_align_top = 0;
+        int i_align_top = i_margin;
 
         /* Render all glyphs and underline/strikethrough */
         for( int i = 0; i < p_line->i_character_count; i++ )
@@ -1610,7 +1613,8 @@ static void BBoxEnlarge( FT_BBox *p_max, const FT_BBox *p )
 
 static int ProcessLines( filter_t *p_filter,
                          line_desc_t **pp_lines,
-                         FT_BBox   *p_bbox,
+                         FT_BBox     *p_bbox,
+                         int         *pi_max_face_height,
 
                          uint32_t *psz_text,
                          text_style_t **pp_styles,
@@ -1706,6 +1710,7 @@ static int ProcessLines( filter_t *p_filter,
     }
     free( p_new_positions );
 
+    *pi_max_face_height = 0;
     *pp_lines = NULL;
     line_desc_t **pp_line_next = pp_lines;
 
@@ -1967,6 +1972,8 @@ static int ProcessLines( filter_t *p_filter,
             pp_line_next = &p_line->p_next;
         }
 
+        *pi_max_face_height = __MAX( *pi_max_face_height, i_face_height );
+
         /* Skip what we have rendered and the line delimitor if present */
         i_start = i_index;
         if( i_start < i_len && psz_text[i_start] == '\n' )
@@ -2026,6 +2033,7 @@ static int RenderCommon( filter_t *p_filter, subpicture_region_t *p_region_out,
     int rv = VLC_SUCCESS;
     int i_text_length = 0;
     FT_BBox bbox;
+    int i_max_face_height;
     line_desc_t *p_lines = NULL;
 
     uint32_t *pi_k_durations   = NULL;
@@ -2118,7 +2126,7 @@ static int RenderCommon( filter_t *p_filter, subpicture_region_t *p_region_out,
     if( !rv && i_text_length > 0 )
     {
         rv = ProcessLines( p_filter,
-                           &p_lines, &bbox,
+                           &p_lines, &bbox, &i_max_face_height,
                            psz_text, pp_styles, pi_k_durations, i_text_length );
     }
 
@@ -2132,7 +2140,10 @@ static int RenderCommon( filter_t *p_filter, subpicture_region_t *p_region_out,
         if( var_InheritBool( p_filter, "freetype-yuvp" ) )
             RenderYUVP( p_filter, p_region_out, p_lines, &bbox );
         else
-            RenderYUVA( p_filter, p_region_out, p_lines, &bbox );
+            RenderYUVA( p_filter, p_region_out,
+                        p_lines,
+                        &bbox,
+                        p_sys->i_background_opacity > 0 ? i_max_face_height / 4 : 0 );
 
         /* With karaoke, we're going to have to render the text a number
          * of times to show the progress marker on the text.



More information about the vlc-commits mailing list