diff options
author | Tor Lillqvist <tml@novell.com> | 2007-02-27 09:08:07 +0000 |
---|---|---|
committer | Tor Lillqvist <tml@src.gnome.org> | 2007-02-27 09:08:07 +0000 |
commit | 1731f6a91c35ec595480d079a792951bfd83d6b4 (patch) | |
tree | 627a54fc3e2b690b226e745ff1b899de22673087 /pango/pangowin32-fontmap.c | |
parent | 9e66ba61aaf08836f58448506339ca69d02764a7 (diff) | |
download | pango-1731f6a91c35ec595480d079a792951bfd83d6b4.tar.gz |
This change was supposed to go in the trunk before 1.16.0, but it didn't
2007-02-26 Tor Lillqvist <tml@novell.com>
This change was supposed to go in the trunk before 1.16.0, but it
didn't quite get there in time. So, to have a clear cut for this
somewhat fundamental change in underlying workings (although there
should be no user-visible changes), I will build and distribute
Win32 binaries only starting from 1.16.1.
Use wide character API for fonts on Windows. Rename functions and
variables that deal with LOGFONTW structs to emphasize
this. (#407315)
* pango/pangowin32.c
* pango/pangowin32-fontcache.c
* pango/pangowin32-fontmap.c: Use LOGFONTW all over the place
instead of LOGFONT, and adapt code accordingly. Use wide character
Win32 API.
* pango/pangowin32.c (pango_win32_font_neww): Renamed from
pango_win32_font_new(), as it now takes a LOGFONTW pointer. This
is a private function and can be renamed though it is exported as
it is used from the pangocairo DLL.
(pango_win32_font_logfont): Mention explicitly in doc comment that
it returns a LOGFONTA, and recommend to use
pango_win32_font_logfontw() instead.
(pango_win32_font_logfontw): New function.
* pango/pangowin32-fontcache.c
(pango_win32_font_cache_load): Must keep this function that takes
a LOGFONTA pointer as it is declared in the public header.
(pango_win32_font_cache_loadw): New public function that takes a
LOGFONTW pointer.
* pango/pangowin32-fontmap.c
(pango_win32_font_description_from_logfont): Mention explicitly in
the doc comment that it takes a LOGFONTA pointer.
(pango_win32_font_description_from_logfontw): New public function
that takes a LOGFONTW pointer.
(pango_win32_make_matching_logfontw): Rename from
pango_win32_make_matching_logfont() to emphasize it takes a
LOGFONTW pointer.
* pango/pangowin32.h: Declare new public functions.
* pango/pangowin32-private.h: Declare new private functions, drop
removed ones.
* pango/pangocairo-win32font.c (_pango_cairo_win32_font_new):
Simplify now that we call pango_win32_make_matching_logfontw().
* pango/pangowin32.def: Add new functions, rename internal
functions that now use LOGFONTW.
2007-02-26 Tor Lillqvist <tml@novell.com>
Fix brokenness in the code that tries to ensure that all fonts
also have italic variants. Now the code hopefully actually does
what it was supposed to. (Which is not necessarily the right thing
to do, though. It can be argued that we should not list
synthesized italic font styles, we should just silently generate
them if asked for. We don't want synthesized italic (or synthesized
bold) styles showing up in the font selector. They don't show up
when using a fontconfig-based Pango backend either.) (#110521)
* pango/pangowin32-fontmap.c
(logfont_nosize_hash, logfont_nosize_equal): Don't use the
lfItalic field as such, just its nonzeroness. When being
enumerated, italic fonts show up with lfItalic=255, but our code
looks up italic versions of fonts by passing a key LOGFONT with
lfItalic=1.
(first_match): Not needed any more, see below.
(ensure_italic): This is now called on the entries in the
size_infos hash table, not families. The code used to randomly
look for the first matching font in size_infoswith the family name
being handled.
(pango_win32_font_map_init): Iterate through the size_infos hash
table with ensure_italic, not through the families table.
* pango/pangowin32-fontcache.c
(logfontw_hash, logfontw_equal): Look at just nonzeroness of
lfItalic here, too.
svn path=/trunk/; revision=2204
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; } } |