--- rxvt-unicode/src/rxvtimg.C 2012/06/05 13:39:26 1.19 +++ rxvt-unicode/src/rxvtimg.C 2012/06/05 18:48:21 1.23 @@ -18,6 +18,38 @@ } rxvt_img * +rxvt_img::new_from_root (rxvt_screen *s) +{ + Display *dpy = s->display->dpy; + unsigned int root_pm_w, root_pm_h; + Pixmap root_pixmap = s->display->get_pixmap_property (s->display->xa[XA_XROOTPMAP_ID]); + if (root_pixmap == None) + root_pixmap = s->display->get_pixmap_property (s->display->xa[XA_ESETROOT_PMAP_ID]); + + if (root_pixmap == None) + return 0; + + Window wdummy; + int idummy; + unsigned int udummy; + + if (!XGetGeometry (dpy, root_pixmap, &wdummy, &idummy, &idummy, &root_pm_w, &root_pm_h, &udummy, &udummy)) + return 0; + + rxvt_img *img = new rxvt_img ( + s, + XRenderFindVisualFormat (dpy, DefaultVisual (dpy, s->display->screen)), + root_pm_w, + root_pm_h, + root_pixmap + ); + + img->shared = true; + + return img; +} + +rxvt_img * rxvt_img::new_from_file (rxvt_screen *s, const char *filename) { GError *err = 0; @@ -89,24 +121,27 @@ params[i+2] = XDoubleToFixed (kernel[i] / sum); } -void +rxvt_img * rxvt_img::blur (int rh, int rv) { if (!(s->display->flags & DISPLAY_HAS_RENDER_CONV)) - return; + return clone (); Display *dpy = s->display->dpy; int size = max (rh, rv) * 2 + 1; double *kernel = (double *)malloc (size * sizeof (double)); XFixed *params = (XFixed *)malloc ((size + 2) * sizeof (XFixed)); + rxvt_img *img = new rxvt_img (s, format, w, h); XRenderPictureAttributes pa; pa.repeat = RepeatPad; - Picture src = XRenderCreatePicture (dpy, pm , format, CPRepeat, &pa); - Pixmap tmp = XCreatePixmap (dpy, pm, w, h, format->depth); - Picture dst = XRenderCreatePicture (dpy, tmp, format, CPRepeat, &pa); - XFreePixmap (dpy, tmp); + Picture src = XRenderCreatePicture (dpy, pm , format, CPRepeat, &pa); + Picture dst = XRenderCreatePicture (dpy, img->pm, format, CPRepeat, &pa); + + Pixmap tmp_pm = XCreatePixmap (dpy, pm, w, h, format->depth); + Picture tmp = XRenderCreatePicture (dpy, tmp_pm , format, CPRepeat, &pa); + XFreePixmap (dpy, tmp_pm); if (kernel && params) { @@ -118,14 +153,12 @@ PictOpSrc, src, None, - dst, + tmp, 0, 0, 0, 0, 0, 0, w, h); - ::swap (src, dst); - size = rv * 2 + 1; get_gaussian_kernel (rv, size, kernel, params); ::swap (params[0], params[1]); @@ -133,7 +166,7 @@ XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2); XRenderComposite (dpy, PictOpSrc, - src, + tmp, None, dst, 0, 0, @@ -146,6 +179,9 @@ free (params); XRenderFreePicture (dpy, src); XRenderFreePicture (dpy, dst); + XRenderFreePicture (dpy, tmp); + + return img; } static Picture @@ -178,6 +214,9 @@ XRenderFillRectangle (dpy, PictOpSrc, src, &mask_c, 0, 0, 1, 1); XRenderComposite (dpy, PictOpAdd, src, None, dst, 0, 0, 0, 0, 0, 0, w, h); + + XRenderFreePicture (dpy, src); + XRenderFreePicture (dpy, dst); } void @@ -198,6 +237,9 @@ XRenderFillRectangle (dpy, PictOpSrc, src, &mask_c, 0, 0, 1, 1); XRenderComposite (dpy, PictOpMultiply, src, None, dst, 0, 0, 0, 0, 0, 0, w, h); + + XRenderFreePicture (dpy, src); + XRenderFreePicture (dpy, dst); } bool @@ -317,6 +359,8 @@ GC gc = XCreateGC (s->display->dpy, pm, 0, 0); XCopyArea (s->display->dpy, pm, img->pm, gc, 0, 0, w, h, 0, 0); XFreeGC (s->display->dpy, gc); + + return img; } rxvt_img *