summaryrefslogtreecommitdiffstats
path: root/libass
diff options
context:
space:
mode:
authorOleg Oshmyan <chortos@inbox.lv>2023-02-08 04:27:40 +0200
committerOleg Oshmyan <chortos@inbox.lv>2024-01-21 17:41:10 +0200
commit9d7d5220f286bd4e9f0713687a752a62a89d574c (patch)
treecb3210b92d3cd113eeb2aeaab9053e767061cbbe /libass
parent57437f03b31120c507034aaf5e44addc88de9fc2 (diff)
downloadlibass-9d7d5220f286bd4e9f0713687a752a62a89d574c.tar.bz2
libass-9d7d5220f286bd4e9f0713687a752a62a89d574c.tar.xz
directwrite: try to fill extended_family even without IDWriteFontFace3
Diffstat (limited to 'libass')
-rw-r--r--libass/ass_directwrite.c39
-rw-r--r--libass/ass_directwrite_info_template.h9
2 files changed, 38 insertions, 10 deletions
diff --git a/libass/ass_directwrite.c b/libass/ass_directwrite.c
index be579fd..d66ea5d 100644
--- a/libass/ass_directwrite.c
+++ b/libass/ass_directwrite.c
@@ -592,8 +592,15 @@ static char *get_fallback(void *priv, ASS_Library *lib,
#include "ass_directwrite_info_template.h"
#undef FONT_TYPE
+#define FONT_TYPE IDWriteFont
+#define FAMILY_AS_ARG
+#include "ass_directwrite_info_template.h"
+#undef FONT_TYPE
+#undef FAMILY_AS_ARG
+
static void add_font_face(IDWriteFontFace *face, ASS_FontProvider *provider,
- ASS_SharedHDC *shared_hdc)
+ ASS_SharedHDC *shared_hdc,
+ IDWriteFontCollection *system_font_coll)
{
ASS_FontProviderMetaData meta = {0};
@@ -605,6 +612,16 @@ static void add_font_face(IDWriteFontFace *face, ASS_FontProvider *provider,
IDWriteFontFace3_Release(face3);
if (!success)
goto cleanup;
+ } else if (system_font_coll) {
+ IDWriteFont *font;
+ hr = IDWriteFontCollection_GetFontFromFontFace(system_font_coll,
+ face, &font);
+ if (SUCCEEDED(hr) && font) {
+ bool success = get_font_info_IDWriteFont(font, NULL, &meta);
+ IDWriteFont_Release(font);
+ if (!success)
+ goto cleanup;
+ }
}
FontPrivate *font_priv = calloc(1, sizeof(*font_priv));
@@ -645,6 +662,7 @@ struct font_enum_priv {
ASS_FontProvider *provider;
IDWriteGdiInterop *gdi_interop;
ASS_SharedHDC *shared_hdc;
+ IDWriteFontCollection *system_font_coll;
};
/*
@@ -751,7 +769,8 @@ static int CALLBACK font_enum_proc(const ENUMLOGFONTW *lpelf,
if (FAILED(hr) || !face)
goto cleanup;
- add_font_face(face, priv->provider, priv->shared_hdc);
+ add_font_face(face, priv->provider, priv->shared_hdc,
+ priv->system_font_coll);
cleanup:
if (hFont)
@@ -786,19 +805,13 @@ static void add_font_set(IDWriteFontSet *fontSet, ASS_FontProvider *provider)
if (FAILED(hr) || !face)
goto cleanup;
- add_font_face((IDWriteFontFace *) face, provider, NULL);
+ add_font_face((IDWriteFontFace *) face, provider, NULL, NULL);
cleanup:
IDWriteFontFaceReference_Release(faceRef);
}
}
-#define FONT_TYPE IDWriteFont
-#define FAMILY_AS_ARG
-#include "ass_directwrite_info_template.h"
-#undef FONT_TYPE
-#undef FAMILY_AS_ARG
-
static void add_font(IDWriteFont *font, IDWriteFontFamily *fontFamily,
ASS_FontProvider *provider)
{
@@ -886,6 +899,11 @@ static void match_fonts(void *priv, ASS_Library *lib,
enum_priv.shared_hdc->hdc = hdc;
enum_priv.shared_hdc->ref_count = 1;
+ enum_priv.system_font_coll = NULL;
+ IDWriteFactory_GetSystemFontCollection(provider_priv->factory,
+ &enum_priv.system_font_coll,
+ FALSE);
+
// EnumFontFamilies gives each font once, plus repeats for charset-specific
// aliases. EnumFontFamiliesEx gives each charset of each font separately,
// so it repeats each font as many times as it has charsets, regardless
@@ -904,6 +922,9 @@ static void match_fonts(void *priv, ASS_Library *lib,
EnumFontFamiliesW(hdc, lf.lfFaceName,
(FONTENUMPROCW) font_enum_proc, (LPARAM) &enum_priv);
+ if (enum_priv.system_font_coll)
+ IDWriteFontCollection_Release(enum_priv.system_font_coll);
+
hdc_release(enum_priv.shared_hdc);
#else
HRESULT hr;
diff --git a/libass/ass_directwrite_info_template.h b/libass/ass_directwrite_info_template.h
index 573fe8e..5db7b7c 100644
--- a/libass/ass_directwrite_info_template.h
+++ b/libass/ass_directwrite_info_template.h
@@ -31,7 +31,14 @@ static bool NAME(FONT_TYPE)(FONT_TYPE *font,
DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES, &familyNames, &exists);
if (SUCCEEDED(hr) && !exists) {
#ifdef FAMILY_AS_ARG
- hr = IDWriteFontFamily_GetFamilyNames(fontFamily, &familyNames);
+ if (fontFamily)
+ hr = IDWriteFontFamily_GetFamilyNames(fontFamily, &familyNames);
+ else {
+ hr = font->lpVtbl->GetFontFamily(font, &fontFamily);
+ if (SUCCEEDED(hr))
+ hr = IDWriteFontFamily_GetFamilyNames(fontFamily, &familyNames);
+ IDWriteFontFamily_Release(fontFamily);
+ }
#else
hr = font->lpVtbl->GetFamilyNames(font, &familyNames);
#endif