From 477bb7dc64e98dcf3a0c713c0cd90905003dfb76 Mon Sep 17 00:00:00 2001 From: Hans Breuer Date: Mon, 5 Jun 2006 21:06:07 +0000 Subject: [merged from HEAD] synthesize some italic variants for fonts no having 2006-06-05 Hans Breuer [merged from HEAD] * pango/pangowin32-fontmap.c(pango_win32_font_map_init) : synthesize some italic variants for fonts no having them already. This fixes bug #343796 and for the italic case also bug #110521. --- ChangeLog | 5 ++++ pango/pangowin32-fontmap.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/ChangeLog b/ChangeLog index 24b5c6d5..81863d8d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ 2006-06-05 Hans Breuer + [merged from HEAD] + * pango/pangowin32-fontmap.c(pango_win32_font_map_init) : synthesize + some italic variants for fonts no having them already. This fixes + bug #343796 and for the italic case also bug #110521. + [merged from HEAD] * pango/pangocairo-win32font.c(compute_glyph_extents) : not only handle PANGO_GLYPH_EMPTY but also PANGO_GLYPH_UNKNOWN_FLAG. diff --git a/pango/pangowin32-fontmap.c b/pango/pangowin32-fontmap.c index 8949a54a..2e504de1 100644 --- a/pango/pangowin32-fontmap.c +++ b/pango/pangowin32-fontmap.c @@ -176,6 +176,59 @@ pango_win32_enum_proc (LOGFONT *lfp, 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; + GSList *list; +} ItalicHelper; + +static void +ensure_italic (gpointer key, + gpointer value, + gpointer user_data) +{ + ItalicHelper *helper = (ItalicHelper *)user_data; + /* PangoWin32Family *win32family = (PangoWin32Family *)value; */ + + PangoWin32SizeInfo *sip = (PangoWin32SizeInfo *)g_hash_table_find (helper->fontmap->size_infos, first_match, key); + if (sip) + { + GSList *list = sip->logfonts; + + while (list) + { + LOGFONT *lfp = (LOGFONT *)list->data; + if (!lfp->lfItalic) + { + /* 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); + } + } + list = list->next; + } + } +} + static void pango_win32_font_map_init (PangoWin32FontMap *win32fontmap) { @@ -195,6 +248,24 @@ pango_win32_font_map_init (PangoWin32FontMap *win32fontmap) 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); + } + win32fontmap->resolution = (PANGO_SCALE / (double) GetDeviceCaps (pango_win32_hdc, LOGPIXELSY)) * 72.0; } -- cgit v1.2.1