[pango/pango1-dwrite: 5/8] PangoWin32: Add private API for getting IDWriteFontFace from font
- From: Chun-wei Fan <fanchunwei src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pango/pango1-dwrite: 5/8] PangoWin32: Add private API for getting IDWriteFontFace from font
- Date: Tue, 16 Aug 2022 08:13:46 +0000 (UTC)
commit 45a38796e0aafb409be4f09f38b15f45b840d683
Author: Chun-wei Fan <fanchunwei src gnome org>
Date: Mon Aug 15 17:32:57 2022 +0800
PangoWin32: Add private API for getting IDWriteFontFace from font
This moves some items under PangoWin32 in the DirectWrite support to
simplify acquiring the DirectWrite font face that is needed for various
operations, as we will need to do this in PangoCairo in the Windows
support.
pango/pangowin32-dwrite-fontmap.cpp | 54 +++++++++++++++++++++++++++++++------
pango/pangowin32-private.h | 3 +++
2 files changed, 49 insertions(+), 8 deletions(-)
---
diff --git a/pango/pangowin32-dwrite-fontmap.cpp b/pango/pangowin32-dwrite-fontmap.cpp
index 586e62ddc..275e715df 100644
--- a/pango/pangowin32-dwrite-fontmap.cpp
+++ b/pango/pangowin32-dwrite-fontmap.cpp
@@ -87,6 +87,38 @@ pango_win32_dwrite_items_destroy (PangoWin32DWriteItems *dwrite_items)
g_free (dwrite_items);
}
+static IDWriteFontFace *
+_pango_win32_get_dwrite_font_face_from_dwrite_font (IDWriteFont *font)
+{
+ IDWriteFontFace *face = NULL;
+ HRESULT hr;
+
+ g_return_val_if_fail (font != NULL, NULL);
+
+ hr = font->CreateFontFace (&face);
+ if (SUCCEEDED (hr) && face != NULL)
+ return face;
+
+ g_warning ("IDWriteFont::CreateFontFace failed with error code %x\n", (unsigned)hr);
+ return NULL;
+}
+
+void *
+pango_win32_font_get_dwrite_font_face (PangoWin32Font *font)
+{
+ PangoWin32Font *win32font = PANGO_WIN32_FONT (font);
+ PangoWin32FontMap *win32fontmap = PANGO_WIN32_FONT_MAP (win32font->fontmap);
+ IDWriteFont *dwrite_font = NULL;
+ IDWriteFontFace *face = NULL;
+
+ dwrite_font = (IDWriteFont *) g_hash_table_lookup (win32fontmap->dwrite_fonts, &win32font->logfontw);
+
+ if (dwrite_font != NULL)
+ return (void *)_pango_win32_get_dwrite_font_face_from_dwrite_font (dwrite_font);
+
+ return NULL;
+}
+
void
pango_win32_dwrite_font_map_populate (PangoWin32FontMap *map)
{
@@ -132,10 +164,9 @@ pango_win32_dwrite_font_map_populate (PangoWin32FontMap *map)
break;
}
- hr = font->CreateFontFace (&face);
- if (FAILED (hr) || face == NULL)
+ face = _pango_win32_get_dwrite_font_face_from_dwrite_font (font);
+ if (face == NULL)
{
- g_warning ("IDWriteFont::CreateFontFace failed with error code %x\n", (unsigned)hr);
font->Release ();
continue;
}
@@ -464,16 +495,23 @@ pango_win32_dwrite_font_check_is_hinted (PangoWin32Font *font)
gboolean result = FALSE;
gboolean dwrite_font_release = FALSE;
- dwrite_font = get_dwrite_font_from_pango_win32_font (font, &dwrite_font_release);
+ dwrite_font_face = (IDWriteFontFace *)pango_win32_font_get_dwrite_font_face (font);
- if (dwrite_font == NULL)
+ if (dwrite_font_face == NULL)
{
- g_warning ("Failed to retrieve IDWriteFont from PangoWin32Font");
+ dwrite_font = get_dwrite_font_from_pango_win32_font (font, &dwrite_font_release);
- return FALSE;
+ if (dwrite_font != NULL)
+ dwrite_font_face = _pango_win32_get_dwrite_font_face_from_dwrite_font (dwrite_font);
+ else
+ {
+ g_warning ("Failed to retrieve IDWriteFont from PangoWin32Font");
+
+ return FALSE;
+ }
}
- if (SUCCEEDED (dwrite_font->CreateFontFace (&dwrite_font_face)) && dwrite_font_face != NULL)
+ if (dwrite_font_face != NULL)
{
UINT32 gasp_tag = DWRITE_MAKE_OPENTYPE_TAG ('g', 'a', 's', 'p');
UINT32 table_size;
diff --git a/pango/pangowin32-private.h b/pango/pangowin32-private.h
index c66795fb0..2f9bbf601 100644
--- a/pango/pangowin32-private.h
+++ b/pango/pangowin32-private.h
@@ -290,6 +290,9 @@ gpointer _pango_win32_copy_cmap (gpointer cmap,
_PANGO_EXTERN
gboolean pango_win32_dwrite_font_check_is_hinted (PangoWin32Font *font);
+_PANGO_EXTERN
+void *pango_win32_font_get_dwrite_font_face (PangoWin32Font *font);
+
extern gboolean _pango_win32_debug;
void pango_win32_insert_font (PangoWin32FontMap *win32fontmap,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]