summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChun-wei Fan <fanchunwei@src.gnome.org>2022-12-14 12:56:05 +0800
committerChun-wei Fan <fanchunwei@src.gnome.org>2022-12-14 13:10:27 +0800
commitc050fe202f1ef4657e64d48d363188240774f90f (patch)
treee19d0b2ecf417667fe1bec7a79603665c2cebf40
parentc5b5d53ae90e15c0ba74b75f08a39fa4098a03f7 (diff)
downloadpango-fix-partially-720.tar.gz
pangowin32-fontmap.c: Allow some support for loading custom fontsfix-partially-720
Previously, when using GDI, we are able to add custom fonts to the system font collection using AddFontResource()/AddFontResourceEx(), but this is not enough as we transition to DirectWrite. Allow some support for this for people that are using AddFontResource() (but not yet AddFontResourceEx()), by using the GDI interop support in DirectWrite. Let people know that currently AddFontResource() should be used for the moment for this support to work, not AddFontResourceEx().
-rw-r--r--pango/pangowin32-dwrite-fontmap.cpp8
-rw-r--r--pango/pangowin32-fontmap.c20
2 files changed, 20 insertions, 8 deletions
diff --git a/pango/pangowin32-dwrite-fontmap.cpp b/pango/pangowin32-dwrite-fontmap.cpp
index a2c03675..377544a9 100644
--- a/pango/pangowin32-dwrite-fontmap.cpp
+++ b/pango/pangowin32-dwrite-fontmap.cpp
@@ -208,8 +208,12 @@ pango_win32_logfontw_get_dwrite_font (LOGFONTW *logfontw)
hr = dwrite_items->gdi_interop->CreateFontFromLOGFONT (logfontw, &font);
if (FAILED (hr) || font == NULL)
- g_warning ("IDWriteFactory::GdiInterop::CreateFontFromLOGFONT failed with error %x\n",
- (unsigned)hr);
+ {
+ g_warning ("IDWriteFactory::GdiInterop::CreateFontFromLOGFONT failed with error %x\n",
+ (unsigned)hr);
+ if (hr == DWRITE_E_NOFONT)
+ g_message ("Did you create your LOGFONTW using AddFontResource() instead of AddFontResourceEx()?");
+ }
return font;
}
diff --git a/pango/pangowin32-fontmap.c b/pango/pangowin32-fontmap.c
index 4cc95787..9b8f6e4b 100644
--- a/pango/pangowin32-fontmap.c
+++ b/pango/pangowin32-fontmap.c
@@ -193,7 +193,10 @@ pango_win32_inner_enum_proc (LOGFONTW *lfp,
* Asian fonts with @ prepended to their name, ignore them.
*/
if (lfp->lfFaceName[0] != '@')
- pango_win32_insert_font (win32fontmap, lfp, NULL, FALSE);
+ {
+ gpointer dwrite_font = pango_win32_logfontw_get_dwrite_font (lfp);
+ pango_win32_insert_font (win32fontmap, lfp, dwrite_font, FALSE);
+ }
return 1;
}
@@ -212,17 +215,24 @@ pango_win32_enum_proc (LOGFONTW *lfp,
{
LOGFONTW lf;
struct EnumProcData *data = (struct EnumProcData *) lParam;
+ PangoWin32FontMap *map = data->font_map;
PING (("%S: %lu %lx", lfp->lfFaceName, fontType, metrics->ntmFlags));
- /* Do not enum Type-1 fonts */
- if (fontType == TRUETYPE_FONTTYPE || metrics->ntmFlags & NTM_PS_OPENTYPE)
+ /* Do not enum Type-1 fonts, and ignore any fonts in the system font
+ * collection that was previously picked up by DirectWrite
+ * (IDWriteFactory->GetSystemFontCollection() via
+ * pango_win32_dwrite_font_map_populate())
+ */
+
+ if (!g_hash_table_lookup (map->fonts, lfp) &&
+ (fontType == TRUETYPE_FONTTYPE || metrics->ntmFlags & NTM_PS_OPENTYPE))
{
lf = *lfp;
EnumFontFamiliesExW (data->hdc, &lf,
(FONTENUMPROCW) pango_win32_inner_enum_proc,
- (LPARAM) data->font_map, 0);
+ (LPARAM) map, 0);
}
return 1;
@@ -720,7 +730,6 @@ _pango_win32_font_map_init (PangoWin32FontMap *win32fontmap)
pango_win32_dwrite_font_map_populate (win32fontmap);
-#if 0 /* XXX: Implement fallback mode to GDI? */
memset (&logfont, 0, sizeof (logfont));
logfont.lfCharSet = DEFAULT_CHARSET;
@@ -730,7 +739,6 @@ _pango_win32_font_map_init (PangoWin32FontMap *win32fontmap)
EnumFontFamiliesExW (hdc, &logfont,
(FONTENUMPROCW) pango_win32_enum_proc,
(LPARAM) &enum_proc_data, 0);
-#endif
g_hash_table_foreach (win32fontmap->families, synthesize_foreach, win32fontmap);