[vlc-commits] Implemented per glyph alpha support.

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


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Thu Jun 16 01:01:01 2011 +0200| [a147594cdc6ca1e15d92d674ef27c29bfeb19d06] | committer: Laurent Aimar

Implemented per glyph alpha support.

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

 modules/misc/text_renderer/freetype.c |   21 ++++++++++-----------
 1 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/modules/misc/text_renderer/freetype.c b/modules/misc/text_renderer/freetype.c
index 5aeb65c..99f8741 100644
--- a/modules/misc/text_renderer/freetype.c
+++ b/modules/misc/text_renderer/freetype.c
@@ -203,7 +203,7 @@ struct line_desc_t
     FT_BitmapGlyph *pp_glyphs;
     /** list of relative positions for the glyphs */
     FT_Vector      *p_glyph_pos;
-    /** list of RGB information for styled text */
+    /** list of ARGB information for styled text */
     uint32_t       *pi_color;
     /** underline information -- only supplied if text should be underlined */
     int            *pi_underline_offset;
@@ -211,8 +211,6 @@ struct line_desc_t
 
     int             i_width;
 
-    int             i_alpha;
-
     line_desc_t    *p_next;
 };
 
@@ -599,6 +597,7 @@ static int RenderYUVP( filter_t *p_filter, subpicture_region_t *p_region,
 
     /* Calculate text color components
      * Only use the first color */
+    int i_alpha = 0xff - ((p_line->pi_color[ 0 ] >> 24) & 0xff);
     YUVFromRGB( p_line->pi_color[ 0 ], &i_y, &i_u, &i_v );
 
     /* Build palette */
@@ -610,7 +609,7 @@ static int RenderYUVP( filter_t *p_filter, subpicture_region_t *p_region,
         fmt.p_palette->palette[i][2] = 0x80;
         fmt.p_palette->palette[i][3] = pi_gamma[i];
         fmt.p_palette->palette[i][3] =
-            (int)fmt.p_palette->palette[i][3] * (255 - p_line->i_alpha) / 255;
+            (int)fmt.p_palette->palette[i][3] * i_alpha / 255;
     }
     for( i = 8; i < fmt.p_palette->i_entries; i++ )
     {
@@ -619,7 +618,7 @@ static int RenderYUVP( filter_t *p_filter, subpicture_region_t *p_region,
         fmt.p_palette->palette[i][2] = i_v;
         fmt.p_palette->palette[i][3] = pi_gamma[i];
         fmt.p_palette->palette[i][3] =
-            (int)fmt.p_palette->palette[i][3] * (255 - p_line->i_alpha) / 255;
+            (int)fmt.p_palette->palette[i][3] * i_alpha / 255;
     }
 
     p_dst = p_region->p_picture->Y_PIXELS;
@@ -864,7 +863,7 @@ static int RenderYUVA( filter_t *p_filter,
             FT_BitmapGlyph p_glyph = p_line->pp_glyphs[i];
 
             uint32_t i_color = p_line->pi_color[i];
-            i_a = 0xff; /* FIXME */
+            i_a = 0xff - ((i_color >> 24) & 0xff);
             YUVFromRGB( i_color, &i_y, &i_u, &i_v );
 
             int i_picture_y = p_line->p_glyph_pos[i].y + i_align_top;
@@ -1498,7 +1497,6 @@ static line_desc_t *NewLine( int i_count )
         return NULL;
 
     p_line->i_width = 0;
-    p_line->i_alpha = 0xff;
 
     p_line->p_next = NULL;
 
@@ -1877,8 +1875,10 @@ static int ProcessLines( filter_t *p_filter,
                     .y = pen.y
                 };
                 bool     b_karaoke = pi_karaoke_bar && pi_karaoke_bar[i_index] != 0;
-                uint32_t i_color = b_karaoke ? p_glyph_style->i_karaoke_background_color
-                                             : p_glyph_style->i_font_color;
+                uint32_t i_color = b_karaoke ? (p_glyph_style->i_karaoke_background_color |
+                                                (p_glyph_style->i_karaoke_background_alpha << 24))
+                                             : (p_glyph_style->i_font_color |
+                                                (p_glyph_style->i_font_alpha << 24));
                 int i_ul_offset    = 0;
                 int i_ul_thickness = 0;
                 if( p_glyph_style->i_style_flags & (STYLE_UNDERLINE | STYLE_STRIKEOUT) )
@@ -1943,7 +1943,7 @@ static int ProcessLines( filter_t *p_filter,
                 int i_line_index = i_index - i_start;
                 p_line->pp_glyphs[i_line_index] = (FT_BitmapGlyph)glyph;
                 p_line->p_glyph_pos[i_line_index] = glyph_pos;
-                p_line->pi_color[i_line_index] = i_color; /* FIXME alpha per glyph */
+                p_line->pi_color[i_line_index] = i_color;
                 p_line->pi_underline_offset[i_line_index] = i_ul_offset;
                 p_line->pi_underline_thickness[i_line_index] = i_ul_thickness;
 
@@ -1971,7 +1971,6 @@ static int ProcessLines( filter_t *p_filter,
         /* Terminate and append the line */
         if( p_line )
         {
-            p_line->i_alpha  = 0x00;
             p_line->i_width  = line_bbox.xMax - line_bbox.xMin;
             *pp_line_next = p_line;
             pp_line_next = &p_line->p_next;



More information about the vlc-commits mailing list