--- rxvt-unicode/src/rxvtfont.C 2007/08/03 22:40:10 1.110 +++ rxvt-unicode/src/rxvtfont.C 2007/09/12 19:51:41 1.118 @@ -1274,14 +1274,15 @@ int w = term->fwidth * len; int h = term->fheight; - bool buffered = bg >= 0 // we don't use a transparent bg -#ifndef FORCE_UNBUFFERED_XFT -# ifdef ENABLE_TRANSPARENCY - || !term->am_transparent // we aren't transparent -# endif + /* TODO: this logic needs some more thinking, since we no longer do pseudo-transparency. + * Maybe make buffering into a resource flag? Compile time option doesn't seems like a + * good idea from the perspective of packaging for wide variety of user configs. + */ + bool buffered = true +#ifdef FORCE_UNBUFFERED_XFT + && bg >= 0 #endif ; - // cut trailing spaces while (len && text [len - 1] == ' ') len--; @@ -1320,47 +1321,63 @@ if (ep != enc) { rxvt_drawable &d2 = d.screen->scratch_drawable (w, h); + bool back_rendered = false; - if (0) - ; #ifdef HAVE_BG_PIXMAP - else if (bg < 0 && term->bgPixmap.pixmap) + if (term->bgPixmap.pixmap) { - if (term->bgPixmap.pmap_width >= x + term->window_vt_x+w - && term->bgPixmap.pmap_height >= y + term->window_vt_y+h) - { - XCopyArea (disp, term->bgPixmap.pixmap, d2, gc, - x + term->window_vt_x, y + term->window_vt_y, - w, h, 0, 0); - } - else + Picture dst = 0; + + if (bg >= 0 && term->pix_colors[bg].c.color.alpha < 0x0ff00) + dst = XftDrawPicture (d2); + + if (bg < 0 || dst != 0) { - XGCValues gcv; + int src_x = x, src_y = y ; + + if (term->bgPixmap.is_parentOrigin ()) + { + src_x += term->window_vt_x; + src_y += term->window_vt_y; + } + + if (term->bgPixmap.pmap_width >= src_x+w + && term->bgPixmap.pmap_height >= src_y+h) + { + XCopyArea (disp, term->bgPixmap.pixmap, d2, gc, + src_x, src_y, w, h, 0, 0); + } + else + { + XGCValues gcv; + + gcv.fill_style = FillTiled; + gcv.tile = term->bgPixmap.pixmap; + gcv.ts_x_origin = -src_x; + gcv.ts_y_origin = -src_y; + + XChangeGC (disp, gc, + GCTile | GCTileStipXOrigin | GCTileStipYOrigin | GCFillStyle, + &gcv); + + XFillRectangle (disp, d2, gc, 0, 0, w, h); + + gcv.fill_style = FillSolid; + XChangeGC (disp, gc, GCFillStyle, &gcv); + } + + if (bg >= 0) + { + Picture solid_color_pict = XftDrawSrcPicture (d2, &term->pix_colors[bg].c); + XRenderComposite (disp, PictOpOver, solid_color_pict, None, dst, 0, 0, 0, 0, 0, 0, w, h); + } - gcv.fill_style = FillTiled; - gcv.tile = term->bgPixmap.pixmap; - gcv.ts_x_origin = -x; - gcv.ts_y_origin = -y; - -#if 0 - GC gc2 = XCreateGC (disp, d2, - GCTile | GCTileStipXOrigin | GCTileStipYOrigin | GCFillStyle, - &gcv); -#endif - XChangeGC (disp, gc, - GCTile | GCTileStipXOrigin | GCTileStipYOrigin | GCFillStyle, - &gcv); - - XFillRectangle (disp, d2, gc/*gc2*/, 0, 0, w, h); - - gcv.fill_style = FillSolid; - XChangeGC (disp, gc, GCFillStyle, &gcv); - /* XFreeGC (disp, gc2); */ - + back_rendered = true; } } #endif - else + + if (bg >= 0 && !back_rendered) XftDrawRect (d2, &term->pix_colors[bg].c, 0, 0, w, h); XftDrawGlyphSpec (d2, &term->pix_colors[fg].c, f, enc, ep - enc);