From 92fe0c782d6ffc7a8e9389a6d11624bb24d3bbff Mon Sep 17 00:00:00 2001 From: Brian Matherly Date: Sun, 16 Oct 2011 21:57:07 -0500 Subject: [PATCH] Add "family" and "style" properties to pango producer. Deprecate "font" property. --- demo/mlt_voiceover | 4 +- demo/pango.mlt | 7 ++- src/modules/core/data_fx.properties | 27 +++++--- src/modules/feeds/NTSC/data_fx.properties | 3 +- src/modules/feeds/NTSC/etv.properties | 32 +++++----- src/modules/feeds/PAL/data_fx.properties | 3 +- src/modules/feeds/PAL/etv.properties | 32 +++++----- src/modules/gtk2/filter_dynamictext.c | 6 +- src/modules/gtk2/filter_dynamictext.yml | 22 +++++-- src/modules/gtk2/producer_pango.c | 77 +++++++++++++++-------- src/modules/gtk2/producer_pango.yml | 40 +++++++++++- src/tests/pango.c | 4 +- 12 files changed, 172 insertions(+), 85 deletions(-) diff --git a/demo/mlt_voiceover b/demo/mlt_voiceover index e523d2fa..54131df2 100644 --- a/demo/mlt_voiceover +++ b/demo/mlt_voiceover @@ -1,6 +1,8 @@ melt \ "+voice over demo.txt" \ - font="Sans Bold 72" \ + family="Sans" + size="72" + weight="700" fgcolour=0x00000000 \ bgcolour=0xff9933aa \ pad=10 \ diff --git a/demo/pango.mlt b/demo/pango.mlt index 41852fd9..d01ce20f 100644 --- a/demo/pango.mlt +++ b/demo/pango.mlt @@ -6,13 +6,14 @@ pango +.txt - GJ-TTAvantika 36 + GJ-TTAvantika + 36 1 0xffffddff 0x8c101080 8 - + diff --git a/src/modules/core/data_fx.properties b/src/modules/core/data_fx.properties index f7dc2e98..2a4c1bc4 100644 --- a/src/modules/core/data_fx.properties +++ b/src/modules/core/data_fx.properties @@ -76,7 +76,8 @@ tickertape=region .filter[1].resource=pango: .filter[1].producer.markup=Shotcut .filter[1].composite.geometry=100%,0%:300%x100%:100;-1=-300%,0%:300%x100%:100 -.filter[1].producer.font=San 32 +.filter[1].producer.family=San +.filter[1].producer.size=32 .filter[1].composite.titles=1 # @@ -98,7 +99,8 @@ location=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.markup= -.filter[1].producer.font=San 24 +.filter[1].producer.family=San +.filter[1].producer.size=24 .filter[1].composite.geometry=0%,0%:100%x100%:0;24=0%,0%:100%x100%:0;49=0%,0%:100%x100%:100 .filter[1].composite.titles=1 .filter[1].composite.halign=right @@ -119,7 +121,8 @@ courtesy=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.markup=ETV Exclusive -.filter[1].producer.font=San 24 +.filter[1].producer.family=San +.filter[1].producer.size=24 .filter[1].composite.geometry=0%,0%:100%x100%:0;37=0%,0%:100%x100%:0;61=0%,0%:100%x100%:100 .filter[1].composite.titles=1 .filter[1].composite.halign=right @@ -138,7 +141,8 @@ exclusive=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.markup=ETV Exclusive -.filter[1].producer.font=San 24 +.filter[1].producer.family=San +.filter[1].producer.size=24 .filter[1].composite.geometry=0%,0%:100%x100%:10;25=0%,0%:100%x100%:100 .filter[1].composite.titles=1 .filter[1].composite.halign=right @@ -157,7 +161,8 @@ file_shot=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.markup=File Shot -.filter[1].producer.font=San 18 +.filter[1].producer.family=San +.filter[1].producer.size=18 .filter[1].composite.geometry=0%,0%:100%x100%:15;25=0%,0%:100%x100%:100 .filter[1].composite.titles=0 .filter[1].composite.halign=centre @@ -176,7 +181,8 @@ special=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.markup=Special -.filter[1].producer.font=San 24 +.filter[1].producer.family=San +.filter[1].producer.size=24 .filter[1].composite.geometry=100%,0%:100%x100%:0;49=100%,0%:100%x100%:0;74=0%,0%:100%x100%:100 .filter[1].composite.titles=1 .filter[1].composite.halign=centre @@ -197,7 +203,8 @@ ticker=region .filter[1].producer.markup=Ticker - provided for reference .filter[1].composite.geometry=0%,0%:100%x100%:100 .filter[1].composite.titles=0 -.filter[1].producer.font=San 24 +.filter[1].producer.family=San +.filter[1].producer.size=24 .filter[1].composite.halign=centre .filter[1].composite.titles=1 .filter[1].composite.valign=centre @@ -221,7 +228,8 @@ super=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.markup= -.filter[1].producer.font=San 32 +.filter[1].producer.family=San +.filter[1].producer.size=32 .filter[1].producer.fgcolour=0x6c0101ff .filter[1].composite.geometry=0%,0%:100%x100%:10;25=0%,0%:100%x100%:100 .filter[1].composite.titles=1 @@ -230,7 +238,8 @@ super=region .filter[2]=watermark .filter[2].resource=pango: .filter[2].producer.markup= -.filter[2].producer.font=San 32 +.filter[1].producer.family=San +.filter[1].producer.size=32 .filter[2].producer.fgcolour=0x6c0101ff .filter[2].composite.geometry=0%,0%:100%x100%:10;25=0%,0%:100%x100%:100 .filter[2].composite.titles=1 diff --git a/src/modules/feeds/NTSC/data_fx.properties b/src/modules/feeds/NTSC/data_fx.properties index 8e6a9496..fced7929 100644 --- a/src/modules/feeds/NTSC/data_fx.properties +++ b/src/modules/feeds/NTSC/data_fx.properties @@ -76,6 +76,7 @@ tickertape=region .filter[1].resource=pango: .filter[1].producer.markup=Shotcut .filter[1].composite.geometry=100%/0%:300%x100%:100;-1=-300%/0%:300%x100%:100 -.filter[1].producer.font=San 32 +.filter[1].producer.family=San +.filter[1].producer.size=32 .filter[1].composite.titles=1 diff --git a/src/modules/feeds/NTSC/etv.properties b/src/modules/feeds/NTSC/etv.properties index 59685496..421a4850 100644 --- a/src/modules/feeds/NTSC/etv.properties +++ b/src/modules/feeds/NTSC/etv.properties @@ -16,7 +16,7 @@ location=region .description=Titles .properties.markup=filter[1].producer.text -.properties.font=filter[1].producer.font +.properties.family=filter[1].producer.family .properties.size=filter[1].producer.size .period=2 .properties.length[0]=composite.out @@ -29,7 +29,7 @@ location=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text= -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=24 .filter[1].composite.geometry=0/0:95%x100% .filter[1].composite.titles=1 @@ -39,7 +39,7 @@ location=region courtesy=region .description=Courtesy .properties.markup=filter[1].producer.text -.properties.font=filter[1].producer.font +.properties.family=filter[1].producer.family .properties.size=filter[1].producer.size .period=2 .properties.length[0]=composite.out @@ -52,7 +52,7 @@ courtesy=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text= -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=24 .filter[1].composite.geometry=0/0:95%x100% .filter[1].composite.titles=1 @@ -62,7 +62,7 @@ courtesy=region exclusive=region .description=Exclusive .properties.markup=filter[1].producer.text -.properties.font=filter[1].producer.font +.properties.family=filter[1].producer.family .properties.size=filter[1].producer.size .period=2 .properties.length[0]=composite.out @@ -73,7 +73,7 @@ exclusive=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text=ETV Exclusive -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=24 .filter[1].producer.weight=700 .filter[1].composite.geometry=0/0:95%x100% @@ -84,7 +84,7 @@ exclusive=region file_shot=region .description=Titles .period=2 -.properties.font=filter[1].producer.font +.properties.family=filter[1].producer.family .properties.size=filter[1].producer.size .properties.length[0]=composite.out .composite.geometry=82%/28%:11%x4%:0;15=/:x:100 @@ -94,7 +94,7 @@ file_shot=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text=File Shot -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=18 .filter[1].producer.weight=700 .filter[1].composite.titles=1 @@ -104,7 +104,7 @@ file_shot=region special=region .description=Special .period=2 -.properties.font=filter[1].producer.font +.properties.family=filter[1].producer.family .properties.size=filter[1].producer.size .properties.length[0]=filter[0].composite.out .properties.length[1]=filter[1].composite.out @@ -116,7 +116,7 @@ special=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text=Special -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=24 .filter[1].producer.weight=700 .filter[1].composite.geometry=100%/0%:100%x100%:0;15=0%/0%:x:100 @@ -127,7 +127,7 @@ special=region ticker=region .description=Tickertape .properties.markup=filter[1].producer.text -.properties.font=filter[1].producer.font +.properties.family=filter[1].producer.family .properties.size=filter[1].producer.size .properties.length[0]=filter[1].composite.out .composite.geometry=0/87%:101%x13% @@ -137,7 +137,7 @@ ticker=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text=Ticker - provided for reference -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=24 .filter[1].producer.weight=700 .filter[1].composite.titles=1 @@ -150,9 +150,9 @@ super=region .properties.1=filter[2].producer.text .properties.align=filter[1].composite.valign .properties.weight=filter[1].producer.weight -.properties.f0=filter[1].producer.font +.properties.f0=filter[1].producer.family .properties.s0=filter[1].producer.size -.properties.f1=filter[2].producer.font +.properties.f1=filter[2].producer.family .properties.s1=filter[2].producer.size .properties.length[0]=composite.out .period=2 @@ -167,7 +167,7 @@ super=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text= -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=32 .filter[1].producer.weight=700 .filter[1].producer.fgcolour=0x6c0101ff @@ -177,7 +177,7 @@ super=region .filter[2]=watermark .filter[2].resource=pango: .filter[2].producer.text= -.filter[2].producer.font=Sans +.filter[2].producer.family=Sans .filter[2].producer.size=32 .filter[2].producer.fgcolour=0x6c0101ff .filter[2].composite.titles=1 diff --git a/src/modules/feeds/PAL/data_fx.properties b/src/modules/feeds/PAL/data_fx.properties index 97e87da5..94a5cf20 100644 --- a/src/modules/feeds/PAL/data_fx.properties +++ b/src/modules/feeds/PAL/data_fx.properties @@ -74,6 +74,7 @@ tickertape=region .filter[1].resource=pango: .filter[1].producer.markup=Shotcut .filter[1].composite.geometry=100%/0%:300%x100%:100;-1=-300%/0%:300%x100%:100 -.filter[1].producer.font=San 32 +.filter[1].producer.family=San +.filter[1].producer.size=32 .filter[1].composite.titles=1 diff --git a/src/modules/feeds/PAL/etv.properties b/src/modules/feeds/PAL/etv.properties index c8a00f3e..e45f2823 100644 --- a/src/modules/feeds/PAL/etv.properties +++ b/src/modules/feeds/PAL/etv.properties @@ -16,7 +16,7 @@ location=region .description=Titles .properties.markup=filter[1].producer.text -.properties.font=filter[1].producer.font +.properties.family=filter[1].producer.family .properties.size=filter[1].producer.size .period=2 .properties.length[0]=composite.out @@ -29,7 +29,7 @@ location=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text= -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=24 .filter[1].composite.geometry=0/0:95%x100% .filter[1].composite.titles=1 @@ -39,7 +39,7 @@ location=region courtesy=region .description=Courtesy .properties.markup=filter[1].producer.text -.properties.font=filter[1].producer.font +.properties.family=filter[1].producer.family .properties.size=filter[1].producer.size .period=2 .properties.length[0]=composite.out @@ -52,7 +52,7 @@ courtesy=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text= -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=24 .filter[1].composite.geometry=0/0:95%x100% .filter[1].composite.titles=1 @@ -62,7 +62,7 @@ courtesy=region exclusive=region .description=Exclusive .properties.markup=filter[1].producer.text -.properties.font=filter[1].producer.font +.properties.family=filter[1].producer.family .properties.size=filter[1].producer.size .period=2 .properties.length[0]=composite.out @@ -73,7 +73,7 @@ exclusive=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text=ETV Exclusive -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=24 .filter[1].producer.weight=700 .filter[1].composite.geometry=0/0:95%x100% @@ -84,7 +84,7 @@ exclusive=region file_shot=region .description=Titles .period=2 -.properties.font=filter[1].producer.font +.properties.family=filter[1].producer.family .properties.size=filter[1].producer.size .properties.length[0]=composite.out .composite.geometry=82%/28%:11%x4%:0;12=/:x:100 @@ -94,7 +94,7 @@ file_shot=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text=File Shot -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=18 .filter[1].producer.weight=700 .filter[1].composite.titles=1 @@ -104,7 +104,7 @@ file_shot=region special=region .description=Special .period=2 -.properties.font=filter[1].producer.font +.properties.family=filter[1].producer.family .properties.size=filter[1].producer.size .properties.length[0]=filter[0].composite.out .properties.length[1]=filter[1].composite.out @@ -116,7 +116,7 @@ special=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text=Special -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=24 .filter[1].producer.weight=700 .filter[1].composite.geometry=100%/0%:100%x100%:0;12=0%/0%:x:100 @@ -127,7 +127,7 @@ special=region ticker=region .description=Tickertape .properties.markup=filter[1].producer.text -.properties.font=filter[1].producer.font +.properties.family=filter[1].producer.family .properties.size=filter[1].producer.size .properties.length[0]=filter[1].composite.out .composite.geometry=0/87%:101%x13% @@ -137,7 +137,7 @@ ticker=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text=Ticker - provided for reference -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=24 .filter[1].producer.weight=700 .filter[1].composite.titles=1 @@ -150,9 +150,9 @@ super=region .properties.1=filter[2].producer.text .properties.align=filter[1].composite.valign .properties.weight=filter[1].producer.weight -.properties.f0=filter[1].producer.font +.properties.f0=filter[1].producer.family .properties.s0=filter[1].producer.size -.properties.f1=filter[2].producer.font +.properties.f1=filter[2].producer.family .properties.s1=filter[2].producer.size .properties.length[0]=composite.out .period=2 @@ -167,7 +167,7 @@ super=region .filter[1]=watermark .filter[1].resource=pango: .filter[1].producer.text= -.filter[1].producer.font=Sans +.filter[1].producer.family=Sans .filter[1].producer.size=32 .filter[1].producer.weight=700 .filter[1].producer.fgcolour=0x6c0101ff @@ -177,7 +177,7 @@ super=region .filter[2]=watermark .filter[2].resource=pango: .filter[2].producer.text= -.filter[2].producer.font=Sans +.filter[2].producer.family=Sans .filter[2].producer.size=32 .filter[2].producer.fgcolour=0x6c0101ff .filter[2].composite.titles=1 diff --git a/src/modules/gtk2/filter_dynamictext.c b/src/modules/gtk2/filter_dynamictext.c index 19904aa3..d3d3e66a 100644 --- a/src/modules/gtk2/filter_dynamictext.c +++ b/src/modules/gtk2/filter_dynamictext.c @@ -199,7 +199,8 @@ static void apply_filter(mlt_filter filter, mlt_frame frame ) mlt_properties_set( watermark_properties, "composite.valign", mlt_properties_get( my_properties, "valign" ) ); // Pass the properties to the watermark filter pango producer - mlt_properties_set( watermark_properties, "producer.font", mlt_properties_get( my_properties, "font" ) ); + mlt_properties_set( watermark_properties, "producer.family", mlt_properties_get( my_properties, "family" ) ); + mlt_properties_set( watermark_properties, "producer.size", mlt_properties_get( my_properties, "size" ) ); mlt_properties_set( watermark_properties, "producer.weight", mlt_properties_get( my_properties, "weight" ) ); mlt_properties_set( watermark_properties, "producer.fgcolour", mlt_properties_get( my_properties, "fgcolour" ) ); mlt_properties_set( watermark_properties, "producer.bgcolour", mlt_properties_get( my_properties, "bgcolour" ) ); @@ -266,7 +267,8 @@ mlt_filter filter_dynamictext_init( mlt_profile profile, mlt_service_type type, // Assign default values mlt_properties_set( properties, "argument", arg ? arg: "#timecode#" ); mlt_properties_set( properties, "geometry", "0%/0%:100%x100%:100" ); - mlt_properties_set( properties, "font", "Sans 48" ); + mlt_properties_set( properties, "family", "Sans" ); + mlt_properties_set( properties, "size", "48" ); mlt_properties_set( properties, "weight", "400" ); mlt_properties_set( properties, "fgcolour", "0x000000ff" ); mlt_properties_set( properties, "bgcolour", "0x00000020" ); diff --git a/src/modules/gtk2/filter_dynamictext.yml b/src/modules/gtk2/filter_dynamictext.yml index 32834b39..5ee7d4b8 100644 --- a/src/modules/gtk2/filter_dynamictext.yml +++ b/src/modules/gtk2/filter_dynamictext.yml @@ -36,20 +36,30 @@ parameters: type: geometry description: A set of X/Y coordinates by which to adjust the text. default: 0%/0%:100%x100%:100 - - identifier: font - title: Font + - identifier: family + title: Font family type: string - description: The typeface to use - default: Sans 48 + description: > + The typeface of the font. + default: Sans readonly: no mutable: yes - widget: font + widget: combo + - identifier: size + title: Font size + type: integer + description: > + The size in pixels of the font. + default: 48 + readonly: no + mutable: yes + widget: spinner - identifier: weight title: Font weight type: integer description: The weight of the font. minimum: 100 - maximum: 900 + maximum: 1000 default: 400 readonly: no mutable: yes diff --git a/src/modules/gtk2/producer_pango.c b/src/modules/gtk2/producer_pango.c index b7c0a2f0..d32827f0 100644 --- a/src/modules/gtk2/producer_pango.c +++ b/src/modules/gtk2/producer_pango.c @@ -56,6 +56,9 @@ struct producer_pango_s char *markup; char *text; char *font; + char *family; + int size; + int style; int weight; }; @@ -70,7 +73,7 @@ static int producer_get_frame( mlt_producer parent, mlt_frame_ptr frame, int ind static void producer_close( mlt_producer parent ); static void pango_draw_background( GdkPixbuf *pixbuf, rgba_color bg ); static GdkPixbuf *pango_get_pixbuf( const char *markup, const char *text, const char *font, - rgba_color fg, rgba_color bg, rgba_color ol, int pad, int align, int weight, int size, int outline ); + rgba_color fg, rgba_color bg, rgba_color ol, int pad, int align, char* family, int style, int weight, int size, int outline ); static void fill_pixbuf( GdkPixbuf* pixbuf, FT_Bitmap* bitmap, int w, int h, int pad, int align, rgba_color fg, rgba_color bg ); static void fill_pixbuf_with_outline( GdkPixbuf* pixbuf, FT_Bitmap* bitmap, int w, int h, int pad, int align, rgba_color fg, rgba_color bg, rgba_color ol, int outline ); @@ -90,7 +93,7 @@ int strncaseeq(const char *s1, const char *s2, size_t n) /** Parse the alignment property. */ -static int alignment_parse( char* align ) +static int parse_alignment( char* align ) { int ret = pango_align_left; @@ -105,6 +108,17 @@ static int alignment_parse( char* align ) return ret; } +/** Parse the style property. +*/ + +static int parse_style( char* style ) +{ + int ret = PANGO_STYLE_NORMAL; + if( !strncmp(style, "italic", 6) ) + ret = PANGO_STYLE_ITALIC; + return ret; +} + static PangoFT2FontMap *fontmap = NULL; mlt_producer producer_pango_init( const char *filename ) @@ -134,7 +148,10 @@ mlt_producer producer_pango_init( const char *filename ) mlt_properties_set_int( properties, "pad", 0 ); mlt_properties_set_int( properties, "outline", 0 ); mlt_properties_set( properties, "text", "" ); - mlt_properties_set( properties, "font", "Sans 48" ); + mlt_properties_set( properties, "font", NULL ); + mlt_properties_set( properties, "family", "Sans" ); + mlt_properties_set_int( properties, "size", 48 ); + mlt_properties_set( properties, "style", "normal" ); mlt_properties_set( properties, "encoding", "UTF-8" ); mlt_properties_set_int( properties, "weight", PANGO_WEIGHT_NORMAL ); @@ -331,12 +348,14 @@ static void refresh_image( mlt_frame frame, int width, int height ) char *fg = mlt_properties_get( producer_props, "fgcolour" ); char *bg = mlt_properties_get( producer_props, "bgcolour" ); char *ol = mlt_properties_get( producer_props, "olcolour" ); - int align = alignment_parse( mlt_properties_get( producer_props, "align" ) ); + int align = parse_alignment( mlt_properties_get( producer_props, "align" ) ); int pad = mlt_properties_get_int( producer_props, "pad" ); int outline = mlt_properties_get_int( producer_props, "outline" ); char *markup = mlt_properties_get( producer_props, "markup" ); char *text = mlt_properties_get( producer_props, "text" ); char *font = mlt_properties_get( producer_props, "font" ); + char *family = mlt_properties_get( producer_props, "family" ); + int style = parse_style( mlt_properties_get( producer_props, "style" ) ); char *encoding = mlt_properties_get( producer_props, "encoding" ); int weight = mlt_properties_get_int( producer_props, "weight" ); int size = mlt_properties_get_int( producer_props, "size" ); @@ -361,13 +380,16 @@ static void refresh_image( mlt_frame frame, int width, int height ) property_changed = ( align != this->align ); property_changed = property_changed || ( this->fgcolor == NULL || ( fg && strcmp( fg, this->fgcolor ) ) ); property_changed = property_changed || ( this->bgcolor == NULL || ( bg && strcmp( bg, this->bgcolor ) ) ); - property_changed = property_changed || ( this->olcolor == NULL || ( ol && strcmp( bg, this->olcolor ) ) ); + property_changed = property_changed || ( this->olcolor == NULL || ( ol && strcmp( ol, this->olcolor ) ) ); property_changed = property_changed || ( pad != this->pad ); property_changed = property_changed || ( outline != this->outline ); property_changed = property_changed || ( markup && this->markup && strcmp( markup, this->markup ) ); property_changed = property_changed || ( text && this->text && strcmp( text, this->text ) ); property_changed = property_changed || ( font && this->font && strcmp( font, this->font ) ); + property_changed = property_changed || ( family && this->family && strcmp( family, this->family ) ); property_changed = property_changed || ( weight != this->weight ); + property_changed = property_changed || ( style != this->style ); + property_changed = property_changed || ( size != this->size ); // Save the properties for next comparison this->align = align; @@ -378,8 +400,11 @@ static void refresh_image( mlt_frame frame, int width, int height ) set_string( &this->olcolor, ol, "0x00000000" ); set_string( &this->markup, markup, NULL ); set_string( &this->text, text, NULL ); - set_string( &this->font, font, "Sans 48" ); + set_string( &this->font, font, NULL ); + set_string( &this->family, family, "Sans" ); this->weight = weight; + this->style = style; + this->size = size; } if ( pixbuf == NULL && property_changed ) @@ -408,7 +433,7 @@ static void refresh_image( mlt_frame frame, int width, int height ) } // Render the title - pixbuf = pango_get_pixbuf( markup, text, font, fgcolor, bgcolor, olcolor, pad, align, weight, size, outline ); + pixbuf = pango_get_pixbuf( markup, text, font, fgcolor, bgcolor, olcolor, pad, align, family, style, weight, size, outline ); if ( pixbuf != NULL ) { @@ -554,6 +579,7 @@ static void producer_close( mlt_producer parent ) free( this->markup ); free( this->text ); free( this->font ); + free( this->family ); parent->close = NULL; mlt_producer_close( parent ); free( this ); @@ -578,22 +604,32 @@ static void pango_draw_background( GdkPixbuf *pixbuf, rgba_color bg ) } } -static GdkPixbuf *pango_get_pixbuf( const char *markup, const char *text, const char *font, rgba_color fg, rgba_color bg, rgba_color ol, int pad, int align, int weight, int size, int outline ) +static GdkPixbuf *pango_get_pixbuf( const char *markup, const char *text, const char *font, rgba_color fg, rgba_color bg, rgba_color ol, int pad, int align, char* family, int style, int weight, int size, int outline ) { PangoContext *context = pango_ft2_font_map_create_context( fontmap ); PangoLayout *layout = pango_layout_new( context ); int w, h; GdkPixbuf *pixbuf = NULL; FT_Bitmap bitmap; - PangoFontDescription *desc = pango_font_description_from_string( font ); + PangoFontDescription *desc = NULL; + + if( font ) + { + // Support for deprecated "font" property. + desc = pango_font_description_from_string( font ); + pango_ft2_font_map_set_resolution( fontmap, 72, 72 ); + } + else + { + desc = pango_font_description_from_string( family ); + pango_font_description_set_size( desc, PANGO_SCALE * size ); + pango_font_description_set_style( desc, (PangoStyle) style ); + } - pango_ft2_font_map_set_resolution( fontmap, 72, 72 ); - pango_layout_set_width( layout, -1 ); // set wrapping constraints pango_font_description_set_weight( desc, ( PangoWeight ) weight ); - if ( size != 0 ) - pango_font_description_set_absolute_size( desc, PANGO_SCALE * size ); + + pango_layout_set_width( layout, -1 ); // set wrapping constraints pango_layout_set_font_description( layout, desc ); -// pango_layout_set_spacing( layout, space ); pango_layout_set_alignment( layout, ( PangoAlignment ) align ); if ( markup != NULL && strcmp( markup, "" ) != 0 ) { @@ -615,19 +651,6 @@ static GdkPixbuf *pango_get_pixbuf( const char *markup, const char *text, const } pango_layout_get_pixel_size( layout, &w, &h ); - // Interpret size property as an absolute pixel height and compensate for - // freetype's "interpretation" of our absolute size request. This gives - // precise control over compositing and better quality by reducing scaling - // artifacts with composite geometries that constrain the dimensions. - // If you do not want this, then put the size in the font property or in - // the pango markup. - if ( size != 0 ) - { - pango_font_description_set_absolute_size( desc, PANGO_SCALE * size * size/h ); - pango_layout_set_font_description( layout, desc ); - pango_layout_get_pixel_size( layout, &w, &h ); - } - if ( pad == 0 ) pad = 1; diff --git a/src/modules/gtk2/producer_pango.yml b/src/modules/gtk2/producer_pango.yml index 6de6a04a..3358adb1 100644 --- a/src/modules/gtk2/producer_pango.yml +++ b/src/modules/gtk2/producer_pango.yml @@ -2,7 +2,7 @@ schema_version: 0.1 type: producer identifier: pango title: Pango -version: 1 +version: 2 copyright: Ushodaya Enterprises Limited creator: Dan Dennedy license: LGPLv2.1 @@ -126,12 +126,46 @@ parameters: widget: textbox - identifier: font + deprecated: yes title: Font type: string description: > The default typeface to use when not using markup. FreeType2 renders at 72 dpi. - default: Sans 48 + This property is deprecated. Use family, size and style instead. + readonly: no + mutable: yes + widget: combo + + - identifier: family + title: Font family + type: string + description: > + The default typeface to use when not using markup. + default: Sans + readonly: no + mutable: yes + widget: combo + + - identifier: size + title: Font size + type: integer + description: > + The size in pixels of the font to use when not using markup. + default: 48 + readonly: no + mutable: yes + widget: spinner + + - identifier: style + title: Font style + type: string + description: > + The style of the font to use when not using markup. + values: + - normal + - italic + default: normal readonly: no mutable: yes widget: combo @@ -140,6 +174,8 @@ parameters: title: Font weight type: integer description: The weight of the font. + minimum: 100 + maximum: 1000 default: 400 readonly: no mutable: yes diff --git a/src/tests/pango.c b/src/tests/pango.c index fb5e19a0..7eca2c62 100644 --- a/src/tests/pango.c +++ b/src/tests/pango.c @@ -33,7 +33,9 @@ int main( int argc, char **argv ) mlt_playlist pl2 = mlt_playlist_init(); mlt_producer title = mlt_factory_producer( "pango", NULL ); //"Mutton Lettuce Tomato" ); mlt_playlist_append( pl2, title ); - mlt_properties_set( mlt_producer_properties( title ), "font", "Sans Bold 36" ); + mlt_properties_set( mlt_producer_properties( title ), "family", "Sans" ); + mlt_properties_set( mlt_producer_properties( title ), "size", "36" ); + mlt_properties_set( mlt_producer_properties( title ), "weight", "700" ); mlt_properties_set( mlt_producer_properties( title ), "text", text ); mlt_properties_set_int( mlt_producer_properties( title ), "bgcolor", 0x0000007f ); mlt_properties_set_int( mlt_producer_properties( title ), "pad", 8 ); -- 2.39.2