]> git.sesse.net Git - vlc/blobdiff - modules/misc/freetype.c
freetype and rc extensions. i_font_color and i_font_opacity added to subpictures...
[vlc] / modules / misc / freetype.c
index 0c41f1bf757caea484133d8d9aaf973e430d1ec8..cfae002a5d630fa9ced5f3e84ad42da6689f4f40 100644 (file)
@@ -70,12 +70,9 @@ typedef struct line_desc_t line_desc_t;
 static int  Create ( vlc_object_t * );
 static void Destroy( vlc_object_t * );
 
-static subpicture_t *RenderText( filter_t *, block_t * );
+/* The RenderText call maps to pf_render_string, defined in vlc_filter.h */
+static subpicture_t *RenderText( filter_t *, block_t *, int, int );
 static line_desc_t *NewLine( byte_t * );
-static int FreetypeCallback( vlc_object_t *p_this, char const *psz_var,
-                            vlc_value_t oldval, vlc_value_t newval,
-                            void *p_data );
-
 
 /*****************************************************************************
  * Module descriptor
@@ -115,9 +112,11 @@ vlc_module_begin();
               VLC_FALSE );
     add_integer( "freetype-fontsize", 0, NULL, FONTSIZE_TEXT,
                  FONTSIZE_LONGTEXT, VLC_TRUE );
+    /* opacity valid on 0..255, with default 255 = fully opaque */
     add_integer_with_range( "freetype-opacity", 255, 0, 255, NULL,
         OPACITY_TEXT, OPACITY_LONGTEXT, VLC_FALSE );
-    add_integer( "freetype-color", 0xFFFFFF, NULL, COLOR_TEXT, COLOR_LONGTEXT, VLC_TRUE );
+    /* hook to the color values list, with default 0x00ffffff = white */
+    add_integer( "freetype-color", 0x00FFFFFF, NULL, COLOR_TEXT, COLOR_LONGTEXT, VLC_TRUE );
         change_integer_list( pi_color_values, ppsz_color_descriptions, 0 );
 
     add_integer( "freetype-rel-fontsize", 16, NULL, FONTSIZER_TEXT,
@@ -169,15 +168,11 @@ 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_opacity;   
-    uint8_t        i_defaultopacity; /* freetype-opacity */
-    uint8_t        i_tempopacity; /* font-opacity dynamic changes */
-    int            i_tempcolor;   /* font-color dynamic changes */
-    int            i_defaultcolor;  /* freetype-color */
-    int            i_red, i_green, i_blue; /* color components */
+    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_opacity; /*  function var to render */
     uint8_t        pi_gamma[256];
-    vlc_bool_t     b_need_color;  /* flag for font color changes */
-    vlc_bool_t     b_need_opacity;  /* flag for font opacity changes */
 };
 
 /*****************************************************************************
@@ -193,7 +188,6 @@ static int Create( vlc_object_t *p_this )
     int i, i_error;
     int i_fontsize = 0;
     vlc_value_t val;
-    vlc_object_t *p_input;
 
     /* Allocate structure */
     p_sys = malloc( sizeof( filter_sys_t ) );
@@ -205,32 +199,6 @@ static int Create( vlc_object_t *p_this )
     p_sys->p_face = 0;
     p_sys->p_library = 0;
     
-    /* Hook used for callback variables */
-    p_input = vlc_object_find( p_this, VLC_OBJECT_INPUT, FIND_ANYWHERE );
-    if( !p_input )
-    {
-        return VLC_ENOOBJ;
-    }
-   
-    /* accessible variables, to allow individual text subfilters to set their own values */
-    p_sys->i_tempcolor = var_CreateGetInteger( p_input->p_libvlc , "font-color" );
-    p_sys->i_tempopacity = var_CreateGetInteger( p_input->p_libvlc , "font-opacity" );
-    var_AddCallback( p_input->p_libvlc, "font-color", FreetypeCallback, p_sys );
-    var_AddCallback( p_input->p_libvlc, "font-opacity", FreetypeCallback, p_sys );
-    vlc_object_release( p_input ); /* free the hook */
-
-    /* default to opaque letters, white (all colors set to 255): */
-    p_sys->i_opacity = 255;
-    p_sys->i_defaultopacity = 255;
-    p_sys->i_red = 255;
-    p_sys->i_green = 255;
-    p_sys->i_blue = 255;
-    p_sys->i_defaultcolor = 0x00FFFFFF;
-    
-    /* miscellaneous initialization */
-    p_sys->b_need_color = VLC_FALSE; /* inversion of true/false */
-    p_sys->b_need_opacity = VLC_FALSE;   
-
     for( i = 0; i < 256; i++ )
     {
         p_sys->pi_gamma[i] = (uint8_t)( pow( (double)i * 255.0f, 0.5f ) );
@@ -244,16 +212,12 @@ static int Create( vlc_object_t *p_this )
                 VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
     var_Create( p_filter, "freetype-opacity", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
     var_Get( p_filter, "freetype-opacity", &val );
-    p_sys->i_opacity = __MAX( __MIN( val.i_int, 255 ), 0 );
-    p_sys->i_defaultopacity = p_sys->i_opacity;
+    p_sys->i_font_opacity = __MAX( __MIN( val.i_int, 255 ), 0 );
     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 < 0x00FFFFFF ) )  /* valid range */
     {
-           p_sys->i_defaultcolor = val.i_int;
-        p_sys->i_blue = val.i_int & 0x000000FF;
-        p_sys->i_green = (val.i_int & 0x0000FF00)/256;
-        p_sys->i_red = (val.i_int & 0x00FF0000)/(256*256);
+           p_sys->i_font_color = val.i_int;
     }
     else msg_Warn(p_filter, "Invalid freetype color specified, using white [0xFFFFFF]");        
 
