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.c56
1 files changed, 28 insertions, 28 deletions
diff --git a/pango/pangowin32-fontmap.c b/pango/pangowin32-fontmap.c
index eb84c164..86093544 100644
--- a/pango/pangowin32-fontmap.c
+++ b/pango/pangowin32-fontmap.c
@@ -605,36 +605,30 @@ read_windows_fallbacks (GHashTable *ht_aliases)
#endif
-static GHashTable *
-load_aliases (void)
+static gboolean
+load_aliases (GHashTable *ht_aliases)
{
- GHashTable *ht_aliases = g_hash_table_new_full ((GHashFunc)alias_hash,
- (GEqualFunc)alias_equal,
- (GDestroyNotify)alias_free,
- NULL);
#ifdef HAVE_CAIRO_WIN32
read_windows_fallbacks (ht_aliases);
read_builtin_aliases (ht_aliases);
#endif
- return ht_aliases;
+ return TRUE;
}
static void
-lookup_aliases (const char *fontname,
+lookup_aliases (GHashTable *aliases_ht,
+ const char *fontname,
char ***families,
int *n_families)
{
- static GHashTable *aliases_ht = NULL; /* MT-safe */
-
struct PangoAlias alias_key;
struct PangoAlias *alias;
+ static gsize aliases_inited = 0;
- if (g_once_init_enter (&aliases_ht))
- {
- g_once_init_leave (&aliases_ht, load_aliases ());
- }
+ if (g_once_init_enter (&aliases_inited))
+ g_once_init_leave (&aliases_inited, load_aliases (aliases_ht));
alias_key.alias = g_ascii_strdown (fontname, -1);
alias = g_hash_table_lookup (aliases_ht, &alias_key);
@@ -660,7 +654,7 @@ create_standard_family (PangoWin32FontMap *win32fontmap,
int n_aliases;
char **aliases;
- lookup_aliases (standard_family_name, &aliases, &n_aliases);
+ lookup_aliases (win32fontmap->aliases, standard_family_name, &aliases, &n_aliases);
for (i = 0; i < n_aliases; i++)
{
PangoWin32Family *existing_family = g_hash_table_lookup (win32fontmap->families, aliases[i]);
@@ -727,6 +721,14 @@ _pango_win32_font_map_init (PangoWin32FontMap *win32fontmap)
win32fontmap->font_cache = pango_win32_font_cache_new ();
win32fontmap->freed_fonts = g_queue_new ();
+ win32fontmap->aliases = g_hash_table_new_full ((GHashFunc)alias_hash,
+ (GEqualFunc)alias_equal,
+ (GDestroyNotify)alias_free,
+ NULL);
+ win32fontmap->warned_fonts = g_hash_table_new_full (g_str_hash,
+ g_str_equal,
+ g_free,
+ NULL);
memset (&logfont, 0, sizeof (logfont));
logfont.lfCharSet = DEFAULT_CHARSET;
@@ -761,8 +763,9 @@ pango_win32_font_map_fontset_add_fonts (PangoFontMap *fontmap,
char **aliases;
int n_aliases;
int j;
+ PangoWin32FontMap *win32fontmap = PANGO_WIN32_FONT_MAP (fontmap);
- lookup_aliases (family, &aliases, &n_aliases);
+ lookup_aliases (win32fontmap->aliases, family, &aliases, &n_aliases);
if (n_aliases)
{
@@ -845,8 +848,9 @@ pango_win32_font_map_finalize (GObject *object)
pango_win32_font_cache_free (win32fontmap->font_cache);
+ g_hash_table_destroy (win32fontmap->warned_fonts);
+ g_hash_table_destroy (win32fontmap->aliases);
g_hash_table_destroy (win32fontmap->fonts);
-
g_hash_table_destroy (win32fontmap->families);
G_OBJECT_CLASS (_pango_win32_font_map_parent_class)->finalize (object);
@@ -1791,11 +1795,14 @@ pango_win32_font_map_load_fontset (PangoFontMap *fontmap,
char **families;
int i;
PangoFontsetSimple *fonts;
- static GHashTable *warned_fonts = NULL; /* MT-safe */
- G_LOCK_DEFINE_STATIC (warned_fonts);
+ PangoWin32FontMap *win32fontmap = NULL;
+ GHashTable *warned_fonts = NULL;
g_return_val_if_fail (fontmap != NULL, NULL);
+ win32fontmap = PANGO_WIN32_FONT_MAP (fontmap);
+ warned_fonts = win32fontmap->warned_fonts;
+
family = pango_font_description_get_family (desc);
families = g_strsplit (family ? family : "", ",", -1);
@@ -1823,12 +1830,8 @@ pango_win32_font_map_load_fontset (PangoFontMap *fontmap,
ctmp1 = pango_font_description_to_string (desc);
pango_font_description_set_family_static (tmp_desc, "Sans");
- G_LOCK (warned_fonts);
-
- if (!warned_fonts || !g_hash_table_lookup (warned_fonts, ctmp1))
+ if (!g_hash_table_lookup (warned_fonts, ctmp1))
{
- if (!warned_fonts)
- warned_fonts = g_hash_table_new (g_str_hash, g_str_equal);
g_hash_table_insert (warned_fonts, g_strdup (ctmp1), GINT_TO_POINTER (1));
@@ -1838,7 +1841,6 @@ pango_win32_font_map_load_fontset (PangoFontMap *fontmap,
g_free (ctmp2);
}
- G_UNLOCK (warned_fonts);
g_free (ctmp1);
pango_win32_font_map_fontset_add_fonts (fontmap,
@@ -1860,9 +1862,8 @@ pango_win32_font_map_load_fontset (PangoFontMap *fontmap,
pango_font_description_set_variant (tmp_desc, PANGO_VARIANT_NORMAL);
pango_font_description_set_stretch (tmp_desc, PANGO_STRETCH_NORMAL);
- G_LOCK (warned_fonts);
- if (!warned_fonts || !g_hash_table_lookup (warned_fonts, ctmp1))
+ if (!g_hash_table_lookup (warned_fonts, ctmp1))
{
g_hash_table_insert (warned_fonts, g_strdup (ctmp1), GINT_TO_POINTER (1));
@@ -1873,7 +1874,6 @@ pango_win32_font_map_load_fontset (PangoFontMap *fontmap,
g_free (ctmp2);
}
- G_UNLOCK (warned_fonts);
g_free (ctmp1);
pango_win32_font_map_fontset_add_fonts (fontmap,