// Preamble
//////////////////////////////////////////////////////////////////////////////
-#include <vlc/vlc.h>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_plugin.h>
#include <vlc_vout.h>
#include <vlc_osd.h>
#include <vlc_block.h>
static int RenderHtml( filter_t *, subpicture_region_t *,
subpicture_region_t * );
+static int GetFontSize( filter_t *p_filter );
static int RenderYUVA( filter_t *p_filter, subpicture_region_t *p_region,
UniChar *psz_utfString, uint32_t i_text_len,
uint32_t i_runs, uint32_t *pi_run_lengths,
ATSUStyle *pp_styles );
static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size,
uint32_t i_font_color,
- vlc_bool_t b_bold, vlc_bool_t b_italic,
- vlc_bool_t b_uline );
+ bool b_bold, bool b_italic,
+ bool b_uline );
//////////////////////////////////////////////////////////////////////////////
// Module descriptor
//////////////////////////////////////////////////////////////////////////////
// RenderText. This module, unlike Freetype, doesn't provide any options to
// override the fallback font selection used when this style information is
// absent.
+#define FONT_TEXT N_("Font")
+#define FONT_LONGTEXT N_("Name for the font you want to use")
+#define FONTSIZER_TEXT N_("Relative font size")
+#define FONTSIZER_LONGTEXT N_("This is the relative default size of the " \
+ "fonts that will be rendered on the video. If absolute font size is set, "\
+ "relative size will be overriden." )
+#define COLOR_TEXT N_("Text default color")
+#define COLOR_LONGTEXT N_("The color of the text that will be rendered on "\
+ "the video. This must be an hexadecimal (like HTML colors). The first two "\
+ "chars are for red, then green, then blue. #000000 = black, #FF0000 = red,"\
+ " #00FF00 = green, #FFFF00 = yellow (red + green), #FFFFFF = white" )
+
+static const int pi_color_values[] = {
+ 0x00000000, 0x00808080, 0x00C0C0C0, 0x00FFFFFF, 0x00800000,
+ 0x00FF0000, 0x00FF00FF, 0x00FFFF00, 0x00808000, 0x00008000, 0x00008080,
+ 0x0000FF00, 0x00800080, 0x00000080, 0x000000FF, 0x0000FFFF };
+
+static const char *const ppsz_color_descriptions[] = {
+ N_("Black"), N_("Gray"), N_("Silver"), N_("White"), N_("Maroon"),
+ N_("Red"), N_("Fuchsia"), N_("Yellow"), N_("Olive"), N_("Green"), N_("Teal"),
+ N_("Lime"), N_("Purple"), N_("Navy"), N_("Blue"), N_("Aqua") };
+
+static const int pi_sizes[] = { 20, 18, 16, 12, 6 };
+static const char *const ppsz_sizes_text[] = {
+ N_("Smaller"), N_("Small"), N_("Normal"), N_("Large"), N_("Larger") };
+
vlc_module_begin();
- set_shortname( _("Mac Text renderer"));
- set_description( _("Quartz font renderer") );
+ set_shortname( N_("Mac Text renderer"));
+ set_description( N_("Quartz font renderer") );
set_category( CAT_VIDEO );
set_subcategory( SUBCAT_VIDEO_SUBPIC );
+ add_string( "quartztext-font", DEFAULT_FONT, NULL, FONT_TEXT, FONT_LONGTEXT,
+ false );
+ add_integer( "quartztext-rel-fontsize", DEFAULT_REL_FONT_SIZE, NULL, FONTSIZER_TEXT,
+ FONTSIZER_LONGTEXT, false );
+ change_integer_list( pi_sizes, ppsz_sizes_text, NULL );
+ add_integer( "quartztext-color", 0x00FFFFFF, NULL, COLOR_TEXT,
+ COLOR_LONGTEXT, false );
+ change_integer_list( pi_color_values, ppsz_color_descriptions, NULL );
set_capability( "text renderer", 120 );
add_shortcut( "text" );
set_callbacks( Create, Destroy );
{
char *psz_name;
int i_size;
- uint32_t i_color;
+ uint32_t i_color; // ARGB
font_stack_t *p_next;
};
// Allocate structure
p_filter->p_sys = p_sys = malloc( sizeof( filter_sys_t ) );
if( !p_sys )
- {
- msg_Err( p_filter, "out of memory" );
return VLC_ENOMEM;
- }
- p_sys->psz_font_name = strdup( DEFAULT_FONT );
+ p_sys->psz_font_name = var_CreateGetString( p_this, "quartztext-font" );
p_sys->i_font_opacity = 255;
- p_sys->i_font_color = DEFAULT_FONT_COLOR;
- p_sys->i_font_size = p_filter->fmt_out.video.i_height / DEFAULT_REL_FONT_SIZE;
+ p_sys->i_font_color = __MAX( __MIN( var_CreateGetInteger( p_this, "quartztext-color" ) , 0xFFFFFF ), 0 );
+ p_sys->i_font_size = GetFontSize( p_filter );
p_filter->pf_render_text = RenderText;
p_filter->pf_render_html = RenderHtml;
free( p_sys->p_fonts );
}
- if( p_sys->psz_font_name ) free( p_sys->psz_font_name );
-
+ free( p_sys->psz_font_name );
free( p_sys );
}
int i_string_length;
p_cfString = CFStringCreateWithCString( NULL, psz_utf8_str, kCFStringEncodingUTF8 );
+ if( !p_cfString )
+ return;
+
i_string_length = CFStringGetLength( p_cfString );
if( pi_strlen )
uint32_t i_string_length;
char *psz_string;
int i_font_color, i_font_alpha, i_font_size;
+ vlc_value_t val;
+ int i_scale = 1000;
+
+ p_sys->i_font_size = GetFontSize( p_filter );
// Sanity check
if( !p_region_in || !p_region_out ) return VLC_EGENERIC;
psz_string = p_region_in->psz_text;
if( !psz_string || !*psz_string ) return VLC_EGENERIC;
+ if( VLC_SUCCESS == var_Get( p_filter, "scale", &val ))
+ i_scale = val.i_int;
+
if( p_region_in->p_style )
{
i_font_color = __MAX( __MIN( p_region_in->p_style->i_font_color, 0xFFFFFF ), 0 );
i_font_alpha = __MAX( __MIN( p_region_in->p_style->i_font_alpha, 255 ), 0 );
- i_font_size = __MAX( __MIN( p_region_in->p_style->i_font_size, 255 ), 0 );
+ i_font_size = __MAX( __MIN( p_region_in->p_style->i_font_size, 255 ), 0 ) * i_scale / 1000;
}
else
{
if( psz_utf16_str != NULL )
{
ATSUStyle p_style = CreateStyle( p_sys->psz_font_name, i_font_size,
- (i_font_color & 0xfffffff) |
+ (i_font_color & 0xffffff) |
((i_font_alpha & 0xff) << 24),
- VLC_FALSE, VLC_FALSE, VLC_FALSE );
+ false, false, false );
if( p_style )
{
RenderYUVA( p_filter, p_region_out, psz_utf16_str, i_string_length,
static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, uint32_t i_font_color,
- vlc_bool_t b_bold, vlc_bool_t b_italic, vlc_bool_t b_uline )
+ bool b_bold, bool b_italic, bool b_uline )
{
ATSUStyle p_style;
OSStatus status;
return VLC_SUCCESS;
}
-static ATSUStyle GetStyleFromFontStack( filter_sys_t *p_sys, font_stack_t **p_fonts,
- vlc_bool_t b_bold, vlc_bool_t b_italic, vlc_bool_t b_uline )
+static ATSUStyle GetStyleFromFontStack( filter_sys_t *p_sys,
+ font_stack_t **p_fonts, bool b_bold, bool b_italic,
+ bool b_uline )
{
ATSUStyle p_style = NULL;
uint32_t i_font_color = p_sys->i_font_color;
int i_font_size = p_sys->i_font_size;
- if( VLC_SUCCESS == PeekFont( p_fonts, &psz_fontname, &i_font_size, &i_font_color ) )
+ if( VLC_SUCCESS == PeekFont( p_fonts, &psz_fontname, &i_font_size,
+ &i_font_color ))
{
p_style = CreateStyle( psz_fontname, i_font_size, i_font_color,
b_bold, b_italic, b_uline );
return p_style;
}
+static const struct {
+ const char *psz_name;
+ uint32_t i_value;
+} p_html_colors[] = {
+ /* Official html colors */
+ { "Aqua", 0x00FFFF },
+ { "Black", 0x000000 },
+ { "Blue", 0x0000FF },
+ { "Fuchsia", 0xFF00FF },
+ { "Gray", 0x808080 },
+ { "Green", 0x008000 },
+ { "Lime", 0x00FF00 },
+ { "Maroon", 0x800000 },
+ { "Navy", 0x000080 },
+ { "Olive", 0x808000 },
+ { "Purple", 0x800080 },
+ { "Red", 0xFF0000 },
+ { "Silver", 0xC0C0C0 },
+ { "Teal", 0x008080 },
+ { "White", 0xFFFFFF },
+ { "Yellow", 0xFFFF00 },
+
+ /* Common ones */
+ { "AliceBlue", 0xF0F8FF },
+ { "AntiqueWhite", 0xFAEBD7 },
+ { "Aqua", 0x00FFFF },
+ { "Aquamarine", 0x7FFFD4 },
+ { "Azure", 0xF0FFFF },
+ { "Beige", 0xF5F5DC },
+ { "Bisque", 0xFFE4C4 },
+ { "Black", 0x000000 },
+ { "BlanchedAlmond", 0xFFEBCD },
+ { "Blue", 0x0000FF },
+ { "BlueViolet", 0x8A2BE2 },
+ { "Brown", 0xA52A2A },
+ { "BurlyWood", 0xDEB887 },
+ { "CadetBlue", 0x5F9EA0 },
+ { "Chartreuse", 0x7FFF00 },
+ { "Chocolate", 0xD2691E },
+ { "Coral", 0xFF7F50 },
+ { "CornflowerBlue", 0x6495ED },
+ { "Cornsilk", 0xFFF8DC },
+ { "Crimson", 0xDC143C },
+ { "Cyan", 0x00FFFF },
+ { "DarkBlue", 0x00008B },
+ { "DarkCyan", 0x008B8B },
+ { "DarkGoldenRod", 0xB8860B },
+ { "DarkGray", 0xA9A9A9 },
+ { "DarkGrey", 0xA9A9A9 },
+ { "DarkGreen", 0x006400 },
+ { "DarkKhaki", 0xBDB76B },
+ { "DarkMagenta", 0x8B008B },
+ { "DarkOliveGreen", 0x556B2F },
+ { "Darkorange", 0xFF8C00 },
+ { "DarkOrchid", 0x9932CC },
+ { "DarkRed", 0x8B0000 },
+ { "DarkSalmon", 0xE9967A },
+ { "DarkSeaGreen", 0x8FBC8F },
+ { "DarkSlateBlue", 0x483D8B },
+ { "DarkSlateGray", 0x2F4F4F },
+ { "DarkSlateGrey", 0x2F4F4F },
+ { "DarkTurquoise", 0x00CED1 },
+ { "DarkViolet", 0x9400D3 },
+ { "DeepPink", 0xFF1493 },
+ { "DeepSkyBlue", 0x00BFFF },
+ { "DimGray", 0x696969 },
+ { "DimGrey", 0x696969 },
+ { "DodgerBlue", 0x1E90FF },
+ { "FireBrick", 0xB22222 },
+ { "FloralWhite", 0xFFFAF0 },
+ { "ForestGreen", 0x228B22 },
+ { "Fuchsia", 0xFF00FF },
+ { "Gainsboro", 0xDCDCDC },
+ { "GhostWhite", 0xF8F8FF },
+ { "Gold", 0xFFD700 },
+ { "GoldenRod", 0xDAA520 },
+ { "Gray", 0x808080 },
+ { "Grey", 0x808080 },
+ { "Green", 0x008000 },
+ { "GreenYellow", 0xADFF2F },
+ { "HoneyDew", 0xF0FFF0 },
+ { "HotPink", 0xFF69B4 },
+ { "IndianRed", 0xCD5C5C },
+ { "Indigo", 0x4B0082 },
+ { "Ivory", 0xFFFFF0 },
+ { "Khaki", 0xF0E68C },
+ { "Lavender", 0xE6E6FA },
+ { "LavenderBlush", 0xFFF0F5 },
+ { "LawnGreen", 0x7CFC00 },
+ { "LemonChiffon", 0xFFFACD },
+ { "LightBlue", 0xADD8E6 },
+ { "LightCoral", 0xF08080 },
+ { "LightCyan", 0xE0FFFF },
+ { "LightGoldenRodYellow", 0xFAFAD2 },
+ { "LightGray", 0xD3D3D3 },
+ { "LightGrey", 0xD3D3D3 },
+ { "LightGreen", 0x90EE90 },
+ { "LightPink", 0xFFB6C1 },
+ { "LightSalmon", 0xFFA07A },
+ { "LightSeaGreen", 0x20B2AA },
+ { "LightSkyBlue", 0x87CEFA },
+ { "LightSlateGray", 0x778899 },
+ { "LightSlateGrey", 0x778899 },
+ { "LightSteelBlue", 0xB0C4DE },
+ { "LightYellow", 0xFFFFE0 },
+ { "Lime", 0x00FF00 },
+ { "LimeGreen", 0x32CD32 },
+ { "Linen", 0xFAF0E6 },
+ { "Magenta", 0xFF00FF },
+ { "Maroon", 0x800000 },
+ { "MediumAquaMarine", 0x66CDAA },
+ { "MediumBlue", 0x0000CD },
+ { "MediumOrchid", 0xBA55D3 },
+ { "MediumPurple", 0x9370D8 },
+ { "MediumSeaGreen", 0x3CB371 },
+ { "MediumSlateBlue", 0x7B68EE },
+ { "MediumSpringGreen", 0x00FA9A },
+ { "MediumTurquoise", 0x48D1CC },
+ { "MediumVioletRed", 0xC71585 },
+ { "MidnightBlue", 0x191970 },
+ { "MintCream", 0xF5FFFA },
+ { "MistyRose", 0xFFE4E1 },
+ { "Moccasin", 0xFFE4B5 },
+ { "NavajoWhite", 0xFFDEAD },
+ { "Navy", 0x000080 },
+ { "OldLace", 0xFDF5E6 },
+ { "Olive", 0x808000 },
+ { "OliveDrab", 0x6B8E23 },
+ { "Orange", 0xFFA500 },
+ { "OrangeRed", 0xFF4500 },
+ { "Orchid", 0xDA70D6 },
+ { "PaleGoldenRod", 0xEEE8AA },
+ { "PaleGreen", 0x98FB98 },
+ { "PaleTurquoise", 0xAFEEEE },
+ { "PaleVioletRed", 0xD87093 },
+ { "PapayaWhip", 0xFFEFD5 },
+ { "PeachPuff", 0xFFDAB9 },
+ { "Peru", 0xCD853F },
+ { "Pink", 0xFFC0CB },
+ { "Plum", 0xDDA0DD },
+ { "PowderBlue", 0xB0E0E6 },
+ { "Purple", 0x800080 },
+ { "Red", 0xFF0000 },
+ { "RosyBrown", 0xBC8F8F },
+ { "RoyalBlue", 0x4169E1 },
+ { "SaddleBrown", 0x8B4513 },
+ { "Salmon", 0xFA8072 },
+ { "SandyBrown", 0xF4A460 },
+ { "SeaGreen", 0x2E8B57 },
+ { "SeaShell", 0xFFF5EE },
+ { "Sienna", 0xA0522D },
+ { "Silver", 0xC0C0C0 },
+ { "SkyBlue", 0x87CEEB },
+ { "SlateBlue", 0x6A5ACD },
+ { "SlateGray", 0x708090 },
+ { "SlateGrey", 0x708090 },
+ { "Snow", 0xFFFAFA },
+ { "SpringGreen", 0x00FF7F },
+ { "SteelBlue", 0x4682B4 },
+ { "Tan", 0xD2B48C },
+ { "Teal", 0x008080 },
+ { "Thistle", 0xD8BFD8 },
+ { "Tomato", 0xFF6347 },
+ { "Turquoise", 0x40E0D0 },
+ { "Violet", 0xEE82EE },
+ { "Wheat", 0xF5DEB3 },
+ { "White", 0xFFFFFF },
+ { "WhiteSmoke", 0xF5F5F5 },
+ { "Yellow", 0xFFFF00 },
+ { "YellowGreen", 0x9ACD32 },
+
+ { NULL, 0 }
+};
+
static int HandleFontAttributes( xml_reader_t *p_xml_reader,
- font_stack_t **p_fonts )
+ font_stack_t **p_fonts, int i_scale )
{
int rv;
char *psz_fontname = NULL;
&i_font_color ))
{
psz_fontname = strdup( psz_fontname );
+ i_font_size = i_font_size * 1000 / i_scale;
}
i_font_alpha = (i_font_color >> 24) & 0xff;
i_font_color &= 0x00ffffff;
{
if( !strcasecmp( "face", psz_name ) )
{
- if( psz_fontname ) free( psz_fontname );
+ free( psz_fontname );
psz_fontname = strdup( psz_value );
}
else if( !strcasecmp( "size", psz_name ) )
else
i_font_size = atoi( psz_value );
}
- else if( !strcasecmp( "color", psz_name ) &&
- ( psz_value[0] == '#' ) )
+ else if( !strcasecmp( "color", psz_name ) )
{
- i_font_color = strtol( psz_value + 1, NULL, 16 );
- i_font_color &= 0x00ffffff;
+ if( psz_value[0] == '#' )
+ {
+ i_font_color = strtol( psz_value + 1, NULL, 16 );
+ i_font_color &= 0x00ffffff;
+ }
+ else
+ {
+ for( int i = 0; p_html_colors[i].psz_name != NULL; i++ )
+ {
+ if( !strncasecmp( psz_value, p_html_colors[i].psz_name, strlen(p_html_colors[i].psz_name) ) )
+ {
+ i_font_color = p_html_colors[i].i_value;
+ break;
+ }
+ }
+ }
}
else if( !strcasecmp( "alpha", psz_name ) &&
( psz_value[0] == '#' ) )
i_font_alpha = strtol( psz_value + 1, NULL, 16 );
i_font_alpha &= 0xff;
}
- free( psz_name );
- free( psz_value );
}
+ free( psz_name );
+ free( psz_value );
}
rv = PushFont( p_fonts,
psz_fontname,
- i_font_size,
- (i_font_color & 0xffffff) | ((i_font_alpha & 0xff) << 24));
+ i_font_size * i_scale / 1000,
+ (i_font_color & 0xffffff) | ((i_font_alpha & 0xff) << 24) );
free( psz_fontname );
uint32_t **ppi_run_lengths,
ATSUStyle **ppp_styles )
{
+ int rv = VLC_SUCCESS;
filter_sys_t *p_sys = p_filter->p_sys;
UniChar *psz_text_orig = psz_text;
font_stack_t *p_fonts = NULL;
- int rv = VLC_SUCCESS;
+ vlc_value_t val;
+ int i_scale = 1000;
char *psz_node = NULL;
- vlc_bool_t b_italic = VLC_FALSE;
- vlc_bool_t b_bold = VLC_FALSE;
- vlc_bool_t b_uline = VLC_FALSE;
+ bool b_italic = false;
+ bool b_bold = false;
+ bool b_uline = false;
+
+ if( VLC_SUCCESS == var_Get( p_filter, "scale", &val ))
+ i_scale = val.i_int;
if( p_font_style )
{
rv = PushFont( &p_fonts,
p_font_style->psz_fontname,
- p_font_style->i_font_size,
+ p_font_style->i_font_size * i_scale / 1000,
(p_font_style->i_font_color & 0xffffff) |
((p_font_style->i_font_alpha & 0xff) << 24) );
if( p_font_style->i_style_flags & STYLE_BOLD )
- b_bold = VLC_TRUE;
+ b_bold = true;
if( p_font_style->i_style_flags & STYLE_ITALIC )
- b_italic = VLC_TRUE;
+ b_italic = true;
if( p_font_style->i_style_flags & STYLE_UNDERLINE )
- b_uline = VLC_TRUE;
+ b_uline = true;
}
else
{
break;
case XML_READER_ENDELEM:
psz_node = xml_ReaderName( p_xml_reader );
-
if( psz_node )
{
if( !strcasecmp( "font", psz_node ) )
PopFont( &p_fonts );
else if( !strcasecmp( "b", psz_node ) )
- b_bold = VLC_FALSE;
+ b_bold = false;
else if( !strcasecmp( "i", psz_node ) )
- b_italic = VLC_FALSE;
+ b_italic = false;
else if( !strcasecmp( "u", psz_node ) )
- b_uline = VLC_FALSE;
+ b_uline = false;
free( psz_node );
}
if( psz_node )
{
if( !strcasecmp( "font", psz_node ) )
- rv = HandleFontAttributes( p_xml_reader, &p_fonts );
+ rv = HandleFontAttributes( p_xml_reader, &p_fonts, i_scale );
else if( !strcasecmp( "b", psz_node ) )
- b_bold = VLC_TRUE;
+ b_bold = true;
else if( !strcasecmp( "i", psz_node ) )
- b_italic = VLC_TRUE;
+ b_italic = true;
else if( !strcasecmp( "u", psz_node ) )
- b_uline = VLC_TRUE;
+ b_uline = true;
else if( !strcasecmp( "br", psz_node ) )
{
uint32_t i_string_length;
if( !p_region_in || !p_region_in->psz_html )
return VLC_EGENERIC;
+ /* Reset the default fontsize in case screen metrics have changed */
+ p_filter->p_sys->i_font_size = GetFontSize( p_filter );
+
p_sub = stream_MemoryNew( VLC_OBJECT(p_filter),
(uint8_t *) p_region_in->psz_html,
strlen( p_region_in->psz_html ),
- VLC_TRUE );
+ true );
if( p_sub )
{
p_xml = xml_Create( p_filter );
if( p_xml )
{
+ bool b_karaoke = false;
+
p_xml_reader = xml_ReaderCreate( p_xml, p_sub );
+ if( p_xml_reader )
+ {
+ /* Look for Root Node */
+ if( xml_ReaderRead( p_xml_reader ) == 1 )
+ {
+ char *psz_node = xml_ReaderName( p_xml_reader );
+
+ if( !strcasecmp( "karaoke", psz_node ) )
+ {
+ /* We're going to have to render the text a number
+ * of times to show the progress marker on the text.
+ */
+ var_SetBool( p_filter, "text-rerender", true );
+ b_karaoke = true;
+ }
+ else if( !strcasecmp( "text", psz_node ) )
+ {
+ b_karaoke = false;
+ }
+ else
+ {
+ /* Only text and karaoke tags are supported */
+ xml_ReaderDelete( p_xml, p_xml_reader );
+ p_xml_reader = NULL;
+ rv = VLC_EGENERIC;
+ }
+
+ free( psz_node );
+ }
+ }
+
if( p_xml_reader )
{
UniChar *psz_text;
uint32_t *pi_run_lengths = NULL;
ATSUStyle *pp_styles = NULL;
- psz_text = (UniChar *) calloc( strlen( p_region_in->psz_html ), sizeof( UniChar ) );
+ psz_text = (UniChar *) malloc( strlen( p_region_in->psz_html ) *
+ sizeof( UniChar ) );
if( psz_text )
{
uint32_t k;
- ProcessNodes( p_filter, p_xml_reader, p_region_in->p_style, psz_text,
- &i_len, &i_runs, &pi_run_lengths, &pp_styles );
+ rv = ProcessNodes( p_filter, p_xml_reader,
+ p_region_in->p_style, psz_text, &i_len,
+ &i_runs, &pi_run_lengths, &pp_styles );
p_region_out->i_x = p_region_in->i_x;
p_region_out->i_y = p_region_in->i_y;
- RenderYUVA( p_filter, p_region_out, psz_text, i_len, i_runs, pi_run_lengths, pp_styles);
+ if(( rv == VLC_SUCCESS ) && ( i_len > 0 ))
+ {
+ RenderYUVA( p_filter, p_region_out, psz_text, i_len, i_runs,
+ pi_run_lengths, pp_styles);
+ }
for( k=0; k<i_runs; k++)
ATSUDisposeStyle( pp_styles[k] );
free( pp_styles );
free( pi_run_lengths );
-
free( psz_text );
}
// you move down the page
y -= ascent;
- // Set the outlining for this line to be dependant on the size of the line -
+ // Set the outlining for this line to be dependent on the size of the line -
// make it about 5% of the ascent, with a minimum at 1.0
float f_thickness = FixedToFloat( ascent ) * 0.05;
CGContextSetLineWidth( p_context, (( f_thickness > 1.0 ) ? 1.0 : f_thickness ));
return p_offScreen;
}
+static int GetFontSize( filter_t *p_filter )
+{
+ return p_filter->fmt_out.video.i_height / __MAX(1, var_CreateGetInteger( p_filter, "quartztext-rel-fontsize" ));
+}
+
static int RenderYUVA( filter_t *p_filter, subpicture_region_t *p_region, UniChar *psz_utf16_str,
uint32_t i_text_len, uint32_t i_runs, uint32_t *pi_run_lengths, ATSUStyle *pp_styles )
{