diff options
author | Tor Lillqvist <tml@iki.fi> | 1999-10-13 21:46:33 +0000 |
---|---|---|
committer | Tor Lillqvist <tml@src.gnome.org> | 1999-10-13 21:46:33 +0000 |
commit | 018d098240567972205f0ade11c8cdc8eb5a91c1 (patch) | |
tree | ab74eb5c1b96aac36494e9719de7fa1eff68d9a5 | |
parent | b39839820b92175c4bed79e0d1a3bf8e763b34cc (diff) | |
download | gtk+-018d098240567972205f0ade11c8cdc8eb5a91c1.tar.gz |
Don't use TextOutW for GDK_FONT_FONT fonts (which is all we have for now,
1999-10-14 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkdraw.c (gdk_draw_text_wc): Don't use TextOutW for
GDK_FONT_FONT fonts (which is all we have for now, we don't
emulate fontsets). The X11 version uses plain XDrawString in that
case, too. The string passed to gdk_draw_text_wc seems to be in
fact (at least, when used by gtkentry and gtktext) either in a
single-byte charset, or a DBCS. Not Unicode.
This fixes the problem in gtkfontsel, where even if you had
selected a font with a non-Latin1 charset (windows-greek, for
instance), the preview still used Latin-1 glyphs.
* gdk/win32/gdkfont.c (gdk_text_width_wc): Similar change. Don't
use GetTextExtentPoint32W, use GetTextExtentPoint32A.
(gdk_font_load): Recognize the demibold etc weights, even if we
don't have the corresponding constants in the headers.
(gdk_font_hash_insert): Use same hash mechanism as in the X11
version. Should save font resources a bit, when we don't have
multiple HFONTs for the same font.
* gdk/win32/gdkprivate.h: Add the names field as in the X11
version.
-rw-r--r-- | ChangeLog | 24 | ||||
-rw-r--r-- | ChangeLog.pre-2-0 | 24 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 24 | ||||
-rw-r--r-- | ChangeLog.pre-2-2 | 24 | ||||
-rw-r--r-- | ChangeLog.pre-2-4 | 24 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 24 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 24 | ||||
-rw-r--r-- | gdk/win32/gdkdraw.c | 17 | ||||
-rw-r--r-- | gdk/win32/gdkdrawable-win32.c | 17 | ||||
-rw-r--r-- | gdk/win32/gdkevents-win32.c | 3 | ||||
-rw-r--r-- | gdk/win32/gdkevents.c | 3 | ||||
-rw-r--r-- | gdk/win32/gdkfont-win32.c | 134 | ||||
-rw-r--r-- | gdk/win32/gdkfont.c | 134 | ||||
-rw-r--r-- | gdk/win32/gdkprivate-win32.h | 7 | ||||
-rw-r--r-- | gdk/win32/gdkprivate.h | 7 | ||||
-rw-r--r-- | gtk/makefile.cygwin | 5 |
16 files changed, 433 insertions, 62 deletions
@@ -1,3 +1,27 @@ +1999-10-14 Tor Lillqvist <tml@iki.fi> + + * gdk/win32/gdkdraw.c (gdk_draw_text_wc): Don't use TextOutW for + GDK_FONT_FONT fonts (which is all we have for now, we don't + emulate fontsets). The X11 version uses plain XDrawString in that + case, too. The string passed to gdk_draw_text_wc seems to be in + fact (at least, when used by gtkentry and gtktext) either in a + single-byte charset, or a DBCS. Not Unicode. + + This fixes the problem in gtkfontsel, where even if you had + selected a font with a non-Latin1 charset (windows-greek, for + instance), the preview still used Latin-1 glyphs. + + * gdk/win32/gdkfont.c (gdk_text_width_wc): Similar change. Don't + use GetTextExtentPoint32W, use GetTextExtentPoint32A. + (gdk_font_load): Recognize the demibold etc weights, even if we + don't have the corresponding constants in the headers. + (gdk_font_hash_insert): Use same hash mechanism as in the X11 + version. Should save font resources a bit, when we don't have + multiple HFONTs for the same font. + + * gdk/win32/gdkprivate.h: Add the names field as in the X11 + version. + 1999-10-11 ERDI Gergo <cactus@cactus.rulez.org> * gdk/gdk.c (gdk_beep): Modified the XBell call to use the default diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 66459eec63..da734fab2d 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,27 @@ +1999-10-14 Tor Lillqvist <tml@iki.fi> + + * gdk/win32/gdkdraw.c (gdk_draw_text_wc): Don't use TextOutW for + GDK_FONT_FONT fonts (which is all we have for now, we don't + emulate fontsets). The X11 version uses plain XDrawString in that + case, too. The string passed to gdk_draw_text_wc seems to be in + fact (at least, when used by gtkentry and gtktext) either in a + single-byte charset, or a DBCS. Not Unicode. + + This fixes the problem in gtkfontsel, where even if you had + selected a font with a non-Latin1 charset (windows-greek, for + instance), the preview still used Latin-1 glyphs. + + * gdk/win32/gdkfont.c (gdk_text_width_wc): Similar change. Don't + use GetTextExtentPoint32W, use GetTextExtentPoint32A. + (gdk_font_load): Recognize the demibold etc weights, even if we + don't have the corresponding constants in the headers. + (gdk_font_hash_insert): Use same hash mechanism as in the X11 + version. Should save font resources a bit, when we don't have + multiple HFONTs for the same font. + + * gdk/win32/gdkprivate.h: Add the names field as in the X11 + version. + 1999-10-11 ERDI Gergo <cactus@cactus.rulez.org> * gdk/gdk.c (gdk_beep): Modified the XBell call to use the default diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 66459eec63..da734fab2d 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,27 @@ +1999-10-14 Tor Lillqvist <tml@iki.fi> + + * gdk/win32/gdkdraw.c (gdk_draw_text_wc): Don't use TextOutW for + GDK_FONT_FONT fonts (which is all we have for now, we don't + emulate fontsets). The X11 version uses plain XDrawString in that + case, too. The string passed to gdk_draw_text_wc seems to be in + fact (at least, when used by gtkentry and gtktext) either in a + single-byte charset, or a DBCS. Not Unicode. + + This fixes the problem in gtkfontsel, where even if you had + selected a font with a non-Latin1 charset (windows-greek, for + instance), the preview still used Latin-1 glyphs. + + * gdk/win32/gdkfont.c (gdk_text_width_wc): Similar change. Don't + use GetTextExtentPoint32W, use GetTextExtentPoint32A. + (gdk_font_load): Recognize the demibold etc weights, even if we + don't have the corresponding constants in the headers. + (gdk_font_hash_insert): Use same hash mechanism as in the X11 + version. Should save font resources a bit, when we don't have + multiple HFONTs for the same font. + + * gdk/win32/gdkprivate.h: Add the names field as in the X11 + version. + 1999-10-11 ERDI Gergo <cactus@cactus.rulez.org> * gdk/gdk.c (gdk_beep): Modified the XBell call to use the default diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 66459eec63..da734fab2d 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,27 @@ +1999-10-14 Tor Lillqvist <tml@iki.fi> + + * gdk/win32/gdkdraw.c (gdk_draw_text_wc): Don't use TextOutW for + GDK_FONT_FONT fonts (which is all we have for now, we don't + emulate fontsets). The X11 version uses plain XDrawString in that + case, too. The string passed to gdk_draw_text_wc seems to be in + fact (at least, when used by gtkentry and gtktext) either in a + single-byte charset, or a DBCS. Not Unicode. + + This fixes the problem in gtkfontsel, where even if you had + selected a font with a non-Latin1 charset (windows-greek, for + instance), the preview still used Latin-1 glyphs. + + * gdk/win32/gdkfont.c (gdk_text_width_wc): Similar change. Don't + use GetTextExtentPoint32W, use GetTextExtentPoint32A. + (gdk_font_load): Recognize the demibold etc weights, even if we + don't have the corresponding constants in the headers. + (gdk_font_hash_insert): Use same hash mechanism as in the X11 + version. Should save font resources a bit, when we don't have + multiple HFONTs for the same font. + + * gdk/win32/gdkprivate.h: Add the names field as in the X11 + version. + 1999-10-11 ERDI Gergo <cactus@cactus.rulez.org> * gdk/gdk.c (gdk_beep): Modified the XBell call to use the default diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 66459eec63..da734fab2d 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,27 @@ +1999-10-14 Tor Lillqvist <tml@iki.fi> + + * gdk/win32/gdkdraw.c (gdk_draw_text_wc): Don't use TextOutW for + GDK_FONT_FONT fonts (which is all we have for now, we don't + emulate fontsets). The X11 version uses plain XDrawString in that + case, too. The string passed to gdk_draw_text_wc seems to be in + fact (at least, when used by gtkentry and gtktext) either in a + single-byte charset, or a DBCS. Not Unicode. + + This fixes the problem in gtkfontsel, where even if you had + selected a font with a non-Latin1 charset (windows-greek, for + instance), the preview still used Latin-1 glyphs. + + * gdk/win32/gdkfont.c (gdk_text_width_wc): Similar change. Don't + use GetTextExtentPoint32W, use GetTextExtentPoint32A. + (gdk_font_load): Recognize the demibold etc weights, even if we + don't have the corresponding constants in the headers. + (gdk_font_hash_insert): Use same hash mechanism as in the X11 + version. Should save font resources a bit, when we don't have + multiple HFONTs for the same font. + + * gdk/win32/gdkprivate.h: Add the names field as in the X11 + version. + 1999-10-11 ERDI Gergo <cactus@cactus.rulez.org> * gdk/gdk.c (gdk_beep): Modified the XBell call to use the default diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 66459eec63..da734fab2d 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,27 @@ +1999-10-14 Tor Lillqvist <tml@iki.fi> + + * gdk/win32/gdkdraw.c (gdk_draw_text_wc): Don't use TextOutW for + GDK_FONT_FONT fonts (which is all we have for now, we don't + emulate fontsets). The X11 version uses plain XDrawString in that + case, too. The string passed to gdk_draw_text_wc seems to be in + fact (at least, when used by gtkentry and gtktext) either in a + single-byte charset, or a DBCS. Not Unicode. + + This fixes the problem in gtkfontsel, where even if you had + selected a font with a non-Latin1 charset (windows-greek, for + instance), the preview still used Latin-1 glyphs. + + * gdk/win32/gdkfont.c (gdk_text_width_wc): Similar change. Don't + use GetTextExtentPoint32W, use GetTextExtentPoint32A. + (gdk_font_load): Recognize the demibold etc weights, even if we + don't have the corresponding constants in the headers. + (gdk_font_hash_insert): Use same hash mechanism as in the X11 + version. Should save font resources a bit, when we don't have + multiple HFONTs for the same font. + + * gdk/win32/gdkprivate.h: Add the names field as in the X11 + version. + 1999-10-11 ERDI Gergo <cactus@cactus.rulez.org> * gdk/gdk.c (gdk_beep): Modified the XBell call to use the default diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 66459eec63..da734fab2d 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,27 @@ +1999-10-14 Tor Lillqvist <tml@iki.fi> + + * gdk/win32/gdkdraw.c (gdk_draw_text_wc): Don't use TextOutW for + GDK_FONT_FONT fonts (which is all we have for now, we don't + emulate fontsets). The X11 version uses plain XDrawString in that + case, too. The string passed to gdk_draw_text_wc seems to be in + fact (at least, when used by gtkentry and gtktext) either in a + single-byte charset, or a DBCS. Not Unicode. + + This fixes the problem in gtkfontsel, where even if you had + selected a font with a non-Latin1 charset (windows-greek, for + instance), the preview still used Latin-1 glyphs. + + * gdk/win32/gdkfont.c (gdk_text_width_wc): Similar change. Don't + use GetTextExtentPoint32W, use GetTextExtentPoint32A. + (gdk_font_load): Recognize the demibold etc weights, even if we + don't have the corresponding constants in the headers. + (gdk_font_hash_insert): Use same hash mechanism as in the X11 + version. Should save font resources a bit, when we don't have + multiple HFONTs for the same font. + + * gdk/win32/gdkprivate.h: Add the names field as in the X11 + version. + 1999-10-11 ERDI Gergo <cactus@cactus.rulez.org> * gdk/gdk.c (gdk_beep): Modified the XBell call to use the default diff --git a/gdk/win32/gdkdraw.c b/gdk/win32/gdkdraw.c index 34b7a8cba8..8006e1e864 100644 --- a/gdk/win32/gdkdraw.c +++ b/gdk/win32/gdkdraw.c @@ -438,8 +438,6 @@ gdk_draw_string (GdkDrawable *drawable, /* gdk_draw_text * - * Modified by Li-Da Lho to draw 16 bits and Multibyte strings - * * Interface changed: add "GdkFont *font" to specify font or fontset explicitely */ void @@ -507,6 +505,7 @@ gdk_draw_text_wc (GdkDrawable *drawable, GdkGCPrivate *gc_private; gint i; wchar_t *wcstr; + guchar *str; g_return_if_fail (drawable != NULL); g_return_if_fail (font != NULL); @@ -537,12 +536,26 @@ gdk_draw_text_wc (GdkDrawable *drawable, if ((oldfont = SelectObject (hdc, xfont)) == NULL) g_warning ("gdk_draw_text: SelectObject failed"); +#if 0 /* No. Don't use TextOutW. Compare to the X11 version, + * it uses plain XDrawString for GDK_FONT_FONT fonts, too. + * TextOutW by definition interprets the string as Unicode. + * We don't have that, but either chars from some single-byte codepage + * or from a DBCS. + */ wcstr = g_new (wchar_t, text_length); for (i = 0; i < text_length; i++) wcstr[i] = text[i]; if (!TextOutW (hdc, x, y, wcstr, text_length)) g_warning ("gdk_draw_text: TextOutW failed"); g_free (wcstr); +#else + str = g_new (guchar, text_length); + for (i=0; i<text_length; i++) + str[i] = text[i]; + if (!TextOutA (hdc, x, y, str, text_length)) + g_warning ("gdk_draw_text: TextOutA failed"); + g_free (str); +#endif SelectObject (hdc, oldfont); gdk_gc_postdraw (drawable_private, gc_private); } diff --git a/gdk/win32/gdkdrawable-win32.c b/gdk/win32/gdkdrawable-win32.c index 34b7a8cba8..8006e1e864 100644 --- a/gdk/win32/gdkdrawable-win32.c +++ b/gdk/win32/gdkdrawable-win32.c @@ -438,8 +438,6 @@ gdk_draw_string (GdkDrawable *drawable, /* gdk_draw_text * - * Modified by Li-Da Lho to draw 16 bits and Multibyte strings - * * Interface changed: add "GdkFont *font" to specify font or fontset explicitely */ void @@ -507,6 +505,7 @@ gdk_draw_text_wc (GdkDrawable *drawable, GdkGCPrivate *gc_private; gint i; wchar_t *wcstr; + guchar *str; g_return_if_fail (drawable != NULL); g_return_if_fail (font != NULL); @@ -537,12 +536,26 @@ gdk_draw_text_wc (GdkDrawable *drawable, if ((oldfont = SelectObject (hdc, xfont)) == NULL) g_warning ("gdk_draw_text: SelectObject failed"); +#if 0 /* No. Don't use TextOutW. Compare to the X11 version, + * it uses plain XDrawString for GDK_FONT_FONT fonts, too. + * TextOutW by definition interprets the string as Unicode. + * We don't have that, but either chars from some single-byte codepage + * or from a DBCS. + */ wcstr = g_new (wchar_t, text_length); for (i = 0; i < text_length; i++) wcstr[i] = text[i]; if (!TextOutW (hdc, x, y, wcstr, text_length)) g_warning ("gdk_draw_text: TextOutW failed"); g_free (wcstr); +#else + str = g_new (guchar, text_length); + for (i=0; i<text_length; i++) + str[i] = text[i]; + if (!TextOutA (hdc, x, y, str, text_length)) + g_warning ("gdk_draw_text: TextOutA failed"); + g_free (str); +#endif SelectObject (hdc, oldfont); gdk_gc_postdraw (drawable_private, gc_private); } diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index 653e62ba79..53097d20b7 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -2898,7 +2898,8 @@ gdk_events_queue (void) while (!gdk_event_queue_find_first() && PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { - GDK_NOTE (EVENTS, g_print ("gdk_events_queue: got event\n")); + GDK_NOTE (EVENTS, g_print ("gdk_events_queue: PeekMessage: %#x\n", + msg.message)); TranslateMessage (&msg); event = gdk_event_new (); diff --git a/gdk/win32/gdkevents.c b/gdk/win32/gdkevents.c index 653e62ba79..53097d20b7 100644 --- a/gdk/win32/gdkevents.c +++ b/gdk/win32/gdkevents.c @@ -2898,7 +2898,8 @@ gdk_events_queue (void) while (!gdk_event_queue_find_first() && PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { - GDK_NOTE (EVENTS, g_print ("gdk_events_queue: got event\n")); + GDK_NOTE (EVENTS, g_print ("gdk_events_queue: PeekMessage: %#x\n", + msg.message)); TranslateMessage (&msg); event = gdk_event_new (); diff --git a/gdk/win32/gdkfont-win32.c b/gdk/win32/gdkfont-win32.c index 77aa8c703a..9c2649eded 100644 --- a/gdk/win32/gdkfont-win32.c +++ b/gdk/win32/gdkfont-win32.c @@ -32,11 +32,69 @@ #include "gdkfont.h" #include "gdkprivate.h" +static GHashTable *font_name_hash = NULL; +static GHashTable *fontset_name_hash = NULL; + +static void +gdk_font_hash_insert (GdkFontType type, GdkFont *font, const gchar *font_name) +{ + GdkFontPrivate *private = (GdkFontPrivate *)font; + GHashTable **hashp = (type == GDK_FONT_FONT) ? + &font_name_hash : &fontset_name_hash; + + if (!*hashp) + *hashp = g_hash_table_new (g_str_hash, g_str_equal); + + private->names = g_slist_prepend (private->names, g_strdup (font_name)); + g_hash_table_insert (*hashp, private->names->data, font); +} + +static void +gdk_font_hash_remove (GdkFontType type, GdkFont *font) +{ + GdkFontPrivate *private = (GdkFontPrivate *)font; + GSList *tmp_list; + GHashTable *hash = (type == GDK_FONT_FONT) ? + font_name_hash : fontset_name_hash; + + tmp_list = private->names; + while (tmp_list) + { + g_hash_table_remove (hash, tmp_list->data); + g_free (tmp_list->data); + + tmp_list = tmp_list->next; + } + + g_slist_free (private->names); + private->names = NULL; +} + +static GdkFont * +gdk_font_hash_lookup (GdkFontType type, const gchar *font_name) +{ + GdkFont *result; + GHashTable *hash = (type == GDK_FONT_FONT) ? + font_name_hash : fontset_name_hash; + + if (!hash) + return NULL; + else + { + result = g_hash_table_lookup (hash, font_name); + if (result) + gdk_font_ref (result); + + return result; + } +} + GdkFont* gdk_font_load (const gchar *font_name) { GdkFont *font; GdkFontPrivate *private; + HFONT hfont; LOGFONT logfont; HGDIOBJ oldfont; TEXTMETRIC textmetric; @@ -56,8 +114,11 @@ gdk_font_load (const gchar *font_name) g_return_val_if_fail (font_name != NULL, NULL); - private = g_new (GdkFontPrivate, 1); - font = (GdkFont*) private; + GDK_NOTE (MISC, g_print ("gdk_font_load: %s\n", font_name)); + + font = gdk_font_hash_lookup (GDK_FONT_FONT, font_name); + if (font) + return font; numfields = sscanf (font_name, "-%30[^-]-%100[^-]-%30[^-]-%30[^-]-%30[^-]-%n", @@ -152,9 +213,13 @@ gdk_font_load (const gchar *font_name) fnWeight = FW_THIN; else if (g_strcasecmp (weight, "extralight") == 0) fnWeight = FW_EXTRALIGHT; -#ifdef FW_ULTRALIGHT else if (g_strcasecmp (weight, "ultralight") == 0) +#ifdef FW_ULTRALIGHT fnWeight = FW_ULTRALIGHT; +#else + fnWeight = FW_EXTRALIGHT; /* In fact, FW_ULTRALIGHT really is + * defined as FW_EXTRALIGHT anyway. + */ #endif else if (g_strcasecmp (weight, "light") == 0) fnWeight = FW_LIGHT; @@ -166,23 +231,29 @@ gdk_font_load (const gchar *font_name) fnWeight = FW_MEDIUM; else if (g_strcasecmp (weight, "semibold") == 0) fnWeight = FW_SEMIBOLD; -#ifdef FW_DEMIBOLD else if (g_strcasecmp (weight, "demibold") == 0) +#ifdef FW_DEMIBOLD fnWeight = FW_DEMIBOLD; +#else + fnWeight = FW_SEMIBOLD; /* As above */ #endif else if (g_strcasecmp (weight, "bold") == 0) fnWeight = FW_BOLD; else if (g_strcasecmp (weight, "extrabold") == 0) fnWeight = FW_EXTRABOLD; -#ifdef FW_ULTRABOLD else if (g_strcasecmp (weight, "ultrabold") == 0) +#ifdef FW_ULTRABOLD fnWeight = FW_ULTRABOLD; +#else + fnWeight = FW_EXTRABOLD; /* As above */ #endif else if (g_strcasecmp (weight, "heavy") == 0) fnWeight = FW_HEAVY; -#ifdef FW_BLACK else if (g_strcasecmp (weight, "black") == 0) +#ifdef FW_BLACK fnWeight = FW_BLACK; +#else + fnWeight = FW_HEAVY; /* As above */ #endif else fnWeight = FW_DONTCARE; @@ -250,12 +321,15 @@ gdk_font_load (const gchar *font_name) for (tries = 0; ; tries++) { - GDK_NOTE (MISC, g_print ("gdk_font_load: trying CreateFont(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%#.02x,\"%s\")\n", + GDK_NOTE (MISC, g_print ("...trying CreateFont(%d,%d,%d,%d," + "%d,%d,%d,%d," + "%d,%d,%d," + "%d,%#.02x,\"%s\")\n", nHeight, nWidth, nEscapement, nOrientation, fnWeight, fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily, lpszFace)); - if ((private->xfont = + if ((hfont = CreateFont (nHeight, nWidth, nEscapement, nOrientation, fnWeight, fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, fdwOutputPrecision, fdwClipPrecision, @@ -308,14 +382,15 @@ gdk_font_load (const gchar *font_name) tries++; } - if (!private->xfont) - { - g_warning ("gdk_font_load: font %s not found", font_name); - g_free (font); - return NULL; - } + if (!hfont) + return NULL; + private = g_new (GdkFontPrivate, 1); + font = (GdkFont*) private; + + private->xfont = hfont; private->ref_count = 1; + private->names = NULL; font->type = GDK_FONT_FONT; GetObject (private->xfont, sizeof (logfont), &logfont); oldfont = SelectObject (gdk_DC, private->xfont); @@ -324,15 +399,16 @@ gdk_font_load (const gchar *font_name) font->ascent = textmetric.tmAscent; font->descent = textmetric.tmDescent; - GDK_NOTE (MISC, g_print ("gdk_font_load: %s = %#x asc %d desc %d\n", - font_name, private->xfont, - font->ascent, font->descent)); + GDK_NOTE (MISC, g_print ("... = %#x asc %d desc %d\n", + private->xfont, font->ascent, font->descent)); /* This memory is leaked, so shoot me. */ f = g_new (HANDLE, 1); *f = (HANDLE) ((guint) private->xfont + HFONT_DITHER); gdk_xid_table_insert (f, font); + gdk_font_hash_insert (GDK_FONT_FONT, font, font_name); + return font; } @@ -340,6 +416,7 @@ GdkFont* gdk_fontset_load (gchar *fontset_name) { g_warning ("gdk_fontset_load: Not implemented"); + return NULL; } @@ -359,14 +436,16 @@ void gdk_font_unref (GdkFont *font) { GdkFontPrivate *private; + private = (GdkFontPrivate*) font; g_return_if_fail (font != NULL); - - private = (GdkFontPrivate*) font; + g_return_if_fail (private->ref_count > 0); private->ref_count -= 1; if (private->ref_count == 0) { + gdk_font_hash_remove (font->type, font); + switch (font->type) { case GDK_FONT_FONT: @@ -465,6 +544,7 @@ gdk_text_width_wc (GdkFont *font, HGDIOBJ oldfont; SIZE size; wchar_t *wcstr; + guchar *str; gint i, width; g_return_val_if_fail (font != NULL, -1); @@ -475,12 +555,22 @@ gdk_text_width_wc (GdkFont *font, switch (font->type) { case GDK_FONT_FONT: + oldfont = SelectObject (gdk_DC, private->xfont); +#if 0 /* No. Don't assume Unicode here either. + * (Read the comments in gdk_draw_text_wc.) + */ wcstr = g_new (wchar_t, text_length); for (i = 0; i < text_length; i++) wcstr[i] = text[i]; - oldfont = SelectObject (gdk_DC, private->xfont); GetTextExtentPoint32W (gdk_DC, wcstr, text_length, &size); g_free (wcstr); +#else + str = g_new (guchar, text_length); + for (i=0; i<text_length; i++) + str[i] = text[i]; + GetTextExtentPoint32A (gdk_DC, str, text_length, &size); + g_free (str); +#endif SelectObject (gdk_DC, oldfont); width = size.cx; break; @@ -654,8 +744,6 @@ gint gdk_char_measure (GdkFont *font, gchar character) { - g_return_val_if_fail (font != NULL, -1); - return gdk_text_measure (font, &character, 1); } @@ -703,7 +791,5 @@ gint gdk_char_height (GdkFont *font, gchar character) { - g_return_val_if_fail (font != NULL, -1); - return gdk_text_height (font, &character, 1); } diff --git a/gdk/win32/gdkfont.c b/gdk/win32/gdkfont.c index 77aa8c703a..9c2649eded 100644 --- a/gdk/win32/gdkfont.c +++ b/gdk/win32/gdkfont.c @@ -32,11 +32,69 @@ #include "gdkfont.h" #include "gdkprivate.h" +static GHashTable *font_name_hash = NULL; +static GHashTable *fontset_name_hash = NULL; + +static void +gdk_font_hash_insert (GdkFontType type, GdkFont *font, const gchar *font_name) +{ + GdkFontPrivate *private = (GdkFontPrivate *)font; + GHashTable **hashp = (type == GDK_FONT_FONT) ? + &font_name_hash : &fontset_name_hash; + + if (!*hashp) + *hashp = g_hash_table_new (g_str_hash, g_str_equal); + + private->names = g_slist_prepend (private->names, g_strdup (font_name)); + g_hash_table_insert (*hashp, private->names->data, font); +} + +static void +gdk_font_hash_remove (GdkFontType type, GdkFont *font) +{ + GdkFontPrivate *private = (GdkFontPrivate *)font; + GSList *tmp_list; + GHashTable *hash = (type == GDK_FONT_FONT) ? + font_name_hash : fontset_name_hash; + + tmp_list = private->names; + while (tmp_list) + { + g_hash_table_remove (hash, tmp_list->data); + g_free (tmp_list->data); + + tmp_list = tmp_list->next; + } + + g_slist_free (private->names); + private->names = NULL; +} + +static GdkFont * +gdk_font_hash_lookup (GdkFontType type, const gchar *font_name) +{ + GdkFont *result; + GHashTable *hash = (type == GDK_FONT_FONT) ? + font_name_hash : fontset_name_hash; + + if (!hash) + return NULL; + else + { + result = g_hash_table_lookup (hash, font_name); + if (result) + gdk_font_ref (result); + + return result; + } +} + GdkFont* gdk_font_load (const gchar *font_name) { GdkFont *font; GdkFontPrivate *private; + HFONT hfont; LOGFONT logfont; HGDIOBJ oldfont; TEXTMETRIC textmetric; @@ -56,8 +114,11 @@ gdk_font_load (const gchar *font_name) g_return_val_if_fail (font_name != NULL, NULL); - private = g_new (GdkFontPrivate, 1); - font = (GdkFont*) private; + GDK_NOTE (MISC, g_print ("gdk_font_load: %s\n", font_name)); + + font = gdk_font_hash_lookup (GDK_FONT_FONT, font_name); + if (font) + return font; numfields = sscanf (font_name, "-%30[^-]-%100[^-]-%30[^-]-%30[^-]-%30[^-]-%n", @@ -152,9 +213,13 @@ gdk_font_load (const gchar *font_name) fnWeight = FW_THIN; else if (g_strcasecmp (weight, "extralight") == 0) fnWeight = FW_EXTRALIGHT; -#ifdef FW_ULTRALIGHT else if (g_strcasecmp (weight, "ultralight") == 0) +#ifdef FW_ULTRALIGHT fnWeight = FW_ULTRALIGHT; +#else + fnWeight = FW_EXTRALIGHT; /* In fact, FW_ULTRALIGHT really is + * defined as FW_EXTRALIGHT anyway. + */ #endif else if (g_strcasecmp (weight, "light") == 0) fnWeight = FW_LIGHT; @@ -166,23 +231,29 @@ gdk_font_load (const gchar *font_name) fnWeight = FW_MEDIUM; else if (g_strcasecmp (weight, "semibold") == 0) fnWeight = FW_SEMIBOLD; -#ifdef FW_DEMIBOLD else if (g_strcasecmp (weight, "demibold") == 0) +#ifdef FW_DEMIBOLD fnWeight = FW_DEMIBOLD; +#else + fnWeight = FW_SEMIBOLD; /* As above */ #endif else if (g_strcasecmp (weight, "bold") == 0) fnWeight = FW_BOLD; else if (g_strcasecmp (weight, "extrabold") == 0) fnWeight = FW_EXTRABOLD; -#ifdef FW_ULTRABOLD else if (g_strcasecmp (weight, "ultrabold") == 0) +#ifdef FW_ULTRABOLD fnWeight = FW_ULTRABOLD; +#else + fnWeight = FW_EXTRABOLD; /* As above */ #endif else if (g_strcasecmp (weight, "heavy") == 0) fnWeight = FW_HEAVY; -#ifdef FW_BLACK else if (g_strcasecmp (weight, "black") == 0) +#ifdef FW_BLACK fnWeight = FW_BLACK; +#else + fnWeight = FW_HEAVY; /* As above */ #endif else fnWeight = FW_DONTCARE; @@ -250,12 +321,15 @@ gdk_font_load (const gchar *font_name) for (tries = 0; ; tries++) { - GDK_NOTE (MISC, g_print ("gdk_font_load: trying CreateFont(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%#.02x,\"%s\")\n", + GDK_NOTE (MISC, g_print ("...trying CreateFont(%d,%d,%d,%d," + "%d,%d,%d,%d," + "%d,%d,%d," + "%d,%#.02x,\"%s\")\n", nHeight, nWidth, nEscapement, nOrientation, fnWeight, fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily, lpszFace)); - if ((private->xfont = + if ((hfont = CreateFont (nHeight, nWidth, nEscapement, nOrientation, fnWeight, fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, fdwOutputPrecision, fdwClipPrecision, @@ -308,14 +382,15 @@ gdk_font_load (const gchar *font_name) tries++; } - if (!private->xfont) - { - g_warning ("gdk_font_load: font %s not found", font_name); - g_free (font); - return NULL; - } + if (!hfont) + return NULL; + private = g_new (GdkFontPrivate, 1); + font = (GdkFont*) private; + + private->xfont = hfont; private->ref_count = 1; + private->names = NULL; font->type = GDK_FONT_FONT; GetObject (private->xfont, sizeof (logfont), &logfont); oldfont = SelectObject (gdk_DC, private->xfont); @@ -324,15 +399,16 @@ gdk_font_load (const gchar *font_name) font->ascent = textmetric.tmAscent; font->descent = textmetric.tmDescent; - GDK_NOTE (MISC, g_print ("gdk_font_load: %s = %#x asc %d desc %d\n", - font_name, private->xfont, - font->ascent, font->descent)); + GDK_NOTE (MISC, g_print ("... = %#x asc %d desc %d\n", + private->xfont, font->ascent, font->descent)); /* This memory is leaked, so shoot me. */ f = g_new (HANDLE, 1); *f = (HANDLE) ((guint) private->xfont + HFONT_DITHER); gdk_xid_table_insert (f, font); + gdk_font_hash_insert (GDK_FONT_FONT, font, font_name); + return font; } @@ -340,6 +416,7 @@ GdkFont* gdk_fontset_load (gchar *fontset_name) { g_warning ("gdk_fontset_load: Not implemented"); + return NULL; } @@ -359,14 +436,16 @@ void gdk_font_unref (GdkFont *font) { GdkFontPrivate *private; + private = (GdkFontPrivate*) font; g_return_if_fail (font != NULL); - - private = (GdkFontPrivate*) font; + g_return_if_fail (private->ref_count > 0); private->ref_count -= 1; if (private->ref_count == 0) { + gdk_font_hash_remove (font->type, font); + switch (font->type) { case GDK_FONT_FONT: @@ -465,6 +544,7 @@ gdk_text_width_wc (GdkFont *font, HGDIOBJ oldfont; SIZE size; wchar_t *wcstr; + guchar *str; gint i, width; g_return_val_if_fail (font != NULL, -1); @@ -475,12 +555,22 @@ gdk_text_width_wc (GdkFont *font, switch (font->type) { case GDK_FONT_FONT: + oldfont = SelectObject (gdk_DC, private->xfont); +#if 0 /* No. Don't assume Unicode here either. + * (Read the comments in gdk_draw_text_wc.) + */ wcstr = g_new (wchar_t, text_length); for (i = 0; i < text_length; i++) wcstr[i] = text[i]; - oldfont = SelectObject (gdk_DC, private->xfont); GetTextExtentPoint32W (gdk_DC, wcstr, text_length, &size); g_free (wcstr); +#else + str = g_new (guchar, text_length); + for (i=0; i<text_length; i++) + str[i] = text[i]; + GetTextExtentPoint32A (gdk_DC, str, text_length, &size); + g_free (str); +#endif SelectObject (gdk_DC, oldfont); width = size.cx; break; @@ -654,8 +744,6 @@ gint gdk_char_measure (GdkFont *font, gchar character) { - g_return_val_if_fail (font != NULL, -1); - return gdk_text_measure (font, &character, 1); } @@ -703,7 +791,5 @@ gint gdk_char_height (GdkFont *font, gchar character) { - g_return_val_if_fail (font != NULL, -1); - return gdk_text_height (font, &character, 1); } diff --git a/gdk/win32/gdkprivate-win32.h b/gdk/win32/gdkprivate-win32.h index a35bd703b0..5df4fe7358 100644 --- a/gdk/win32/gdkprivate-win32.h +++ b/gdk/win32/gdkprivate-win32.h @@ -296,11 +296,10 @@ struct _GdkVisualPrivate struct _GdkFontPrivate { GdkFont font; - /* XFontStruct *xfont; */ - /* generic pointer point to XFontStruct or XFontSet */ - /* in Win32 a HFONT */ - gpointer xfont; + HFONT xfont; guint ref_count; + + GSList *names; }; struct _GdkCursorPrivate diff --git a/gdk/win32/gdkprivate.h b/gdk/win32/gdkprivate.h index a35bd703b0..5df4fe7358 100644 --- a/gdk/win32/gdkprivate.h +++ b/gdk/win32/gdkprivate.h @@ -296,11 +296,10 @@ struct _GdkVisualPrivate struct _GdkFontPrivate { GdkFont font; - /* XFontStruct *xfont; */ - /* generic pointer point to XFontStruct or XFontSet */ - /* in Win32 a HFONT */ - gpointer xfont; + HFONT xfont; guint ref_count; + + GSList *names; }; struct _GdkCursorPrivate diff --git a/gtk/makefile.cygwin b/gtk/makefile.cygwin index de6092a762..cbfa12b40e 100644 --- a/gtk/makefile.cygwin +++ b/gtk/makefile.cygwin @@ -339,10 +339,15 @@ gtkmarshal.h gtkmarshal.c : gtkmarshal.list genmarshal.pl gtk-$(GTK_VER).dll : generated $(gtk_OBJECTS) gtk.def $(GLIB)/build-dll gtk $(GTK_VER) gtk.def $(gtk_OBJECTS) -L $(GDKSYSDEP) -lgdk-$(GTK_VER) -L$(INTL) -lgnu-intl -L $(GLIB) -lglib-$(GLIB_VER) -lgmodule-$(GLIB_VER) -lgdi32 -luser32 +.SUFFIXES: .c .o .i + # General rule for compiling the objects into the DLL .c.o : $(CC) $(CFLAGS) -c -DGTK_COMPILATION -DG_LOG_DOMAIN=\"Gtk\" $< +.c.i : + $(CC) $(CFLAGS) -E -DGDK_COMPILATION -DG_LOG_DOMAIN=\"Gdk\" $< >$@ + # # Test programs: # |