GDK 2.6, in its doubtless infinite wisdom, has decided that

gdk_font_from_description() will no longer even _try_ to return a
font matching the specified Pango font description; instead it will
return `fixed' no matter what you do. Therefore, I've had to switch
to using Pango proper for Puzzles text rendering, rather than just
using Pango for font selection.

[originally from svn r5936]
This commit is contained in:
Simon Tatham
2005-06-09 18:29:11 +00:00
parent 0747ab856b
commit a9d0f9ef35

71
gtk.c
View File

@ -21,6 +21,10 @@
#include "puzzles.h" #include "puzzles.h"
#if GTK_CHECK_VERSION(2,0,0)
#define USE_PANGO
#endif
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
* Error reporting functions used elsewhere. * Error reporting functions used elsewhere.
*/ */
@ -44,7 +48,11 @@ void fatal(char *fmt, ...)
*/ */
struct font { struct font {
#ifdef USE_PANGO
PangoFontDescription *desc;
#else
GdkFont *font; GdkFont *font;
#endif
int type; int type;
int size; int size;
}; };
@ -172,7 +180,7 @@ void draw_text(frontend *fe, int x, int y, int fonttype, int fontsize,
fe->fonts[i].type = fonttype; fe->fonts[i].type = fonttype;
fe->fonts[i].size = fontsize; fe->fonts[i].size = fontsize;
#if GTK_CHECK_VERSION(2,0,0) #ifdef USE_PANGO
/* /*
* Use Pango to find the closest match to the requested * Use Pango to find the closest match to the requested
* font. * font.
@ -210,24 +218,54 @@ void draw_text(frontend *fe, int x, int y, int fonttype, int fontsize,
pango_font_description_set_size(fd, resolution * fontsize); pango_font_description_set_size(fd, resolution * fontsize);
} }
#endif #endif
fe->fonts[i].font = gdk_font_from_description(fd); fe->fonts[i].desc = fd;
pango_font_description_free(fd);
} }
if (!fe->fonts[i].font) #else
/*
* In GTK 1.2, I don't know of any plausible way to
* pick a suitable font, so I'm just going to be
* tedious.
*/
fe->fonts[i].font = gdk_font_load(fonttype == FONT_FIXED ?
"fixed" : "variable");
#endif #endif
/*
* In GTK 1.2, I don't know of any plausible way to
* pick a suitable font, so I'm just going to be
* tedious.
*
* This is also fallback code called if the Pango
* approach fails to find an appropriate font.
*/
fe->fonts[i].font = gdk_font_load(fonttype == FONT_FIXED ?
"fixed" : "variable");
} }
/*
* Set the colour.
*/
gdk_gc_set_foreground(fe->gc, &fe->colours[colour]);
#ifdef USE_PANGO
{
PangoLayout *layout;
PangoRectangle rect;
/*
* Create a layout.
*/
layout = pango_layout_new(gtk_widget_get_pango_context(fe->area));
pango_layout_set_font_description(layout, fe->fonts[i].desc);
pango_layout_set_text(layout, text, strlen(text));
pango_layout_get_pixel_extents(layout, NULL, &rect);
if (align & ALIGN_VCENTRE)
rect.y -= rect.height / 2;
if (align & ALIGN_HCENTRE)
rect.x -= rect.width / 2;
else if (align & ALIGN_HRIGHT)
rect.x -= rect.width;
gdk_draw_layout(fe->pixmap, fe->gc, rect.x + x, rect.y + y, layout);
g_object_unref(layout);
}
#else
/* /*
* Find string dimensions and process alignment. * Find string dimensions and process alignment.
*/ */
@ -260,10 +298,11 @@ void draw_text(frontend *fe, int x, int y, int fonttype, int fontsize,
} }
/* /*
* Set colour and actually draw text. * Actually draw the text.
*/ */
gdk_gc_set_foreground(fe->gc, &fe->colours[colour]);
gdk_draw_string(fe->pixmap, fe->fonts[i].font, fe->gc, x, y, text); gdk_draw_string(fe->pixmap, fe->fonts[i].font, fe->gc, x, y, text);
#endif
} }
void draw_rect(frontend *fe, int x, int y, int w, int h, int colour) void draw_rect(frontend *fe, int x, int y, int w, int h, int colour)