mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 16:05:44 -07:00
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:
59
gtk.c
59
gtk.c
@ -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
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* In GTK 1.2, I don't know of any plausible way to
|
* In GTK 1.2, I don't know of any plausible way to
|
||||||
* pick a suitable font, so I'm just going to be
|
* pick a suitable font, so I'm just going to be
|
||||||
* tedious.
|
* 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 ?
|
fe->fonts[i].font = gdk_font_load(fonttype == FONT_FIXED ?
|
||||||
"fixed" : "variable");
|
"fixed" : "variable");
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
Reference in New Issue
Block a user