--- rxvt-unicode/src/rxvtfont.C 2008/01/23 09:42:02 1.134 +++ rxvt-unicode/src/rxvtfont.C 2009/04/04 13:58:55 1.151 @@ -1,7 +1,7 @@ /*----------------------------------------------------------------------* * File: rxvtfont.C *----------------------------------------------------------------------* - * Copyright (c) 2003-2006 Marc Lehmann + * Copyright (c) 2003-2008 Marc Lehmann * - original version. * * This program is free software; you can redistribute it and/or modify @@ -81,8 +81,8 @@ #if ENCODING_JP || ENCODING_JP_EXT # if XFT // prefer xft for complex scripts - { CS_JIS0208_1990_0, "xft:Kochi Gothic:antialias=false" }, { CS_JIS0208_1990_0, "xft:Sazanami Mincho:antialias=false" }, + { CS_JIS0208_1990_0, "xft:Kochi Gothic:antialias=false" }, { CS_JIS0208_1990_0, "xft:Mincho:antialias=false" }, { CS_JIS0208_1990_0, "xft::lang=ja:antialias=false" }, # endif @@ -218,13 +218,13 @@ } void -rxvt_font::set_name (char *name) +rxvt_font::set_name (char *name_) { - if (this->name == name) + if (name == name_) return; - if (this->name) free (this->name); // let the compiler optimize - this->name = name; + if (name) free (name); // let the compiler optimize + name = name_; } void @@ -238,23 +238,20 @@ else if (color >= 0) { #if XFT - bool done = false; + Picture dst; # ifdef HAVE_BG_PIXMAP - if (term->bgPixmap.pixmap && color >= 0 && !term->pix_colors[color].is_opaque ()) + if (term->bgPixmap.pixmap + && !term->pix_colors[color].is_opaque () + && ((dst = XftDrawPicture (d)))) { - Picture dst = XftDrawPicture (d); + XClearArea (disp, d, x, y, w, h, false); - if (dst != 0) - { - XClearArea (disp, d, x, y, w, h, false); - Picture solid_color_pict = XftDrawSrcPicture (d, &term->pix_colors[color].c); - XRenderComposite (disp, PictOpOver, solid_color_pict, None, dst, 0, 0, 0, 0, x, y, w, h); - done = true; - } + Picture solid_color_pict = XftDrawSrcPicture (d, &term->pix_colors[color].c); + XRenderComposite (disp, PictOpOver, solid_color_pict, None, dst, 0, 0, 0, 0, x, y, w, h); } + else # endif - if (!done) XftDrawRect (d, &term->pix_colors[color].c, x, y, w, h); #else @@ -1138,7 +1135,7 @@ #if 0 // clipping unfortunately destroys our precious double-width-characters // clip width, we can't do better, or can we? if (FcPatternGet (p, FC_CHAR_WIDTH, 0, &v) != FcResultMatch) - FcPatternAddInteger (p, FC_CHAR_WIDTH, prop->width); + FcPatternAddInteger (p, FC_CHAR_WIDTH, prop.width); #endif if (FcPatternGet (p, FC_MINSPACE, 0, &v) != FcResultMatch) @@ -1301,14 +1298,8 @@ int w = term->fwidth * len; int h = term->fheight; - /* - * 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 = bg >= Color_transparent; -#ifdef FORCE_UNBUFFERED_XFT - buffered = false; -#endif + bool buffered = bg >= Color_transparent + && term->option (Opt_buffered); // cut trailing spaces while (len && text [len - 1] == ' ') @@ -1347,16 +1338,15 @@ { if (ep != enc) { - bool back_rendered = false; rxvt_drawable &d2 = d.screen->scratch_drawable (w, h); #ifdef HAVE_BG_PIXMAP + Picture dst = 0; // the only assignment is done conditionally in the following if condition if (term->bgPixmap.pixmap - && !(bg >= 0 && term->pix_colors[bg].is_opaque ())) + && (bg == Color_transparent || bg == Color_bg + || (bg >= 0 && !term->pix_colors[bg].is_opaque () && ((dst = XftDrawPicture (d2)))))) { - Picture dst = XftDrawPicture (d2); - int src_x = x, src_y = y; if (term->bgPixmap.is_parentOrigin ()) @@ -1365,8 +1355,8 @@ src_y += term->window_vt_y; } - if (term->bgPixmap.pmap_width >= src_x+w - && term->bgPixmap.pmap_height >= src_y+h) + 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); @@ -1390,18 +1380,17 @@ XChangeGC (disp, gc, GCFillStyle, &gcv); } - if (bg >= 0 && dst) // colour must be (and is) non-opaque here + if (dst) { Picture solid_color_pict = XftDrawSrcPicture (d2, &term->pix_colors[bg].c); + + // dst can only be set when bg >= 0 XRenderComposite (disp, PictOpOver, solid_color_pict, None, dst, 0, 0, 0, 0, 0, 0, w, h); } - - back_rendered = true; } + else #endif - - if (!back_rendered) - XftDrawRect (d2, &term->pix_colors[bg < 0 ? Color_bg : bg].c, 0, 0, w, h); + XftDrawRect (d2, &term->pix_colors[bg >= 0 ? bg : Color_bg].c, 0, 0, w, h); XftDrawGlyphSpec (d2, &term->pix_colors[fg].c, f, enc, ep - enc); XCopyArea (disp, d2, d, gc, 0, 0, w, h, x, y);