0015-libvlc-expose-a-base-set-of-freetype-options-to-over.patch 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. From 4782cb6028f64999615ec26a5a4a194b9de7bb5b Mon Sep 17 00:00:00 2001
  2. From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= <fkuehne@videolan.org>
  3. Date: Mon, 23 Nov 2015 16:09:24 +0100
  4. Subject: [PATCH 15/19] libvlc: expose a base set of freetype options to
  5. overwrite the default font
  6. ---
  7. include/vlc/libvlc_media_player.h | 26 ++++++++++++
  8. lib/libvlc.sym | 6 +++
  9. lib/media_player.c | 6 +++
  10. lib/video.c | 67 ++++++++++++++++++++++++++++++-
  11. modules/text_renderer/freetype/freetype.c | 58 ++++++++++++++++++++++++--
  12. modules/text_renderer/freetype/freetype.h | 2 +
  13. 6 files changed, 161 insertions(+), 4 deletions(-)
  14. diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h
  15. index 6614340..ef5c54c 100644
  16. --- a/include/vlc/libvlc_media_player.h
  17. +++ b/include/vlc/libvlc_media_player.h
  18. @@ -1515,6 +1515,32 @@ LIBVLC_API float libvlc_video_get_adjust_float( libvlc_media_player_t *p_mi,
  19. LIBVLC_API void libvlc_video_set_adjust_float( libvlc_media_player_t *p_mi,
  20. unsigned option, float value );
  21. +enum libvlc_video_textrenderer_option_t {
  22. + libvlc_textrender_font = 0,
  23. + libvlc_textrender_fontsize,
  24. + libvlc_textrender_fontcolor,
  25. + libvlc_textrender_fontforcebold,
  26. +};
  27. +
  28. +LIBVLC_API bool libvlc_video_get_textrenderer_bool( libvlc_media_player_t *p_mi,
  29. + unsigned option );
  30. +
  31. +LIBVLC_API void libvlc_video_set_textrenderer_bool( libvlc_media_player_t *p_mi,
  32. + unsigned option, bool value );
  33. +
  34. +LIBVLC_API int libvlc_video_get_textrenderer_int( libvlc_media_player_t *p_mi,
  35. + unsigned option );
  36. +
  37. +LIBVLC_API void libvlc_video_set_textrenderer_int( libvlc_media_player_t *p_mi,
  38. + unsigned option, int value );
  39. +
  40. +LIBVLC_API char *libvlc_video_get_textrenderer_string( libvlc_media_player_t *p_mi,
  41. + unsigned option );
  42. +
  43. +LIBVLC_API void libvlc_video_set_textrenderer_string( libvlc_media_player_t *p_mi,
  44. + unsigned option,
  45. + const char *psz_text );
  46. +
  47. /** @} video */
  48. /** \defgroup libvlc_audio LibVLC audio controls
  49. diff --git a/lib/libvlc.sym b/lib/libvlc.sym
  50. index 49207db..88d2478 100644
  51. --- a/lib/libvlc.sym
  52. +++ b/lib/libvlc.sym
  53. @@ -229,6 +229,9 @@ libvlc_video_get_spu_count
  54. libvlc_video_get_spu_delay
  55. libvlc_video_get_spu_description
  56. libvlc_video_get_teletext
  57. +libvlc_video_get_textrenderer_bool
  58. +libvlc_video_get_text_renderer_int
  59. +libvlc_video_get_text_renderer_string
  60. libvlc_video_get_title_description
  61. libvlc_video_get_track
  62. libvlc_video_get_track_count
  63. @@ -253,6 +256,9 @@ libvlc_video_set_spu
  64. libvlc_video_set_spu_delay
  65. libvlc_video_set_subtitle_file
  66. libvlc_video_set_teletext
  67. +libvlc_video_set_textrenderer_bool
  68. +libvlc_video_set_text_renderer_int
  69. +libvlc_video_set_text_renderer_string
  70. libvlc_video_set_track
  71. libvlc_video_take_snapshot
  72. libvlc_vlm_add_broadcast
  73. diff --git a/lib/media_player.c b/lib/media_player.c
  74. index 3ff4b8a..dca0ffc 100644
  75. --- a/lib/media_player.c
  76. +++ b/lib/media_player.c
  77. @@ -640,6 +640,12 @@ libvlc_media_player_new( libvlc_instance_t *instance )
  78. var_Create (mp, "saturation", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT);
  79. var_Create (mp, "gamma", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT);
  80. + /* SPU */
  81. + var_Create (mp, "freetype-font", VLC_VAR_STRING | VLC_VAR_DOINHERIT);
  82. + var_Create (mp, "freetype-rel-fontsize", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT);
  83. + var_Create (mp, "freetype-color", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT);
  84. + var_Create (mp, "freetype-bold", VLC_VAR_BOOL | VLC_VAR_DOINHERIT);
  85. +
  86. /* Audio */
  87. var_Create (mp, "aout", VLC_VAR_STRING | VLC_VAR_DOINHERIT);
  88. var_Create (mp, "audio-device", VLC_VAR_STRING);
  89. diff --git a/lib/video.c b/lib/video.c
  90. index 167f76a..5a2b1ac 100644
  91. --- a/lib/video.c
  92. +++ b/lib/video.c
  93. @@ -639,7 +639,6 @@ typedef const struct {
  94. unsigned type;
  95. } opt_t;
  96. -
  97. static void
  98. set_int( libvlc_media_player_t *p_mi, const char *restrict name,
  99. const opt_t *restrict opt, int value )
  100. @@ -665,6 +664,9 @@ set_int( libvlc_media_player_t *p_mi, const char *restrict name,
  101. case VLC_VAR_FLOAT:
  102. var_SetFloat( p_mi, opt->name, value );
  103. break;
  104. + case VLC_VAR_BOOL:
  105. + var_SetBool( p_mi, opt->name, value );
  106. + break;
  107. default:
  108. libvlc_printerr( "Invalid argument to %s in %s", name, "set int" );
  109. return;
  110. @@ -698,6 +700,8 @@ get_int( libvlc_media_player_t *p_mi, const char *restrict name,
  111. return var_GetInteger(p_mi, opt->name);
  112. case VLC_VAR_FLOAT:
  113. return lroundf(var_GetFloat(p_mi, opt->name));
  114. + case VLC_VAR_BOOL:
  115. + return var_GetBool(p_mi, opt->name);
  116. default:
  117. libvlc_printerr( "Invalid argument to %s in %s", name, "get int" );
  118. return 0;
  119. @@ -945,3 +949,64 @@ float libvlc_video_get_adjust_float( libvlc_media_player_t *p_mi,
  120. {
  121. return get_float( p_mi, "adjust", adjust_option_bynumber(option) );
  122. }
  123. +
  124. +static const opt_t *
  125. +textrenderer_option_bynumber( unsigned option )
  126. +{
  127. + static const opt_t optlist[] =
  128. + {
  129. + { "freetype-font", VLC_VAR_STRING },
  130. + { "freetype-rel-fontsize", VLC_VAR_INTEGER },
  131. + { "freetype-color", VLC_VAR_INTEGER },
  132. + { "freetype-bold", VLC_VAR_BOOL },
  133. + };
  134. + enum { num_opts = sizeof(optlist) / sizeof(*optlist) };
  135. +
  136. + const opt_t *r = option < num_opts ? optlist+option : NULL;
  137. + if( !r )
  138. + libvlc_printerr( "Unknown freetype option" );
  139. + return r;
  140. +}
  141. +
  142. +/* basic text renderer support */
  143. +
  144. +void libvlc_video_set_textrenderer_bool( libvlc_media_player_t *p_mi,
  145. + unsigned option, bool value )
  146. +{
  147. + set_int( p_mi, "freetype", textrenderer_option_bynumber(option), value );
  148. +}
  149. +
  150. +
  151. +bool libvlc_video_get_textrenderer_bool( libvlc_media_player_t *p_mi,
  152. + unsigned option )
  153. +{
  154. + return get_int( p_mi, "freetype", textrenderer_option_bynumber(option) );
  155. +}
  156. +
  157. +
  158. +void libvlc_video_set_textrenderer_int( libvlc_media_player_t *p_mi,
  159. + unsigned option, int value )
  160. +{
  161. + set_int( p_mi, "freetype", textrenderer_option_bynumber(option), value );
  162. +}
  163. +
  164. +
  165. +int libvlc_video_get_textrenderer_int( libvlc_media_player_t *p_mi,
  166. + unsigned option )
  167. +{
  168. + return get_int( p_mi, "freetype", textrenderer_option_bynumber(option) );
  169. +}
  170. +
  171. +
  172. +void libvlc_video_set_textrenderer_string( libvlc_media_player_t *p_mi,
  173. + unsigned option, const char *psz_value )
  174. +{
  175. + set_string( p_mi, "freetype", textrenderer_option_bynumber(option), psz_value );
  176. +}
  177. +
  178. +
  179. +char * libvlc_video_get_textrenderer_string( libvlc_media_player_t *p_mi,
  180. + unsigned option )
  181. +{
  182. + return get_string( p_mi, "freetype", textrenderer_option_bynumber(option) );
  183. +}
  184. diff --git a/modules/text_renderer/freetype/freetype.c b/modules/text_renderer/freetype/freetype.c
  185. index 3409460..f4f2f00 100644
  186. --- a/modules/text_renderer/freetype/freetype.c
  187. +++ b/modules/text_renderer/freetype/freetype.c
  188. @@ -77,6 +77,9 @@
  189. *****************************************************************************/
  190. static int Create ( vlc_object_t * );
  191. static void Destroy( vlc_object_t * );
  192. +static int DefaultFontStyleCallback( vlc_object_t *p_this, char const *psz_var,
  193. + vlc_value_t oldval, vlc_value_t newval,
  194. + void *p_data );
  195. #define FONT_TEXT N_("Font")
  196. #define MONOSPACE_FONT_TEXT N_("Monospace Font")
  197. @@ -929,12 +932,14 @@ static void FillDefaultStyles( filter_t *p_filter )
  198. {
  199. filter_sys_t *p_sys = p_filter->p_sys;
  200. - p_sys->p_default_style->psz_fontname = var_InheritString( p_filter, "freetype-font" );
  201. + p_sys->p_default_style->psz_fontname = var_CreateGetString( p_filter, "freetype-font" );
  202. p_sys->p_default_style->psz_monofontname = var_InheritString( p_filter, "freetype-monofont" );
  203. p_sys->p_default_style->i_font_alpha = var_InheritInteger( p_filter,"freetype-opacity" );
  204. p_sys->p_default_style->i_font_alpha = VLC_CLIP( p_sys->p_default_style->i_font_alpha, 0, 255 );
  205. + p_sys->p_default_style->i_font_color = VLC_CLIP(var_CreateGetIntegerCommand( p_filter, "freetype-color") , 0, 0xFFFFFF);
  206. +
  207. p_sys->p_default_style->i_outline_alpha = var_InheritInteger( p_filter, "freetype-outline-opacity" );
  208. p_sys->p_default_style->i_outline_alpha = VLC_CLIP( p_sys->p_default_style->i_outline_alpha, 0, 255 );
  209. p_sys->p_default_style->i_outline_color = var_InheritInteger( p_filter, "freetype-outline-color" );
  210. @@ -950,11 +955,11 @@ static void FillDefaultStyles( filter_t *p_filter )
  211. p_sys->p_default_style->i_features |= STYLE_HAS_FLAGS;
  212. p_sys->p_forced_style->i_font_size = var_InheritInteger( p_filter, "freetype-fontsize" );
  213. - p_sys->p_forced_style->f_font_relsize = var_InheritInteger( p_filter, "freetype-rel-fontsize" );
  214. + p_sys->p_forced_style->f_font_relsize = var_CreateGetIntegerCommand( p_filter, "freetype-rel-fontsize" );
  215. if( p_sys->p_forced_style->f_font_relsize )
  216. p_sys->p_forced_style->f_font_relsize = 1.0 / p_sys->p_forced_style->f_font_relsize;
  217. - if( var_InheritBool( p_filter, "freetype-bold" ) )
  218. + if( var_CreateGetBoolCommand( p_filter, "freetype-bold" ) )
  219. {
  220. p_sys->p_forced_style->i_style_flags |= STYLE_BOLD;
  221. p_sys->p_forced_style->i_features |= STYLE_HAS_FLAGS;
  222. @@ -962,6 +967,12 @@ static void FillDefaultStyles( filter_t *p_filter )
  223. /* Apply forced styles to defaults, if any */
  224. text_style_Merge( p_sys->p_default_style, p_sys->p_forced_style, true );
  225. +
  226. + vlc_mutex_init( &p_sys->lock );
  227. + var_AddCallback( p_filter, "freetype-font", DefaultFontStyleCallback, p_sys );
  228. + var_AddCallback( p_filter, "freetype-rel-fontsize", DefaultFontStyleCallback, p_sys );
  229. + var_AddCallback( p_filter, "freetype-color", DefaultFontStyleCallback, p_sys );
  230. + var_AddCallback( p_filter, "freetype-bold", DefaultFontStyleCallback, p_sys );
  231. }
  232. static void FreeStylesArray( text_style_t **pp_styles, size_t i_styles )
  233. @@ -1324,6 +1335,17 @@ static void Destroy( vlc_object_t *p_this )
  234. DumpDictionary( p_filter, &p_sys->fallback_map, true, -1 );
  235. #endif
  236. + var_DelCallback( p_filter, "freetype-font", DefaultFontStyleCallback, p_sys );
  237. + var_DelCallback( p_filter, "freetype-rel-fontsize", DefaultFontStyleCallback, p_sys );
  238. + var_DelCallback( p_filter, "freetype-color", DefaultFontStyleCallback, p_sys );
  239. + var_DelCallback( p_filter, "freetype-bold", DefaultFontStyleCallback, p_sys );
  240. + vlc_mutex_destroy( &p_sys->lock );
  241. +
  242. + var_Destroy( p_filter, "freetype-font" ) ;
  243. + var_Destroy( p_filter, "freetype-rel-fontsize" );
  244. + var_Destroy( p_filter, "freetype-color" );
  245. + var_Destroy( p_filter, "freetype-bold" );
  246. +
  247. /* Attachments */
  248. if( p_sys->pp_font_attachments )
  249. {
  250. @@ -1353,3 +1375,33 @@ static void Destroy( vlc_object_t *p_this )
  251. free( p_sys );
  252. }
  253. +static int DefaultFontStyleCallback( vlc_object_t *p_this, char const *psz_var,
  254. + vlc_value_t oldval, vlc_value_t newval,
  255. + void *p_data )
  256. +{
  257. + VLC_UNUSED(oldval);
  258. + filter_t *p_filter = (filter_t *)p_this;
  259. + filter_sys_t *p_sys = (filter_sys_t *)p_data;
  260. +
  261. + vlc_mutex_lock( &p_sys->lock );
  262. + if( !strcmp( psz_var, "freetype-font" ) ) {
  263. + FREENULL( p_sys->p_default_style->psz_fontname );
  264. + p_sys->p_default_style->psz_fontname = strdup( newval.psz_string );
  265. + } else if( !strcmp( psz_var, "freetype-rel-fontsize" ) )
  266. + p_sys->p_forced_style->f_font_relsize = (int)p_filter->fmt_out.video.i_height / newval.i_int;
  267. + else if( !strcmp( psz_var, "freetype-color" ) )
  268. + p_sys->p_default_style->i_font_color = VLC_CLIP(newval.i_int, 0, 0xFFFFFF);
  269. + else if ( !strcmp( psz_var, "freetype-bold" ) )
  270. + {
  271. + if (newval.b_bool) {
  272. + p_sys->p_forced_style->i_style_flags |= STYLE_BOLD;
  273. + p_sys->p_forced_style->i_features |= STYLE_HAS_FLAGS;
  274. + } else {
  275. + p_sys->p_forced_style->i_style_flags &= ~STYLE_BOLD;
  276. + p_sys->p_forced_style->i_features &= ~STYLE_HAS_FLAGS;
  277. + }
  278. + }
  279. + vlc_mutex_unlock( &p_sys->lock );
  280. +
  281. + return VLC_SUCCESS;
  282. +}
  283. diff --git a/modules/text_renderer/freetype/freetype.h b/modules/text_renderer/freetype/freetype.h
  284. index 44b2731..7f1abec 100644
  285. --- a/modules/text_renderer/freetype/freetype.h
  286. +++ b/modules/text_renderer/freetype/freetype.h
  287. @@ -137,6 +137,8 @@ struct filter_sys_t
  288. */
  289. vlc_family_t * (*pf_get_fallbacks) ( filter_t *p_filter, const char *psz_family,
  290. uni_char_t codepoint );
  291. +
  292. + vlc_mutex_t lock;
  293. };
  294. /**
  295. --
  296. 2.6.0