diff --git a/vfs-methods/fontilus/ChangeLog b/vfs-methods/fontilus/ChangeLog index c065ac539..f9473d4dc 100644 --- a/vfs-methods/fontilus/ChangeLog +++ b/vfs-methods/fontilus/ChangeLog @@ -1,3 +1,9 @@ +2002-12-05 James Henstridge + + * src/font-view.c (main): change so that it renders the text at a + number of different sizes, like fontcarton did. Need to show some + info about the font too ... + 2002-12-04 James Henstridge * src/font-view.c (main): get font to render correctly. Things diff --git a/vfs-methods/fontilus/font-view.c b/vfs-methods/fontilus/font-view.c index 8a4922d85..d002c4a3e 100644 --- a/vfs-methods/fontilus/font-view.c +++ b/vfs-methods/fontilus/font-view.c @@ -5,40 +5,87 @@ #include #include -static XftFont *font; -static XftDraw *draw = NULL; -static XftColor colour; - FT_Error FT_New_Face_From_URI(FT_Library library, const gchar *uri, FT_Long face_index, FT_Face *aface); -static void -realize(GtkWidget *widget) +/* height is a little more than needed to display all sizes */ +#define FONTAREA_WIDTH 500 +#define FONTAREA_HEIGHT 236 + +static GdkPixmap * +create_text_pixmap(GtkWidget *drawing_area, FT_Face face) { + static const gint sizes[] = { 8, 10, 12, 18, 24, 36, 48, 72 }; + gint i, pos_y, textlen; + GdkPixmap *pixmap; + gchar *text; + Display *xdisplay; Drawable xdrawable; Visual *xvisual; Colormap xcolormap; + XftDraw *draw; + XftColor colour; - xdisplay = GDK_WINDOW_XDISPLAY(widget->window); - xdrawable = GDK_DRAWABLE_XID(widget->window); - xvisual = GDK_VISUAL_XVISUAL(gdk_drawable_get_visual(widget->window)); - xcolormap = GDK_COLORMAP_XCOLORMAP(gdk_drawable_get_colormap(widget->window)); + text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + textlen = strlen(text); + + /* create pixmap */ + gtk_widget_set_size_request(drawing_area, FONTAREA_WIDTH, FONTAREA_HEIGHT); + gtk_widget_realize(drawing_area); + pixmap = gdk_pixmap_new(drawing_area->window, + FONTAREA_WIDTH, FONTAREA_HEIGHT, -1); + if (!pixmap) + return NULL; + gdk_draw_rectangle(pixmap, drawing_area->style->white_gc, + TRUE, 0, 0, FONTAREA_WIDTH, FONTAREA_HEIGHT); + + /* create the XftDraw */ + xdisplay = GDK_PIXMAP_XDISPLAY(pixmap); + xdrawable = GDK_DRAWABLE_XID(pixmap); + xvisual = GDK_VISUAL_XVISUAL(gdk_drawable_get_visual(pixmap)); + xcolormap = GDK_COLORMAP_XCOLORMAP(gdk_drawable_get_colormap(pixmap)); draw = XftDrawCreate(xdisplay, xdrawable, xvisual, xcolormap); - if (!draw) { - g_warning("could not create Xft drawable"); - return; - } XftColorAllocName(xdisplay, xvisual, xcolormap, "black", &colour); + + pos_y = 4; + for (i = 0; i < G_N_ELEMENTS(sizes); i++) { + FcPattern *pattern; + XftFont *font; + + pattern = FcPatternBuild(NULL, + FC_FT_FACE, FcTypeFTFace, face, + FC_PIXEL_SIZE, FcTypeDouble, (double)sizes[i], + NULL); + font = XftFontOpenPattern(xdisplay, pattern); + FcPatternDestroy(pattern); + if (!font) { + g_printerr("could not load Xft face\n"); + goto endloop; + } + XftDrawString8(draw, &colour, font, 5, pos_y + font->ascent, + text, textlen); + XftFontClose(xdisplay, font); + endloop: + pos_y += sizes[i]; + } + + return pixmap; } static gboolean -expose_event(GtkWidget *widget, GdkEventExpose *event) +expose_event(GtkWidget *widget, GdkEventExpose *event, GdkPixmap *pixmap) { - XftDrawString8(draw, &colour, font, 50, 50, "Foo bar", 7); + gdk_draw_drawable(widget->window, + widget->style->fg_gc[GTK_WIDGET_STATE (widget)], + pixmap, + event->area.x, event->area.y, + event->area.x, event->area.y, + event->area.width, event->area.height); + return FALSE; } int @@ -47,9 +94,10 @@ main(int argc, char **argv) FT_Error error; FT_Library library; FT_Face face; - FcPattern *pattern; + gchar *title; GtkWidget *window; GtkWidget *drawing_area; + GdkPixmap *pixmap; GdkColor white = { 0, 0xffff, 0xffff, 0xffff }; gtk_init(&argc, &argv); @@ -81,29 +129,23 @@ main(int argc, char **argv) return 1; } - pattern = FcPatternBuild(NULL, - FC_FT_FACE, FcTypeFTFace, face, - FC_PIXEL_SIZE, FcTypeDouble, 48.0, - NULL); - font = XftFontOpenPattern(GDK_DISPLAY(), pattern); - if (!font) { - g_printerr("could not load Xft face\n"); - return 1; - } - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_title(GTK_WINDOW(window), "Foo"); + title = g_strconcat(face->family_name, + face->style_name ? ", " : "", + face->style_name, NULL); + gtk_window_set_title(GTK_WINDOW(window), title); + g_free(title); + gtk_window_set_resizable(GTK_WINDOW(window), FALSE); drawing_area = gtk_drawing_area_new(); gtk_widget_modify_bg(drawing_area, GTK_STATE_NORMAL, &white); gtk_widget_set_double_buffered(drawing_area, FALSE); - gtk_widget_set_size_request(drawing_area, 300, 300); gtk_container_add(GTK_CONTAINER(window), drawing_area); - g_signal_connect_after(drawing_area, "realize", - G_CALLBACK(realize), NULL); + pixmap = create_text_pixmap(drawing_area, face); + g_signal_connect(drawing_area, "expose_event", - G_CALLBACK(expose_event), NULL); + G_CALLBACK(expose_event), pixmap); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window);