--- rxvt-unicode/src/rxvtfont.C 2007/11/24 10:32:33 1.123 +++ rxvt-unicode/src/rxvtfont.C 2008/01/23 09:42:02 1.134 @@ -21,7 +21,6 @@ #include "../config.h" #include "rxvt.h" -#include "rxvtlib.h" #include "rxvtutil.h" #include "rxvtfont.h" @@ -240,10 +239,12 @@ { #if XFT bool done = false; -#ifdef HAVE_BG_PIXMAP - if (term->bgPixmap.pixmap && color >= 0 && term->pix_colors[color].c.color.alpha < 0x0ff00) + +# ifdef HAVE_BG_PIXMAP + if (term->bgPixmap.pixmap && color >= 0 && !term->pix_colors[color].is_opaque ()) { Picture dst = XftDrawPicture (d); + if (dst != 0) { XClearArea (disp, d, x, y, w, h, false); @@ -252,9 +253,10 @@ done = true; } } -#endif +# endif if (!done) XftDrawRect (d, &term->pix_colors[color].c, x, y, w, h); + #else XSetForeground (disp, gc, term->pix_colors[color]); XFillRectangle (disp, d, gc, x, y, w, h); @@ -308,9 +310,11 @@ if (unicode <= 0x009f) return true; +#ifdef BUILTIN_GLYPHS if (unicode >= 0x2500 && unicode <= 0x259f && !term->option (Opt_skipBuiltinGlyphs)) return true; +#endif if (IS_COMPOSE (unicode)) return true; @@ -610,7 +614,7 @@ // fix the size of scalable fonts static bool -replace_field (char *buf, const char *name, int index, const char old, const char *replace) +replace_field (char **ptr, const char *name, int index, const char old, const char *replace) { int slashes = 0; const char *field, *end; @@ -630,17 +634,17 @@ if (slashes >= 13 && (!old || *field == old)) { - // TODO: check for overflow in font-name - strncpy (buf, name, field - name); - buf += field - name; - strcpy (buf, replace); - strcat (buf, end); + size_t len = field - name; + *ptr = (char *)malloc (len + strlen (replace) + strlen (end) + 1); + memcpy (*ptr, name, len); + strcpy (*ptr + len, replace); + strcat (*ptr, end); return true; } else { - strcpy (buf, name); + *ptr = strdup (name); return false; } @@ -658,7 +662,7 @@ // first morph the font if required if (force_prop) { - char fname[1024]; + char *fname; if (name[0] != '-') { @@ -680,18 +684,18 @@ if (prop.weight != rxvt_fontprop::unset) { - replace_field (fname, name, 2, 0, + replace_field (&fname, name, 2, 0, prop.weight < rxvt_fontprop::bold ? "medium" : "bold"); - set_name (strdup (fname)); + set_name (fname); } if (prop.slant != rxvt_fontprop::unset) { - replace_field (fname, name, 3, 0, + replace_field (&fname, name, 3, 0, prop.slant < rxvt_fontprop::italic ? "r" : "i"); // TODO: handle "o"blique, too - set_name (strdup (fname)); + set_name (fname); } } @@ -726,14 +730,18 @@ for (int i = 0; i < count; i++) { rxvt_fontprop p; - char fname[1024]; + char *fname; int diff = 0; - if (replace_field (fname, list[i], 6, '0', field_str)) + if (replace_field (&fname, list[i], 6, '0', field_str)) diff += 10; // slightly penalize scalable fonts - else if (replace_field (fname, list[i], 11, '0', "0")) - diff += 300; // more heavily penalize what looks like scaled bitmap fonts + else + { + free (fname); + if (replace_field (&fname, list[i], 11, '0', "0")) + diff += 300; // more heavily penalize what looks like scaled bitmap fonts + } if (!set_properties (p, fname)) continue; @@ -747,7 +755,7 @@ if (prop.slant != rxvt_fontprop::unset) diff += abs (prop.slant - p.slant); //if (prop.width != rxvt_fontprop::unset) diff += abs (prop.width - p.width); - fonts[i].name = strdup (fname); + fonts[i].name = fname; fonts[i].diff = diff; } @@ -1293,15 +1301,15 @@ int w = term->fwidth * len; int h = term->fheight; - /* 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 + bool buffered = bg >= Color_transparent; #ifdef FORCE_UNBUFFERED_XFT - && bg >= 0 + buffered = false; #endif - ; + // cut trailing spaces while (len && text [len - 1] == ' ') len--; @@ -1337,67 +1345,63 @@ if (buffered) { - bool back_rendered = false; if (ep != enc) { + bool back_rendered = false; rxvt_drawable &d2 = d.screen->scratch_drawable (w, h); #ifdef HAVE_BG_PIXMAP - if (term->bgPixmap.pixmap) + + if (term->bgPixmap.pixmap + && !(bg >= 0 && term->pix_colors[bg].is_opaque ())) { - Picture dst = 0; + Picture dst = XftDrawPicture (d2); - if (bg >= 0 && term->pix_colors[bg].c.color.alpha < 0x0ff00) - dst = XftDrawPicture (d2); + int src_x = x, src_y = y; - if (bg < 0 || dst != 0) + if (term->bgPixmap.is_parentOrigin ()) { - int src_x = x, src_y = y ; + 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; - 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 = -src_x; + gcv.ts_y_origin = -src_y; - back_rendered = true; + 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 && dst) // colour must be (and is) non-opaque here + { + 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); } + + back_rendered = true; } #endif - if (bg >= 0 && !back_rendered) - XftDrawRect (d2, &term->pix_colors[bg].c, 0, 0, w, h); + if (!back_rendered) + XftDrawRect (d2, &term->pix_colors[bg < 0 ? Color_bg : 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); @@ -1529,7 +1533,7 @@ if (end - desc < 511) { - strncpy (buf, desc, end - desc); + memcpy (buf, desc, end - desc); buf[end - desc] = 0; fonts.push_back (new_font (buf, cs));