summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-07-25 01:01:47 -0400
committerMatthias Clasen <mclasen@redhat.com>2019-07-25 01:01:47 -0400
commit12baa9c693d5b4c3ecd4d3daa4fc313d30092f12 (patch)
treea6c2b0736214df71a1321cdc643357f28fed4ad6
parent85b32f41ae958ce269f2946b36b2d682903a89e1 (diff)
parent451bdb03e82caa54fe432e202aac9349c213a13c (diff)
downloadpango-12baa9c693d5b4c3ecd4d3daa4fc313d30092f12.tar.gz
Merge branch 'win32-threadsafe'
-rw-r--r--pango/pangowin32-fontmap.c56
-rw-r--r--pango/pangowin32-private.h6
-rw-r--r--pango/pangowin32.c8
3 files changed, 38 insertions, 32 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,
diff --git a/pango/pangowin32-private.h b/pango/pangowin32-private.h
index f8d445aa..72befca8 100644
--- a/pango/pangowin32-private.h
+++ b/pango/pangowin32-private.h
@@ -107,6 +107,12 @@ struct _PangoWin32FontMap
*/
GHashTable *fonts;
+ /* keeps track of the system font aliases that we might have */
+ GHashTable *aliases;
+
+ /* keeps track of the warned fonts that we might have */
+ GHashTable *warned_fonts;
+
double resolution; /* (points / pixel) * PANGO_SCALE */
};
diff --git a/pango/pangowin32.c b/pango/pangowin32.c
index 8d175760..09750199 100644
--- a/pango/pangowin32.c
+++ b/pango/pangowin32.c
@@ -456,15 +456,15 @@ pango_win32_font_get_glyph_extents (PangoFont *font,
if (!info)
{
+ HDC hdc = pango_win32_get_dc ();
+
info = g_new0 (PangoWin32GlyphInfo, 1);
memset (&gm, 0, sizeof (gm));
hfont = _pango_win32_font_get_hfont (font);
- SelectObject (_pango_win32_hdc, hfont);
- /* FIXME: (Alex) This constant reuse of _pango_win32_hdc is
- not thread-safe */
- res = GetGlyphOutlineA (_pango_win32_hdc,
+ SelectObject (hdc, hfont);
+ res = GetGlyphOutlineA (hdc,
glyph_index,
GGO_METRICS | GGO_GLYPH_INDEX,
&gm,