summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Breuer <hans@breuer.org>2006-06-05 21:06:07 +0000
committerHans Breuer <hans@src.gnome.org>2006-06-05 21:06:07 +0000
commit477bb7dc64e98dcf3a0c713c0cd90905003dfb76 (patch)
treeb511a6e8d75e0a7ce8d062d2f38fc907bb8fecd6
parentbfcae3ac7e2426925f671b42843fb7e88003deee (diff)
downloadpango-477bb7dc64e98dcf3a0c713c0cd90905003dfb76.tar.gz
[merged from HEAD] synthesize some italic variants for fonts no having
2006-06-05 Hans Breuer <hans@breuer.org> [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.
-rw-r--r--ChangeLog5
-rw-r--r--pango/pangowin32-fontmap.c71
2 files changed, 76 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 24b5c6d5..81863d8d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2006-06-05 Hans Breuer <hans@breuer.org>
[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.
The latter is needed to have proper sizing of the "hex box" for
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;
}