#include #include /* gcc -o t pango123425.c `pkg-config --cflags --libs gtk+-2.0` */ gboolean expose (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { GdkGC* gc = gdk_gc_new (event->window); PangoLayout* layout = pango_layout_new (gtk_widget_get_pango_context (widget)); GtkStyle* style = gtk_widget_get_style (widget); GdkRegion* rgn; GdkColor bg = style->base[GTK_STATE_SELECTED]; GdkColor fg = style->text[GTK_STATE_SELECTED]; int indices[2] = {1, 6}; int width; int padding = 10; int layoutWidth, layoutHeight; const char* string = "Felips"; GdkRectangle gdkRect; PangoFontDescription* font = pango_font_description_new(); pango_font_description_set_family(font, "Tahoma"); pango_font_description_set_size(font, 16 * PANGO_SCALE); pango_layout_set_text(layout, string, -1); pango_layout_set_font_description(layout, font); gdk_draw_layout(event->window, gc, padding, padding, layout); pango_layout_get_size(layout, &layoutWidth, &layoutHeight); printf("%i %i\n", layoutWidth, layoutHeight); layoutWidth = PANGO_PIXELS(layoutWidth); layoutHeight = PANGO_PIXELS(layoutHeight); printf("%i %i\n", layoutWidth, layoutHeight); width = widget->allocation.width - padding * 2 - layoutWidth; gdk_gc_set_foreground(gc, &bg); gdk_draw_rectangle(event->window, gc, 1, padding + layoutWidth, padding, width, layoutHeight); rgn = gdk_pango_layout_get_clip_region (layout, padding, padding, indices, 1); gdk_gc_set_clip_region(gc, rgn); gdk_region_get_clipbox(rgn, &gdkRect); printf("clip: %i %i %i %i\n", gdkRect.x, gdkRect.y, gdkRect.width, gdkRect.height); gdk_region_destroy(rgn); gdk_draw_layout_with_colors(event->window, gc, padding, padding, layout, &fg, &bg); g_object_unref(layout); pango_font_description_free(font); gdk_gc_unref (gc); printf ("GTK version %i.%i.%i\n", gtk_major_version, gtk_minor_version, gtk_micro_version); return 0; } int main (int argc, char** argv) { GtkWidget *shell, *drawingArea; fpu_control_t fpu_control; /* Feature: Cairo and Java don't get along. * * For some reason the java vm sets the FPU to double mode, * When running in double mode cairo (used by pango 1.10.2) * loses precision and trunc value down. * remove the following 4 lines of code and it all works fine. */ _FPU_GETCW (fpu_control); fpu_control &= ~_FPU_EXTENDED; fpu_control |= _FPU_DOUBLE; _FPU_SETCW (fpu_control); gtk_init_check (&argc, &argv); shell = gtk_window_new (GTK_WINDOW_TOPLEVEL); drawingArea = gtk_fixed_new (); gtk_fixed_set_has_window (GTK_FIXED(drawingArea), 1); gtk_container_add (GTK_CONTAINER (shell), drawingArea); g_signal_connect (G_OBJECT (drawingArea), "expose-event", G_CALLBACK (expose), NULL); g_signal_connect (G_OBJECT (shell), "destroy", G_CALLBACK (gtk_main_quit), NULL); g_signal_connect (G_OBJECT (shell), "delete_event",G_CALLBACK (gtk_main_quit), NULL); gtk_window_set_default_size (GTK_WINDOW (shell), 280, 240); gtk_widget_show_all (shell); gtk_main(); }