[pango/pango1-dwrite] pangowin32: Check for monospace using DirectWrite
- From: Chun-wei Fan <fanchunwei src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pango/pango1-dwrite] pangowin32: Check for monospace using DirectWrite
- Date: Tue, 12 Jul 2022 09:39:37 +0000 (UTC)
commit 82896c6ab7d3917835c866b602a305cfb47a59af
Author: Chun-wei Fan <fanchunwei src gnome org>
Date: Tue Jul 12 17:38:30 2022 +0800
pangowin32: Check for monospace using DirectWrite
...if it is available. It makes things much easier than GDI on this regard.
pango/pangowin32-dwrite-fontmap.cpp | 21 ++++++++++++++++++++-
pango/pangowin32-fontmap.c | 6 ++++++
pango/pangowin32-private.h | 3 +++
3 files changed, 29 insertions(+), 1 deletion(-)
---
diff --git a/pango/pangowin32-dwrite-fontmap.cpp b/pango/pangowin32-dwrite-fontmap.cpp
index b71870782..4e482d7d4 100644
--- a/pango/pangowin32-dwrite-fontmap.cpp
+++ b/pango/pangowin32-dwrite-fontmap.cpp
@@ -27,7 +27,7 @@
#ifdef HAVE_DIRECTWRITE
#include <initguid.h>
-#include <dwrite.h>
+#include <dwrite_1.h>
#ifdef STRICT
#undef STRICT
@@ -36,8 +36,10 @@
#ifdef _MSC_VER
# define UUID_OF_IDWriteFactory __uuidof (IDWriteFactory)
+# define UUID_OF_IDWriteFont1 __uuidof (IDWriteFont1)
#else
# define UUID_OF_IDWriteFactory IID_IDWriteFactory
+# define UUID_OF_IDWriteFont1 IID_IDWriteFont1
#endif
struct _PangoWin32DWriteItems
@@ -381,6 +383,23 @@ pango_win32_font_description_from_logfontw_dwrite (LOGFONTW *logfontw)
return desc;
}
+gboolean
+pango_win32_dwrite_font_is_monospace (gpointer dwrite_font)
+{
+ IDWriteFont *font = static_cast<IDWriteFont *>(dwrite_font);
+ IDWriteFont1 *font1 = NULL;
+ gboolean result = FALSE;
+
+ if (SUCCEEDED (font->QueryInterface(UUID_OF_IDWriteFont1,
+ reinterpret_cast<void**>(&font1))))
+ {
+ result = font1->IsMonospacedFont ();
+ font1->Release ();
+ }
+
+ return result;
+}
+
void
pango_win32_dwrite_font_release (gpointer dwrite_font)
{
diff --git a/pango/pangowin32-fontmap.c b/pango/pangowin32-fontmap.c
index 695b35f3e..06ee92e04 100644
--- a/pango/pangowin32-fontmap.c
+++ b/pango/pangowin32-fontmap.c
@@ -1745,8 +1745,14 @@ pango_win32_insert_font (PangoWin32FontMap *win32fontmap,
win32face->family = win32family =
pango_win32_get_font_family (win32fontmap,
pango_font_description_get_family (win32face->description));
+
+#if HAVE_DIRECTWRITE
+ if (dwrite_font != NULL)
+ win32family->is_monospace = pango_win32_dwrite_font_is_monospace (dwrite_font);
+#else
if ((lfp->lfPitchAndFamily & 0xF0) == FF_MODERN)
win32family->is_monospace = TRUE;
+#endif
win32family->faces = g_slist_append (win32family->faces, win32face);
diff --git a/pango/pangowin32-private.h b/pango/pangowin32-private.h
index 5f6410e29..36c6207e3 100644
--- a/pango/pangowin32-private.h
+++ b/pango/pangowin32-private.h
@@ -382,6 +382,9 @@ pango_win32_font_description_from_logfontw_dwrite (LOGFONTW *logfont
PangoFontDescription *
pango_win32_font_description_from_dwrite_font (gpointer dwrite_font);
+gboolean
+pango_win32_dwrite_font_is_monospace (gpointer dwrite_font);
+
void pango_win32_dwrite_font_release (gpointer dwrite_font);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]