sub: make font provider user-selectable

libass had an API to configure this since 2013. mpv always used
ASS_FONTPROVIDER_AUTODETECT, because usually there's little reason to
use anything else. The intention of the now added option is to allow
users to disable use of system fonts.

I didn't consider it worth the trouble to add the coretext and
directwrite enum items from ASS_DefaultFontProvider. The "auto" choice
will have the same effect if they're available. Also, the part of the
code which defines the option does not necessarily have libass available
(it's still optional!), so defining all enum items as choices is icky. I
still added fontconfig, since that may be nice to emulate a nostalgic
2010 feeling of mpv freezing on fontconfig.

The option for OSD is even less useful. (But you get it for free, and
why pass up a chance to add yet another useless option?)

This is not quite what was requested in #6947, but as close as it gets.
This commit is contained in:
wm4 2019-09-25 22:11:39 +02:00
parent bbf6e103b4
commit ff2aed2b56
4 changed files with 30 additions and 3 deletions

View File

@ -1969,9 +1969,9 @@ Subtitles
Default: no.
``--embeddedfonts``, ``--no-embeddedfonts``
``--embeddedfonts=<yes|no>``
Use fonts embedded in Matroska container files and ASS scripts (default:
enabled). These fonts can be used for SSA/ASS subtitle rendering.
yes). These fonts can be used for SSA/ASS subtitle rendering.
``--sub-pos=<0-100>``
Specify the position of subtitles on the screen. The value is the vertical
@ -2461,6 +2461,20 @@ Subtitles
If the video stream contains no closed captions, or if no video is being
decoded, the CC track will remain empty and will not show any text.
``--sub-font-provider=<auto|none|fontconfig>``
Which libass font provider backend to use (default: auto). ``auto`` will
attempt to use the native font provider: fontconfig on Linux, CoreText on
OSX, DirectWrite on Windows. ``fontconfig`` forces fontconfig, if libass
was built with support (if not, it behaves like ``none``).
The ``none`` font provider effectively disables system fonts. It will still
attempt to use embedded fonts (unless ``--embeddedfonts=no`` is set; this is
the same behavior as with all other font providers), ``subfont.ttf`` if
provided, and fonts in the ``fonts`` sub-directory if provided. (The
fallback is more strict than that of other font providers, and if a font
name does not match, it may prefer not to render any text that uses the
missing font.)
Window
------
@ -3625,6 +3639,10 @@ OSD
This option is somewhat experimental and could be replaced by another
mechanism in the future.
``--osd-font-provider=<...>``
See ``--sub-font-provider`` for details and accepted values. Note that
unlike subtitles, OSD never uses embedded fonts from media files.
Screenshot
----------

View File

@ -96,8 +96,14 @@ void mp_ass_configure_fonts(ASS_Renderer *priv, struct osd_style_opts *opts,
if (default_font && !mp_path_exists(default_font))
default_font = NULL;
int font_provider = ASS_FONTPROVIDER_AUTODETECT;
if (opts->font_provider == 1)
font_provider = ASS_FONTPROVIDER_NONE;
if (opts->font_provider == 2)
font_provider = ASS_FONTPROVIDER_FONTCONFIG;
mp_verbose(log, "Setting up fonts...\n");
ass_set_fonts(priv, default_font, opts->font, 1, config, 1);
ass_set_fonts(priv, default_font, opts->font, font_provider, config, 1);
mp_verbose(log, "Done.\n");
talloc_free(tmp);

View File

@ -64,6 +64,8 @@ static const m_option_t style_opts[] = {
OPT_FLAG("italic", italic, 0),
OPT_CHOICE("justify", justify, 0,
({"auto", 0}, {"left", 1}, {"center", 2}, {"right", 3})),
OPT_CHOICE("font-provider", font_provider, 0,
({"auto", 0}, {"none", 1}, {"fontconfig", 2})),
{0}
};

View File

@ -137,6 +137,7 @@ struct osd_style_opts {
int bold;
int italic;
int justify;
int font_provider;
};
extern const struct m_sub_options osd_style_conf;