-int BC_WindowBase::wcharpos(const wchar_t *text, XftFont *font, int length,
- int *charpos)
-{
- XGlyphInfo extents;
-
- if(charpos)
- {
- int bpos = charpos[-1];
-
- for(int i = 0; i < length; i++)
- {
- XftTextExtents32(top_level->display,
- font,
- (const FcChar32*)text,
- i + 1,
- &extents);
- charpos[i] = extents.xOff + bpos;
- }
- return charpos[length - 1] - bpos;
- }
- else
- {
- XftTextExtents32(top_level->display,
- font,
- (const FcChar32*)text,
- length,
- &extents);
- return extents.xOff;
+void BC_WindowBase::xft_draw_string(XftColor *xft_color, XftFont *xft_font,
+ int x, int y, const FcChar32 *fc, int len, BC_Pixmap *pixmap)
+{ BT
+ 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);