From 3ffe9647a0f30878eeaf800341151def8591d044 Mon Sep 17 00:00:00 2001 From: Apache553 Date: Tue, 4 May 2021 03:13:22 +0800 Subject: [PATCH] directwrite: add whole font family from `match_fonts` match_fonts is supposed to add all the fonts with the same family name for fontselect. Commit d325c633f4ac32fcb4c76a3fb5926737a45c38d0 adds only one font, which leads to inability to select (using family name) correct fonts from families with multiple styles. --- libass/ass_directwrite.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/libass/ass_directwrite.c b/libass/ass_directwrite.c index e666bd9ca..d30e8d631 100644 --- a/libass/ass_directwrite.c +++ b/libass/ass_directwrite.c @@ -697,20 +697,27 @@ static void match_fonts(void *priv, ASS_Library *lib, return; hr = IDWriteFont_GetFontFamily(font, &fontFamily); + IDWriteFont_Release(font); if (FAILED(hr) || !fontFamily) - goto cleanup; + return; - add_font(font, fontFamily, provider); + UINT32 n = IDWriteFontFamily_GetFontCount(fontFamily); + for (UINT32 i = 0; i < n; i++) { + hr = IDWriteFontFamily_GetFont(fontFamily, i, &font); + if (FAILED(hr)) + continue; - IDWriteFontFamily_Release(fontFamily); + // Simulations for bold or oblique are sometimes synthesized by + // DirectWrite. We are only interested in physical fonts. + if (IDWriteFont_GetSimulations(font) != 0) { + IDWriteFont_Release(font); + continue; + } - return; + add_font(font, fontFamily, provider); + } -cleanup: - if (font) - IDWriteFont_Release(font); - if (fontFamily) - IDWriteFontFamily_Release(fontFamily); + IDWriteFontFamily_Release(fontFamily); } static void get_substitutions(void *priv, const char *name,