void iupdrvDrawText(IdrawCanvas* dc, const char* text, int len, int x, int y, unsigned char r, unsigned char g, unsigned char b, const char* font) { PangoLayout* fontlayout = (PangoLayout*)iupgtkGetPangoLayout(font); GdkColor color; iupgdkColorSet(&color, r, g, b); gdk_gc_set_rgb_fg_color(dc->pixmap_gc, &color); text = iupgtkStrConvertToSystemLen(text, &len); pango_layout_set_text(fontlayout, text, len); gdk_draw_layout(dc->pixmap, dc->pixmap_gc, x, y, fontlayout); }
void iupdrvDrawText(IdrawCanvas* dc, const char* text, int len, int x, int y, int w, int h, long color, const char* font, int flags, double text_orientation) { PangoLayout* fontlayout = (PangoLayout*)iupgtkGetPangoLayout(font); PangoAlignment alignment = PANGO_ALIGN_LEFT; GdkColor c; PangoContext* fontcontext = NULL; int layout_w = w, layout_h = h; int layout_center = flags & IUP_DRAW_LAYOUTCENTER; if (text_orientation && layout_center) iupDrawGetTextInnerBounds(w, h, text_orientation, &layout_w, &layout_h); iupgdkColorSet(&c, color); gdk_gc_set_rgb_fg_color(dc->pixmap_gc, &c); text = iupgtkStrConvertToSystemLen(text, &len); pango_layout_set_text(fontlayout, text, len); if (flags & IUP_DRAW_RIGHT) alignment = PANGO_ALIGN_RIGHT; else if (flags & IUP_DRAW_CENTER) alignment = PANGO_ALIGN_CENTER; if (flags & IUP_DRAW_WRAP) { pango_layout_set_width(fontlayout, iupGTK_PIXELS2PANGOUNITS(layout_w)); #ifdef PANGO_VERSION_CHECK #if PANGO_VERSION_CHECK(1,2,0) pango_layout_set_height(fontlayout, iupGTK_PIXELS2PANGOUNITS(layout_h)); #endif #endif } else if (flags & IUP_DRAW_ELLIPSIS) { pango_layout_set_width(fontlayout, iupGTK_PIXELS2PANGOUNITS(layout_w)); #ifdef PANGO_VERSION_CHECK #if PANGO_VERSION_CHECK(1,2,0) pango_layout_set_height(fontlayout, iupGTK_PIXELS2PANGOUNITS(layout_h)); #endif #endif pango_layout_set_ellipsize(fontlayout, PANGO_ELLIPSIZE_END); } pango_layout_set_alignment(fontlayout, alignment); if (flags & IUP_DRAW_CLIP) { GdkRectangle rect; rect.x = x; rect.y = y; rect.width = w; rect.height = h; gdk_gc_set_clip_rectangle(dc->pixmap_gc, &rect); } if (text_orientation) { PangoRectangle rect; PangoMatrix fontmatrix = PANGO_MATRIX_INIT; fontcontext = pango_layout_get_context(fontlayout); pango_matrix_rotate(&fontmatrix, text_orientation); pango_context_set_matrix(fontcontext, &fontmatrix); pango_layout_context_changed(fontlayout); pango_layout_get_pixel_extents(fontlayout, NULL, &rect); #ifdef PANGO_VERSION_CHECK #if PANGO_VERSION_CHECK(1,16,0) pango_matrix_transform_pixel_rectangle(&fontmatrix, &rect); #endif #endif /* Adjust the position considering the Pango rectangle transformed */ if (layout_center) { x += (w - rect.width) / 2; y += (h - rect.height) / 2; } else { x += (int)rect.x; y += (int)rect.y; } } gdk_draw_layout(dc->pixmap, dc->pixmap_gc, x, y, fontlayout); /* restore settings */ if ((flags & IUP_DRAW_WRAP) || (flags & IUP_DRAW_ELLIPSIS)) { pango_layout_set_width(fontlayout, -1); #ifdef PANGO_VERSION_CHECK #if PANGO_VERSION_CHECK(1,2,0) pango_layout_set_height(fontlayout, -1); #endif #endif } if (flags & IUP_DRAW_ELLIPSIS) pango_layout_set_ellipsize(fontlayout, PANGO_ELLIPSIZE_NONE); if (flags & IUP_DRAW_CLIP) gdk_gc_set_clip_region(dc->pixmap_gc, NULL); if (text_orientation) pango_context_set_matrix(fontcontext, NULL); }