summaryrefslogtreecommitdiff
path: root/pango/pangowin32-fontmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'pango/pangowin32-fontmap.c')
-rw-r--r--pango/pangowin32-fontmap.c212
1 files changed, 99 insertions, 113 deletions
diff --git a/pango/pangowin32-fontmap.c b/pango/pangowin32-fontmap.c
index 92bf7f64..98057170 100644
--- a/pango/pangowin32-fontmap.c
+++ b/pango/pangowin32-fontmap.c
@@ -33,43 +33,12 @@
#include "pango-utils.h"
#include "pangowin32-private.h"
-#define PANGO_TYPE_WIN32_FONT_MAP (pango_win32_font_map_get_type ())
-#define PANGO_WIN32_FONT_MAP(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_WIN32_FONT_MAP, PangoWin32FontMap))
-#define PANGO_WIN32_IS_FONT_MAP(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_WIN32_FONT_MAP))
-
-typedef struct _PangoWin32FontMap PangoWin32FontMap;
-typedef struct _PangoWin32FontMapClass PangoWin32FontMapClass;
typedef struct _PangoWin32Family PangoWin32Family;
typedef struct _PangoWin32SizeInfo PangoWin32SizeInfo;
/* Number of freed fonts */
#define MAX_FREED_FONTS 16
-struct _PangoWin32FontMap
-{
- PangoFontMap parent_instance;
-
- PangoWin32FontCache *font_cache;
- GQueue *freed_fonts;
-
- /* Map Pango family names to PangoWin32Family structs */
- GHashTable *families;
-
- /* Map LOGFONTS (taking into account only the lfFaceName, lfItalic
- * and lfWeight fields) to PangoWin32SizeInfo structs.
- */
- GHashTable *size_infos;
-
- int n_fonts;
-
- double resolution; /* (points / pixel) * PANGO_SCALE */
-};
-
-struct _PangoWin32FontMapClass
-{
- PangoFontMapClass parent_class;
-};
-
struct _PangoWin32Family
{
PangoFontFamily parent_instance;
@@ -108,6 +77,11 @@ static void pango_win32_font_map_list_families (PangoFontMap
PangoFontFamily ***families,
int *n_families);
+static PangoFont *pango_win32_font_map_real_find_font (PangoWin32FontMap *win32fontmap,
+ PangoContext *context,
+ PangoWin32Face *face,
+ const PangoFontDescription *description);
+
static void pango_win32_fontmap_cache_clear (PangoWin32FontMap *win32fontmap);
static void pango_win32_insert_font (PangoWin32FontMap *fontmap,
@@ -144,42 +118,19 @@ logfont_nosize_equal (gconstpointer v1,
&& lfp1->lfWeight == lfp2->lfWeight);
}
-static void
-pango_win32_font_map_init (PangoWin32FontMap *win32fontmap)
-{
- win32fontmap->families = g_hash_table_new (g_str_hash, g_str_equal);
- win32fontmap->size_infos =
- g_hash_table_new (logfont_nosize_hash, logfont_nosize_equal);
- win32fontmap->n_fonts = 0;
-}
-
-static void
-pango_win32_font_map_class_init (PangoWin32FontMapClass *class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (class);
- PangoFontMapClass *fontmap_class = PANGO_FONT_MAP_CLASS (class);
-
- object_class->finalize = pango_win32_font_map_finalize;
- fontmap_class->load_font = pango_win32_font_map_load_font;
- fontmap_class->list_families = pango_win32_font_map_list_families;
- fontmap_class->shape_engine_type = PANGO_RENDER_TYPE_WIN32;
-
- pango_win32_get_dc ();
-}
-
-static PangoWin32FontMap *fontmap = NULL;
-
static int CALLBACK
pango_win32_inner_enum_proc (LOGFONT *lfp,
TEXTMETRIC *metrics,
DWORD fontType,
LPARAM lParam)
{
+ PangoWin32FontMap *win32fontmap = (PangoWin32FontMap *)lParam;
+
/* Windows generates synthetic vertical writing versions of East
* Asian fonts with @ prepended to their name, ignore them.
*/
if (lfp->lfFaceName[0] != '@')
- pango_win32_insert_font (fontmap, lfp);
+ pango_win32_insert_font (win32fontmap, lfp);
return 1;
}
@@ -205,6 +156,45 @@ pango_win32_enum_proc (LOGFONT *lfp,
return 1;
}
+static void
+pango_win32_font_map_init (PangoWin32FontMap *win32fontmap)
+{
+ LOGFONT logfont;
+
+ win32fontmap->families = g_hash_table_new (g_str_hash, g_str_equal);
+ win32fontmap->size_infos =
+ g_hash_table_new (logfont_nosize_hash, logfont_nosize_equal);
+ win32fontmap->n_fonts = 0;
+
+ win32fontmap->font_cache = pango_win32_font_cache_new ();
+ win32fontmap->freed_fonts = g_queue_new ();
+
+ memset (&logfont, 0, sizeof (logfont));
+ logfont.lfCharSet = DEFAULT_CHARSET;
+ EnumFontFamiliesExA (pango_win32_hdc, &logfont, (FONTENUMPROC) pango_win32_enum_proc,
+ (LPARAM)win32fontmap, 0);
+
+ win32fontmap->resolution = (PANGO_SCALE / (double) GetDeviceCaps (pango_win32_hdc, LOGPIXELSY)) * 72.0;
+
+}
+
+static void
+pango_win32_font_map_class_init (PangoWin32FontMapClass *class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
+ PangoFontMapClass *fontmap_class = PANGO_FONT_MAP_CLASS (class);
+
+ class->find_font = pango_win32_font_map_real_find_font;
+ object_class->finalize = pango_win32_font_map_finalize;
+ fontmap_class->load_font = pango_win32_font_map_load_font;
+ fontmap_class->list_families = pango_win32_font_map_list_families;
+ fontmap_class->shape_engine_type = PANGO_RENDER_TYPE_WIN32;
+
+ pango_win32_get_dc ();
+}
+
+static PangoWin32FontMap *default_fontmap = NULL;
+
/**
* pango_win32_font_map_for_display:
*
@@ -217,26 +207,15 @@ pango_win32_enum_proc (LOGFONT *lfp,
PangoFontMap *
pango_win32_font_map_for_display (void)
{
- LOGFONT logfont;
-
/* Make sure that the type system is initialized */
g_type_init ();
- if (fontmap != NULL)
- return PANGO_FONT_MAP (fontmap);
+ if (default_fontmap != NULL)
+ return PANGO_FONT_MAP (default_fontmap);
- fontmap = g_object_new (PANGO_TYPE_WIN32_FONT_MAP, NULL);
+ default_fontmap = g_object_new (PANGO_TYPE_WIN32_FONT_MAP, NULL);
- fontmap->font_cache = pango_win32_font_cache_new ();
- fontmap->freed_fonts = g_queue_new ();
-
- memset (&logfont, 0, sizeof (logfont));
- logfont.lfCharSet = DEFAULT_CHARSET;
- EnumFontFamiliesExA (pango_win32_hdc, &logfont, (FONTENUMPROC) pango_win32_enum_proc, 0, 0);
-
- fontmap->resolution = (PANGO_SCALE / (double) GetDeviceCaps (pango_win32_hdc, LOGPIXELSY)) * 72.0;
-
- return PANGO_FONT_MAP (fontmap);
+ return PANGO_FONT_MAP (default_fontmap);
}
/**
@@ -247,12 +226,12 @@ pango_win32_font_map_for_display (void)
void
pango_win32_shutdown_display (void)
{
- if (fontmap)
+ if (default_fontmap)
{
- pango_win32_fontmap_cache_clear (fontmap);
- g_object_unref (fontmap);
+ pango_win32_fontmap_cache_clear (default_fontmap);
+ g_object_unref (default_fontmap);
- fontmap = NULL;
+ default_fontmap = NULL;
}
}
@@ -445,43 +424,9 @@ pango_win32_font_map_load_font (PangoFontMap *fontmap,
}
if (best_match)
- {
- GSList *tmp_list = best_match->cached_fonts;
- gint size = pango_font_description_get_size (description);
-
- if (pango_font_description_get_size_is_absolute (description))
- size = (int) 0.5 + (size * win32fontmap->resolution) / PANGO_SCALE;
-
- PING(("got best match:%s size=%d",best_match->logfont.lfFaceName,size));
-
- while (tmp_list)
- {
- PangoWin32Font *win32font = tmp_list->data;
- if (win32font->size == size)
- {
- PING (("size matches"));
- result = (PangoFont *)win32font;
-
- g_object_ref (result);
- if (win32font->in_cache)
- pango_win32_fontmap_cache_remove (fontmap, win32font);
-
- break;
- }
- tmp_list = tmp_list->next;
- }
-
- if (!result)
- {
- PangoWin32Font *win32font = pango_win32_font_new (fontmap, &best_match->logfont, size);
-
- win32font->fontmap = fontmap;
- win32font->win32face = best_match;
- best_match->cached_fonts = g_slist_prepend (best_match->cached_fonts, win32font);
-
- result = (PangoFont *)win32font;
- }
- }
+ result = PANGO_WIN32_FONT_MAP_GET_CLASS (win32fontmap)->find_font (win32fontmap, context,
+ best_match,
+ description);
else
PING(("no best match!"));
}
@@ -490,6 +435,47 @@ pango_win32_font_map_load_font (PangoFontMap *fontmap,
return result;
}
+static PangoFont *
+pango_win32_font_map_real_find_font (PangoWin32FontMap *win32fontmap,
+ PangoContext *context,
+ PangoWin32Face *face,
+ const PangoFontDescription *description)
+{
+ PangoFontMap *fontmap = PANGO_FONT_MAP (win32fontmap);
+ PangoWin32Font *win32font;
+ GSList *tmp_list = face->cached_fonts;
+ int size = pango_font_description_get_size (description);
+
+ if (pango_font_description_get_size_is_absolute (description))
+ size = (int) 0.5 + (size * win32fontmap->resolution) / PANGO_SCALE;
+
+ PING(("got best match:%s size=%d",face->logfont.lfFaceName,size));
+
+ while (tmp_list)
+ {
+ win32font = tmp_list->data;
+ if (win32font->size == size)
+ {
+ PING (("size matches"));
+
+ g_object_ref (win32font);
+ if (win32font->in_cache)
+ pango_win32_fontmap_cache_remove (fontmap, win32font);
+
+ return (PangoFont *)win32font;
+ }
+ tmp_list = tmp_list->next;
+ }
+
+ win32font = pango_win32_font_new (fontmap, &face->logfont, size);
+
+ win32font->fontmap = fontmap;
+ win32font->win32face = face;
+ face->cached_fonts = g_slist_prepend (face->cached_fonts, win32font);
+
+ return (PangoFont *)win32font;
+}
+
static gchar *
get_family_name (LOGFONT *lfp)
{