--- rxvt-unicode/src/rxvtimg.C 2012/06/07 08:36:09 1.34 +++ rxvt-unicode/src/rxvtimg.C 2012/06/07 11:27:08 1.40 @@ -116,9 +116,6 @@ pa.repeat = repeat; Picture pic = XRenderCreatePicture (dpy, pm, format, CPRepeat, &pa); - XRectangle clip = { -x, -y, min (w, ref->w), min (h, ref->h) }; - XRenderSetPictureClipRectangles (dpy, pic, 0, 0, &clip, 1); - return pic; } @@ -399,14 +396,18 @@ rxvt_img * rxvt_img::reify () { - rxvt_img *img = new rxvt_img (s, format, 0, 0, w, h); - img->alloc (); - - // todo, if x==0 and y==0 and w==real width we could clone - // but that involves an rtt to find pixmap width. + if (x == 0 && y == 0 && w == ref->w && h == ref->h) + return clone (); Display *dpy = s->display->dpy; + bool alpha = !format->direct.alphaMask + && (x || y) + && repeat == RepeatNone; + + rxvt_img *img = new rxvt_img (s, alpha ? XRenderFindStandardFormat (dpy, PictStandardARGB32) : format, 0, 0, w, h); + img->alloc (); + Picture src = src_picture (); Picture dst = XRenderCreatePicture (dpy, img->pm, img->format, 0, 0); @@ -423,12 +424,18 @@ { rxvt_img *img = clone (); - //TODO: width > w, must reify - img->x += x; img->y += y; - img->w = width; - img->h = height; + + if (w != width || h != height) + { + img->w = width; + img->h = height; + + rxvt_img *img2 = img->reify (); + delete img; + img = img2; + } return img; } @@ -528,7 +535,7 @@ { rxvt_img *img2 = clone (); Display *dpy = s->display->dpy; - Picture src = src_picture (); + Picture src = img->src_picture (); Picture dst = XRenderCreatePicture (dpy, img2->pm, img2->format, 0, 0); Picture mask = create_xrender_mask (dpy, img->pm, False);