diff options
Diffstat (limited to 'pango/pangowin32-fontmap.c')
-rw-r--r-- | pango/pangowin32-fontmap.c | 458 |
1 files changed, 333 insertions, 125 deletions
diff --git a/pango/pangowin32-fontmap.c b/pango/pangowin32-fontmap.c index facaf25e..2f98d453 100644 --- a/pango/pangowin32-fontmap.c +++ b/pango/pangowin32-fontmap.c @@ -4,6 +4,7 @@ * Copyright (C) 2000 Red Hat Software * Copyright (C) 2000 Tor Lillqvist * Copyright (C) 2001 Alexander Larsson + * Copyright (C) 2007 Novell, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -52,7 +53,7 @@ struct _PangoWin32Family struct _PangoWin32SizeInfo { - GSList *logfonts; + GSList *logfontws; }; #define PANGO_WIN32_TYPE_FAMILY (pango_win32_family_get_type ()) @@ -75,18 +76,18 @@ static PangoFont *pango_win32_font_map_load_font (PangoFontMap PangoContext *context, const PangoFontDescription *description); static void pango_win32_font_map_list_families (PangoFontMap *fontmap, - PangoFontFamily ***families, - int *n_families); + PangoFontFamily ***families, + int *n_families); -static PangoFont *pango_win32_font_map_real_find_font (PangoWin32FontMap *win32fontmap, - PangoContext *context, - PangoWin32Face *face, - const PangoFontDescription *description); +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, - LOGFONT *lfp); + LOGFONTW *lfp); static PangoWin32FontMap *default_fontmap = NULL; @@ -96,7 +97,7 @@ G_DEFINE_TYPE (PangoWin32FontMap, pango_win32_font_map, PANGO_TYPE_FONT_MAP) (((c) >= 'A' && (c) <= 'Z') ? (c) - 'A' + 'a' : (c)) static guint -case_insensitive_hash (const char *key) +case_insensitive_str_hash (const char *key) { const char *p = key; guint h = TOLOWER (*p); @@ -111,37 +112,63 @@ case_insensitive_hash (const char *key) } static gboolean -case_insensitive_equal (const char *key1, - const char *key2) +case_insensitive_str_equal (const char *key1, + const char *key2) { - return (g_ascii_strcasecmp (key1, key2) == 0); + while (*key1 && *key2 && TOLOWER (*key1) == TOLOWER (*key2)) + key1++, key2++; + return (!*key1 && !*key2); } -/* A hash function for LOGFONTs that takes into consideration only +static guint +case_insensitive_wcs_hash (const wchar_t *key) +{ + const wchar_t *p = key; + guint h = TOLOWER (*p); + + if (h) + { + for (p += 1; *p != '\0'; p++) + h = (h << 5) - h + TOLOWER (*p); + } + + return h; +} + +static gboolean +case_insensitive_wcs_equal (const wchar_t *key1, + const wchar_t *key2) +{ + while (*key1 && *key2 && TOLOWER (*key1) == TOLOWER (*key2)) + key1++, key2++; + return (!*key1 && !*key2); +} + +/* A hash function for LOGFONTWs that takes into consideration only * those fields that indicate a specific .ttf file is in use: * lfFaceName, lfItalic and lfWeight. Dunno how correct this is. */ static guint -logfont_nosize_hash (const LOGFONT *lfp) +logfontw_nosize_hash (const LOGFONTW *lfp) { - return case_insensitive_hash (lfp->lfFaceName) + lfp->lfItalic + lfp->lfWeight; + return case_insensitive_wcs_hash (lfp->lfFaceName) + (lfp->lfItalic != 0) + lfp->lfWeight; } /* Ditto comparison function */ static gboolean -logfont_nosize_equal (const LOGFONT *lfp1, - const LOGFONT *lfp2) +logfontw_nosize_equal (const LOGFONTW *lfp1, + const LOGFONTW *lfp2) { - return (case_insensitive_equal (lfp1->lfFaceName, lfp2->lfFaceName) - && lfp1->lfItalic == lfp2->lfItalic + return (case_insensitive_wcs_equal (lfp1->lfFaceName, lfp2->lfFaceName) + && (lfp1->lfItalic != 0) == (lfp2->lfItalic != 0) && lfp1->lfWeight == lfp2->lfWeight); } static int CALLBACK -pango_win32_inner_enum_proc (LOGFONT *lfp, - TEXTMETRIC *metrics, - DWORD fontType, - LPARAM lParam) +pango_win32_inner_enum_proc (LOGFONTW *lfp, + TEXTMETRICW *metrics, + DWORD fontType, + LPARAM lParam) { PangoWin32FontMap *win32fontmap = (PangoWin32FontMap *)lParam; @@ -155,41 +182,27 @@ pango_win32_inner_enum_proc (LOGFONT *lfp, } static int CALLBACK -pango_win32_enum_proc (LOGFONT *lfp, - TEXTMETRIC *metrics, - DWORD fontType, - LPARAM lParam) +pango_win32_enum_proc (LOGFONTW *lfp, + TEXTMETRICW *metrics, + DWORD fontType, + LPARAM lParam) { - LOGFONT lf; + LOGFONTW lf; - PING(("%s", lfp->lfFaceName)); + PING(("%S", lfp->lfFaceName)); if (fontType != TRUETYPE_FONTTYPE) return 1; lf = *lfp; - EnumFontFamiliesExA (pango_win32_hdc, &lf, - (FONTENUMPROC) pango_win32_inner_enum_proc, + EnumFontFamiliesExW (pango_win32_hdc, &lf, + (FONTENUMPROCW) pango_win32_inner_enum_proc, lParam, 0); return 1; } -static gboolean -first_match (gpointer key, - gpointer value, - gpointer user_data) -{ - LOGFONT *lfp = (LOGFONT *)key; - LOGFONT *lfp2 = (LOGFONT *)((PangoWin32SizeInfo *)value)->logfonts->data; - gchar *name = (gchar *)user_data; - - if (strcmp (lfp->lfFaceName, name) == 0 && lfp->lfWeight == lfp2->lfWeight) - return TRUE; - return FALSE; -} - typedef struct _ItalicHelper { PangoWin32FontMap *fontmap; @@ -202,42 +215,41 @@ ensure_italic (gpointer key, gpointer user_data) { ItalicHelper *helper = (ItalicHelper *)user_data; - /* PangoWin32Family *win32family = (PangoWin32Family *)value; */ + PangoWin32SizeInfo *sip = (PangoWin32SizeInfo *) value; + GSList *list = sip->logfontws; - PangoWin32SizeInfo *sip = (PangoWin32SizeInfo *)g_hash_table_find (helper->fontmap->size_infos, first_match, key); - if (sip) + while (list) { - GSList *list = sip->logfonts; - - while (list) + LOGFONTW *lfp = (LOGFONTW *) list->data; + PING(("%S it=%d wt=%ld", lfp->lfFaceName, lfp->lfItalic, lfp->lfWeight)); + if (!lfp->lfItalic) { - LOGFONT *lfp = (LOGFONT *)list->data; - if (!lfp->lfItalic) + /* we have a non italic variant, look if there is an italic */ + LOGFONTW logfontw = *lfp; + logfontw.lfItalic = 1; + sip = (PangoWin32SizeInfo *) g_hash_table_lookup (helper->fontmap->size_infos, &logfontw); + if (!sip) { - /* we have a non italic variant, look if there is an italic */ - LOGFONT logfont = *lfp; - logfont.lfItalic = 1; - sip = (PangoWin32SizeInfo *)g_hash_table_find (helper->fontmap->size_infos, first_match, &logfont); - if (!sip) - { - /* remember the non italic variant to be added later as italic */ - helper->list = g_slist_append (helper->list, lfp); - } + /* remember the non italic variant to be added later as italic */ + PING(("synthesizing italic")); + helper->list = g_slist_append (helper->list, lfp); } - list = list->next; } + list = list->next; } } static void pango_win32_font_map_init (PangoWin32FontMap *win32fontmap) { - LOGFONT logfont; + LOGFONTW logfont; + ItalicHelper helper = { win32fontmap, NULL }; + GSList *list; - win32fontmap->families = g_hash_table_new ((GHashFunc) case_insensitive_hash, - (GEqualFunc) case_insensitive_equal); + win32fontmap->families = g_hash_table_new ((GHashFunc) case_insensitive_str_hash, + (GEqualFunc) case_insensitive_str_equal); win32fontmap->size_infos = - g_hash_table_new ((GHashFunc) logfont_nosize_hash, (GEqualFunc) logfont_nosize_equal); + g_hash_table_new ((GHashFunc) logfontw_nosize_hash, (GEqualFunc) logfontw_nosize_equal); win32fontmap->n_fonts = 0; win32fontmap->font_cache = pango_win32_font_cache_new (); @@ -245,26 +257,23 @@ pango_win32_font_map_init (PangoWin32FontMap *win32fontmap) memset (&logfont, 0, sizeof (logfont)); logfont.lfCharSet = DEFAULT_CHARSET; - EnumFontFamiliesExA (pango_win32_hdc, &logfont, (FONTENUMPROC) pango_win32_enum_proc, - (LPARAM)win32fontmap, 0); - - /* create synthetic italic entries */ - { - ItalicHelper helper = { win32fontmap, NULL }; - GSList *list; - - g_hash_table_foreach (win32fontmap->families, ensure_italic, &helper); - /* cant modify while iterating */ - list = helper.list; - while (list) - { - LOGFONT logfont = *((LOGFONT *)list->data); - logfont.lfItalic = 1; - pango_win32_insert_font (win32fontmap, &logfont); - list = list->next; - } - g_slist_free (helper.list); - } + EnumFontFamiliesExW (pango_win32_hdc, &logfont, + (FONTENUMPROCW) pango_win32_enum_proc, + (LPARAM) win32fontmap, 0); + + /* Create synthetic italic entries */ + g_hash_table_foreach (win32fontmap->size_infos, ensure_italic, &helper); + + /* Can't modify while iterating */ + list = helper.list; + while (list) + { + LOGFONTW logfontw = *((LOGFONTW *)list->data); + logfontw.lfItalic = 1; + pango_win32_insert_font (win32fontmap, &logfontw); + list = list->next; + } + g_slist_free (helper.list); win32fontmap->resolution = (PANGO_SCALE / (double) GetDeviceCaps (pango_win32_hdc, LOGPIXELSY)) * 72.0; } @@ -540,7 +549,7 @@ pango_win32_font_map_real_find_font (PangoWin32FontMap *win32fontmap, 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)); + PING(("got best match:%S size=%d",face->logfontw.lfFaceName,size)); while (tmp_list) { @@ -558,7 +567,7 @@ pango_win32_font_map_real_find_font (PangoWin32FontMap *win32fontmap, tmp_list = tmp_list->next; } - win32font = pango_win32_font_new (fontmap, &face->logfont, size); + win32font = pango_win32_font_neww (fontmap, &face->logfontw, size); if (!win32font) return NULL; @@ -571,7 +580,7 @@ pango_win32_font_map_real_find_font (PangoWin32FontMap *win32fontmap, } static gchar * -get_family_name (const LOGFONT *lfp) +get_family_nameA (const LOGFONTA *lfp) { HFONT hfont; HFONT oldhfont; @@ -696,13 +705,13 @@ get_family_name (const LOGFONT *lfp) /** * pango_win32_font_description_from_logfont: - * @lfp: a LOGFONT + * @lfp: a LOGFONTA * - * Creates a #PangoFontDescription that matches the specified LOGFONT. + * Creates a #PangoFontDescription that matches the specified LOGFONTA. * - * The face name, italicness and weight fields in the LOGFONT are used + * The face name, italicness and weight fields in the LOGFONTA are used * to set up the resulting #PangoFontDescription. If the face name in - * the LOGFONT contains non-ASCII characters the font is temporarily + * the LOGFONTA contains non-ASCII characters the font is temporarily * loaded (using CreateFontIndirect()) and an ASCII (usually English) * name for it is looked up from the font name tables in the font * data. If that doesn't work, the face name is converted from the @@ -723,7 +732,201 @@ pango_win32_font_description_from_logfont (const LOGFONT *lfp) PangoWeight weight; PangoStretch stretch; - family = get_family_name (lfp); + family = get_family_nameA (lfp); + + if (!lfp->lfItalic) + style = PANGO_STYLE_NORMAL; + else + style = PANGO_STYLE_ITALIC; + + variant = PANGO_VARIANT_NORMAL; + + /* The PangoWeight values PANGO_WEIGHT_* map exactly do Windows FW_* + * values. Is this on purpose? Quantize the weight to exact + * PANGO_WEIGHT_* values. Is this a good idea? + */ + if (lfp->lfWeight == FW_DONTCARE) + weight = PANGO_WEIGHT_NORMAL; + else if (lfp->lfWeight <= (FW_ULTRALIGHT + FW_LIGHT) / 2) + weight = PANGO_WEIGHT_ULTRALIGHT; + else if (lfp->lfWeight <= (FW_LIGHT + FW_NORMAL) / 2) + weight = PANGO_WEIGHT_LIGHT; + else if (lfp->lfWeight <= (FW_NORMAL + FW_BOLD) / 2) + weight = PANGO_WEIGHT_NORMAL; + else if (lfp->lfWeight <= (FW_BOLD + FW_ULTRABOLD) / 2) + weight = PANGO_WEIGHT_BOLD; + else if (lfp->lfWeight <= (FW_ULTRABOLD + FW_HEAVY) / 2) + weight = PANGO_WEIGHT_ULTRABOLD; + else + weight = PANGO_WEIGHT_HEAVY; + + /* XXX No idea how to figure out the stretch */ + stretch = PANGO_STRETCH_NORMAL; + + description = pango_font_description_new (); + pango_font_description_set_family (description, family); + pango_font_description_set_style (description, style); + pango_font_description_set_weight (description, weight); + pango_font_description_set_stretch (description, stretch); + pango_font_description_set_variant (description, variant); + + return description; +} + +static gchar * +get_family_nameW (const LOGFONTW *lfp) +{ + HFONT hfont; + HFONT oldhfont; + + struct name_header header; + struct name_record record; + + gint unicode_ix = -1, mac_ix = -1, microsoft_ix = -1; + gint name_ix; + gchar *codeset; + + gchar *string = NULL; + gchar *name; + + gint i, l; + gsize nbytes; + + /* If lfFaceName is ASCII, assume it is the common (English) name + * for the font. Is this valid? Do some TrueType fonts have + * different names in French, German, etc, and does the system + * return these if the locale is set to use French, German, etc? + */ + l = wcslen (lfp->lfFaceName); + for (i = 0; i < l; i++) + if (lfp->lfFaceName[i] < ' ' || lfp->lfFaceName[i] > '~') + break; + + if (i == l) + return g_utf16_to_utf8 (lfp->lfFaceName, -1, NULL, NULL, NULL); + + if ((hfont = CreateFontIndirectW (lfp)) == NULL) + goto fail0; + + if ((oldhfont = SelectObject (pango_win32_hdc, hfont)) == NULL) + goto fail1; + + if (!pango_win32_get_name_header (pango_win32_hdc, &header)) + goto fail2; + + PING (("%d name records", header.num_records)); + + for (i = 0; i < header.num_records; i++) + { + if (!pango_win32_get_name_record (pango_win32_hdc, i, &record)) + goto fail2; + + if ((record.name_id != 1 && record.name_id != 16) || record.string_length <= 0) + continue; + + PING(("platform:%d encoding:%d language:%04x name_id:%d", + record.platform_id, record.encoding_id, record.language_id, record.name_id)); + + if (record.platform_id == APPLE_UNICODE_PLATFORM_ID || + record.platform_id == ISO_PLATFORM_ID) + unicode_ix = i; + else if (record.platform_id == MACINTOSH_PLATFORM_ID && + record.encoding_id == 0 && /* Roman */ + record.language_id == 0) /* English */ + mac_ix = i; + else if (record.platform_id == MICROSOFT_PLATFORM_ID) + if ((microsoft_ix == -1 || + PRIMARYLANGID (record.language_id) == LANG_ENGLISH) && + (record.encoding_id == SYMBOL_ENCODING_ID || + record.encoding_id == UNICODE_ENCODING_ID || + record.encoding_id == UCS4_ENCODING_ID)) + microsoft_ix = i; + } + + if (microsoft_ix >= 0) + name_ix = microsoft_ix; + else if (mac_ix >= 0) + name_ix = mac_ix; + else if (unicode_ix >= 0) + name_ix = unicode_ix; + else + goto fail2; + + if (!pango_win32_get_name_record (pango_win32_hdc, name_ix, &record)) + goto fail2; + + string = g_malloc (record.string_length + 1); + if (GetFontData (pango_win32_hdc, NAME, + header.string_storage_offset + record.string_offset, + string, record.string_length) != record.string_length) + goto fail2; + + string[record.string_length] = '\0'; + + if (name_ix == microsoft_ix) + if (record.encoding_id == SYMBOL_ENCODING_ID || + record.encoding_id == UNICODE_ENCODING_ID) + codeset = "UTF-16BE"; + else + codeset = "UCS-4BE"; + else if (name_ix == mac_ix) + codeset = "MacRoman"; + else /* name_ix == unicode_ix */ + codeset = "UCS-4BE"; + + name = g_convert (string, record.string_length, "UTF-8", codeset, NULL, &nbytes, NULL); + if (name == NULL) + goto fail2; + g_free (string); + + PING(("%s", name)); + + SelectObject (pango_win32_hdc, oldhfont); + DeleteObject (hfont); + + return name; + + fail2: + g_free (string); + SelectObject (pango_win32_hdc, oldhfont); + + fail1: + DeleteObject (hfont); + + fail0: + return g_utf16_to_utf8 (lfp->lfFaceName, -1, NULL, NULL, NULL); +} + +/** + * pango_win32_font_description_from_logfontw: + * @lfp: a LOGFONTW + * + * Creates a #PangoFontDescription that matches the specified LOGFONTW. + * + * The face name, italicness and weight fields in the LOGFONTW are used + * to set up the resulting #PangoFontDescription. If the face name in + * the LOGFONTW contains non-ASCII characters the font is temporarily + * loaded (using CreateFontIndirect()) and an ASCII (usually English) + * name for it is looked up from the font name tables in the font + * data. If that doesn't work, the face name is converted from UTF-16 + * to UTF-8 and that is used. + * + * Return value: the newly allocated #PangoFontDescription, which + * should be freed using pango_font_description_free() + * + * Since: 1.16 + */ +PangoFontDescription * +pango_win32_font_description_from_logfontw (const LOGFONTW *lfp) +{ + PangoFontDescription *description; + gchar *family; + PangoStyle style; + PangoVariant variant; + PangoWeight weight; + PangoStretch stretch; + + family = get_family_nameW (lfp); if (!lfp->lfItalic) style = PANGO_STYLE_NORMAL; @@ -764,24 +967,26 @@ pango_win32_font_description_from_logfont (const LOGFONT *lfp) return description; } -/* This inserts the given font into the size_infos table. If a SizeInfo - * already exists with the same typeface name, then the font is added - * to the SizeInfos list, else a new SizeInfo is created and inserted - * in the table. + +/* This inserts the given font into the size_infos table. If a + * SizeInfo already exists with the same typeface name, italicness and + * weight, then the font is added to the SizeInfo's list, else a + * new SizeInfo is created and inserted in the table. */ static void pango_win32_insert_font (PangoWin32FontMap *win32fontmap, - LOGFONT *lfp) + LOGFONTW *lfp) { - LOGFONT *lfp2 = NULL; + LOGFONTW *lfp2 = NULL; PangoFontDescription *description; PangoWin32Family *font_family; PangoWin32Face *win32face; PangoWin32SizeInfo *size_info; GSList *tmp_list; gint i; + gchar *p; - PING(("face=%s,charset=%d,it=%d,wt=%ld,ht=%ld",lfp->lfFaceName,lfp->lfCharSet,lfp->lfItalic,lfp->lfWeight,lfp->lfHeight)); + PING(("face=%S,charset=%d,it=%d,wt=%ld,ht=%ld",lfp->lfFaceName,lfp->lfCharSet,lfp->lfItalic,lfp->lfWeight,lfp->lfHeight)); /* Ignore Symbol fonts (which don't have any Unicode mapping * table). We could also be fancy and use the PostScript glyph name @@ -791,27 +996,28 @@ pango_win32_insert_font (PangoWin32FontMap *win32fontmap, if (lfp->lfCharSet == SYMBOL_CHARSET) return; - /* First insert the LOGFONT into the list of LOGFONTs for the typeface name + /* First insert the LOGFONTW into the list of LOGFONTWs for the + * typeface name, italicness and weight. */ size_info = g_hash_table_lookup (win32fontmap->size_infos, lfp); if (!size_info) { PING(("SizeInfo not found")); size_info = g_new (PangoWin32SizeInfo, 1); - size_info->logfonts = NULL; + size_info->logfontws = NULL; - lfp2 = g_new (LOGFONT, 1); + lfp2 = g_new (LOGFONTW, 1); *lfp2 = *lfp; g_hash_table_insert (win32fontmap->size_infos, lfp2, size_info); } else { - /* Don't store logfonts that differ only in charset + /* Don't store LOGFONTWs that differ only in charset */ - tmp_list = size_info->logfonts; + tmp_list = size_info->logfontws; while (tmp_list) { - LOGFONT *rover = tmp_list->data; + LOGFONTW *rover = tmp_list->data; /* We know that lfWeight, lfItalic and lfFaceName match. We * don't check lfHeight and lfWidth, those are used @@ -832,15 +1038,15 @@ pango_win32_insert_font (PangoWin32FontMap *win32fontmap, if (lfp2 == NULL) { - lfp2 = g_new (LOGFONT, 1); + lfp2 = g_new (LOGFONTW, 1); *lfp2 = *lfp; } - size_info->logfonts = g_slist_prepend (size_info->logfonts, lfp2); + size_info->logfontws = g_slist_prepend (size_info->logfontws, lfp2); - PING(("g_slist_length(size_info->logfonts)=%d", g_slist_length(size_info->logfonts))); + PING(("g_slist_length(size_info->logfontws)=%d", g_slist_length(size_info->logfontws))); - description = pango_win32_font_description_from_logfont (lfp2); + description = pango_win32_font_description_from_logfontw (lfp2); /* In some cases, extracting a name for a font can fail; such fonts * aren't usable for us @@ -858,7 +1064,7 @@ pango_win32_insert_font (PangoWin32FontMap *win32fontmap, for (i = 0; i < PANGO_WIN32_N_COVERAGES; i++) win32face->coverages[i] = NULL; - win32face->logfont = *lfp; + win32face->logfontw = *lfp; win32face->cmap_format = 0; win32face->cmap = NULL; @@ -905,31 +1111,33 @@ pango_win32_insert_font (PangoWin32FontMap *win32fontmap, /* Some other magic names */ /* Recognize just "courier" for "courier new" */ - if (g_ascii_strcasecmp (win32face->logfont.lfFaceName, "courier new") == 0) + p = g_utf16_to_utf8 (win32face->logfontw.lfFaceName, -1, NULL, NULL, NULL); + if (p && g_ascii_strcasecmp (p, "courier new") == 0) { font_family = pango_win32_get_font_family (win32fontmap, "courier"); font_family->font_entries = g_slist_append (font_family->font_entries, win32face); win32fontmap->n_fonts++; } + g_free (p); #endif } -/* Given a LOGFONT and size, make a matching LOGFONT corresponding to +/* Given a LOGFONTW and size, make a matching LOGFONTW corresponding to * an installed font. */ void -pango_win32_make_matching_logfont (PangoFontMap *fontmap, - const LOGFONT *lfp, - int size, - LOGFONT *out) +pango_win32_make_matching_logfontw (PangoFontMap *fontmap, + const LOGFONTW *lfp, + int size, + LOGFONTW *out) { PangoWin32FontMap *win32fontmap; GSList *tmp_list; PangoWin32SizeInfo *size_info; - LOGFONT *closest_match = NULL; + LOGFONTW *closest_match = NULL; gint match_distance = 0; - PING(("lfp.face=%s,wt=%ld,ht=%ld,size:%d",lfp->lfFaceName,lfp->lfWeight,lfp->lfHeight,size)); + PING(("lfp.face=%S,wt=%ld,ht=%ld,size:%d",lfp->lfFaceName,lfp->lfWeight,lfp->lfHeight,size)); win32fontmap = PANGO_WIN32_FONT_MAP (fontmap); size_info = g_hash_table_lookup (win32fontmap->size_infos, lfp); @@ -940,11 +1148,11 @@ pango_win32_make_matching_logfont (PangoFontMap *fontmap, return; } - tmp_list = size_info->logfonts; + tmp_list = size_info->logfontws; while (tmp_list) { - LOGFONT *tmp_logfont = tmp_list->data; - int font_size = abs (tmp_logfont->lfHeight); + LOGFONTW *tmp_logfontw = tmp_list->data; + int font_size = abs (tmp_logfontw->lfHeight); if (size != -1) { @@ -954,7 +1162,7 @@ pango_win32_make_matching_logfont (PangoFontMap *fontmap, new_distance < match_distance || (new_distance < PANGO_SCALE && font_size != 0)) { - closest_match = tmp_logfont; + closest_match = tmp_logfontw; match_distance = new_distance; } } |