void render_text(GdkDrawable *da, GdkGC *gc, int x, int y, double angle, const char *s, const char *font, double xalign, double yalign, int xmax, int ymax) { GdkScreen *screen; PangoRenderer *renderer; PangoContext *context; PangoLayout *layout; PangoFontDescription *desc; int width, height; PangoMatrix m = PANGO_MATRIX_INIT; double f_min, f; /* set up the renderer */ screen = gdk_drawable_get_screen(da); renderer = gdk_pango_renderer_get_default(screen); gdk_pango_renderer_set_drawable(GDK_PANGO_RENDERER(renderer), da); gdk_pango_renderer_set_gc(GDK_PANGO_RENDERER(renderer), gc); /* start preparing the layout */ context = gdk_pango_context_get_for_screen(screen); layout = pango_layout_new(context); pango_layout_set_text(layout, s, -1); /* apply the font */ desc = pango_font_description_from_string(font); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); /* align and position the text */ pango_layout_get_size(layout, &width, &height); f_min = 1.0; if (xmax) { f = xmax/((double) width/PANGO_SCALE); if (f < f_min) f_min = f; } if (ymax) { f = ymax/((double) height/PANGO_SCALE); if (f < f_min) f_min = f; } if (f_min < MIN_FONT_SCALE) f_min = MIN_FONT_SCALE; pango_matrix_translate(&m, x, y); pango_matrix_rotate(&m, angle); pango_matrix_translate(&m, -xalign*f_min*width/PANGO_SCALE, (yalign-1)*f_min*height/PANGO_SCALE); pango_matrix_scale(&m, f_min, f_min); pango_context_set_matrix(context, &m); pango_layout_context_changed(layout); pango_renderer_draw_layout(renderer, layout, 0, 0); /* clean up renderer */ gdk_pango_renderer_set_drawable(GDK_PANGO_RENDERER(renderer), NULL); gdk_pango_renderer_set_gc(GDK_PANGO_RENDERER(renderer), NULL); /* free objects */ g_object_unref(layout); g_object_unref(context); }
static VALUE rg_translate_bang(VALUE self, VALUE tx, VALUE ty) { pango_matrix_translate(_SELF(self), NUM2DBL(tx), NUM2DBL(ty)); return self; }