@@ -349,20 +313,9 @@ static int Create( vlc_object_t *p_this )
  *****************************************************************************/
 static void Destroy( vlc_object_t *p_this )
 {
-    vlc_object_t *p_input;
-
     filter_t *p_filter = (filter_t *)p_this;
     filter_sys_t *p_sys = p_filter->p_sys;
 
-    p_input = vlc_object_find( p_this, VLC_OBJECT_INPUT, FIND_ANYWHERE );
-    if( !p_input )
-    {
-        return;
-    }
-    var_Destroy( p_input->p_libvlc , "font-color" );
-    var_Destroy( p_input->p_libvlc , "font-opacity" );
-    vlc_object_release( p_input );
-
     FT_Done_Face( p_sys->p_face );
     FT_Done_FreeType( p_sys->p_library );
     free( p_sys );
@@ -468,8 +421,7 @@ static void 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*pi_gamma[p_glyph->bitmap.buffer[i_bitmap_offset]] *
-                                       opacity / ( 256 * 256 );
+                   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;
                }
@@ -487,7 +439,8 @@ static void Render( filter_t *p_filter, subpicture_t *p_spu,
  * needed glyphs into memory. It is used as pf_add_string callback in
  * the vout method by this module
  */
-static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block )
+static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block, 
+                                 int font_color, int font_opacity )
 {
     filter_sys_t *p_sys = p_filter->p_sys;
     subpicture_t *p_subpic = 0;
@@ -733,31 +686,28 @@ static subpicture_t *RenderText( filter_t *p_filter, block_t *p_block )
 
 #undef face
 #undef glyph
-
 /* check to see whether to use the default color/opacity, or another one: */
-    if( !p_sys->b_need_color ) 
+    if( font_color < 0 ) 
     {
-           p_sys->i_blue = p_sys->i_tempcolor & 0x000000FF;
-        p_sys->i_green = (p_sys->i_tempcolor & 0x0000FF00)/256;
-        p_sys->i_red = (p_sys->i_tempcolor & 0x00FF0000)/(256*256);
+           p_sys->i_blue = p_sys->i_font_color & 0x000000FF;
+        p_sys->i_green = (p_sys->i_font_color & 0x0000FF00)/256;
+        p_sys->i_red = (p_sys->i_font_color & 0x00FF0000)/(256*256);
     }
     else
     {
-        p_sys->i_blue = p_sys->i_defaultcolor & 0x000000FF;
-        p_sys->i_green = (p_sys->i_defaultcolor & 0x0000FF00)/256;
-        p_sys->i_red = (p_sys->i_defaultcolor & 0x00FF0000)/(256*256);
-        p_sys->b_need_color = VLC_FALSE;
-    }
-    if( !p_sys->b_need_opacity )
+           p_sys->i_blue = font_color & 0x000000FF;
+        p_sys->i_green = (font_color & 0x0000FF00)/256;
+        p_sys->i_red = (font_color & 0x00FF0000)/(256*256);
+       }
+    if( font_opacity < 0 )
     {
-       p_sys->i_opacity = p_sys->i_tempopacity;
+        p_sys->i_opacity = p_sys->i_font_opacity;
     }
     else
     {
-       p_sys->i_opacity = p_sys->i_defaultopacity;
-       p_sys->b_need_opacity = VLC_FALSE;
+           p_sys->i_opacity = (uint8_t) ( font_opacity & 0x000000FF );
     }
-   
+
     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 );
@@ -837,24 +787,3 @@ static line_desc_t *NewLine( byte_t *psz_string )
 
     return p_line;
 }
-/**********************************************************************
- * Callback to update params on the fly
- **********************************************************************/
-static int FreetypeCallback( vlc_object_t *p_this, char const *psz_var,
-                            vlc_value_t oldval, vlc_value_t newval,
-                            void *p_data )
-{
-    filter_sys_t *p_sys = (filter_sys_t *) p_data;
-
-    if ( !strncmp( psz_var, "font-color", 8 ) )
-    {
-        p_sys->i_tempcolor = newval.i_int;
-        p_sys->b_need_color = VLC_TRUE;
-    }
-    else if ( !strncmp( psz_var, "font-opacity", 8 ) )
-    {
-        p_sys->i_tempopacity = newval.i_int;
-        p_sys->b_need_opacity = VLC_TRUE;
-    }
-    return VLC_SUCCESS;
-}