summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog28
-rw-r--r--pango/pangowin32-fontcache.c4
-rw-r--r--pango/pangowin32-fontmap.c57
3 files changed, 50 insertions, 39 deletions
diff --git a/ChangeLog b/ChangeLog
index 05186cd7..b1fd6ec3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+2007-02-26 Tor Lillqvist <tml@novell.com>
+
+ * pango/pangowin32-fontmap.c: 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)
+ (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
+ (logfont_hash, logfont_equal): Look at just nonzeroness of
+ lfItalic here, too.
+
2007-02-13 Owen Taylor <otaylor@redhat.com>
* pango/pangowin32-fontmap.c (pango_win32_insert_font): If
diff --git a/pango/pangowin32-fontcache.c b/pango/pangowin32-fontcache.c
index cec852f2..3e98a074 100644
--- a/pango/pangowin32-fontcache.c
+++ b/pango/pangowin32-fontcache.c
@@ -92,7 +92,7 @@ logfont_hash (gconstpointer v)
const LOGFONT *lfp = v;
return g_str_hash (lfp->lfFaceName) +
- lfp->lfItalic +
+ (lfp->lfItalic != 0) +
lfp->lfWeight/10 +
lfp->lfOrientation +
abs (lfp->lfHeight) * 10;
@@ -108,7 +108,7 @@ logfont_equal (gconstpointer v1,
&& lfp1->lfPitchAndFamily == lfp2->lfPitchAndFamily
&& lfp1->lfStrikeOut == lfp2->lfStrikeOut
&& lfp1->lfUnderline == lfp2->lfUnderline
- && lfp1->lfItalic == lfp2->lfItalic
+ && (lfp1->lfItalic != 0) == (lfp2->lfItalic != 0)
&& lfp1->lfWeight == lfp2->lfWeight
&& lfp1->lfOrientation == lfp2->lfOrientation
&& lfp1->lfEscapement == lfp2->lfEscapement
diff --git a/pango/pangowin32-fontmap.c b/pango/pangowin32-fontmap.c
index e615d349..dd2d312e 100644
--- a/pango/pangowin32-fontmap.c
+++ b/pango/pangowin32-fontmap.c
@@ -124,7 +124,7 @@ case_insensitive_equal (const char *key1,
static guint
logfont_nosize_hash (const LOGFONT *lfp)
{
- return case_insensitive_hash (lfp->lfFaceName) + lfp->lfItalic + lfp->lfWeight;
+ return case_insensitive_hash (lfp->lfFaceName) + (lfp->lfItalic != 0) + lfp->lfWeight;
}
/* Ditto comparison function */
@@ -133,7 +133,7 @@ logfont_nosize_equal (const LOGFONT *lfp1,
const LOGFONT *lfp2)
{
return (case_insensitive_equal (lfp1->lfFaceName, lfp2->lfFaceName)
- && lfp1->lfItalic == lfp2->lfItalic
+ && (lfp1->lfItalic != 0) == (lfp2->lfItalic != 0)
&& lfp1->lfWeight == lfp2->lfWeight);
}
@@ -176,20 +176,6 @@ 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;
@@ -202,30 +188,27 @@ ensure_italic (gpointer key,
gpointer user_data)
{
ItalicHelper *helper = (ItalicHelper *)user_data;
- /* PangoWin32Family *win32family = (PangoWin32Family *)value; */
+ PangoWin32SizeInfo *sip = (PangoWin32SizeInfo *) value;
+ GSList *list = sip->logfonts;
- PangoWin32SizeInfo *sip = (PangoWin32SizeInfo *)g_hash_table_find (helper->fontmap->size_infos, first_match, key);
- if (sip)
+ while (list)
{
- 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);
- }
+ LOGFONT *lfp = (LOGFONT *)list->data;
+ PING(("%s it=%d wt=%ld", lfp->lfFaceName, lfp->lfItalic, lfp->lfWeight));
+ 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_lookup (helper->fontmap->size_infos, &logfont);
+ if (!sip)
+ {
+ /* 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;
}
}
@@ -253,7 +236,7 @@ pango_win32_font_map_init (PangoWin32FontMap *win32fontmap)
ItalicHelper helper = { win32fontmap, NULL };
GSList *list;
- g_hash_table_foreach (win32fontmap->families, ensure_italic, &helper);
+ g_hash_table_foreach (win32fontmap->size_infos, ensure_italic, &helper);
/* cant modify while iterating */
list = helper.list;
while (list)