+ Pixmap draw_pixmap = 0;
+ XftDraw *xft_draw = (XftDraw *)
+ (pixmap ? pixmap->opaque_xft_draw : this->pixmap->opaque_xft_draw);
+ int src_x = x, src_y = y, src_w = 0, src_h = 0;
+ XGCValues values;
+ XGetGCValues(top_level->display, top_level->gc, GCFunction, &values);
+ if( values.function != GXcopy ) {
+ XSetFunction(top_level->display, top_level->gc, GXcopy);
+ XGlyphInfo info;
+ XftTextExtents32(top_level->display, xft_font, fc, len, &info);
+ src_w = info.width; src_h = info.height;
+ draw_pixmap = XCreatePixmap(top_level->display, top_level->win,
+ src_w, src_h, top_level->default_depth);
+ int color = get_color(); set_color(0);
+ XFillRectangle(top_level->display, draw_pixmap, top_level->gc, 0, 0, src_w, src_h);
+ set_color(color);
+ xft_draw = XftDrawCreate(top_level->display, draw_pixmap,
+ top_level->vis, top_level->cmap);
+ src_x = info.x; src_y = info.y;
+ }
+ XftDrawString32(xft_draw, xft_color, xft_font, src_x, src_y, fc, len);
+ if( values.function != GXcopy ) {
+ XSetFunction(top_level->display, top_level->gc, values.function);
+ Pixmap xpixmap = pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap;
+ XCopyArea(top_level->display, draw_pixmap, xpixmap,
+ top_level->gc, 0, 0, src_w, src_h, x, y);
+ XFreePixmap(top_level->display, draw_pixmap);
+ XftDrawDestroy(xft_draw);