--- rxvt-unicode/src/rxvtimg.C 2012/06/07 20:26:21 1.55 +++ rxvt-unicode/src/rxvtimg.C 2012/06/08 17:22:48 1.62 @@ -16,13 +16,6 @@ ++ref->cnt; } -#if 0 -rxvt_img::rxvt_img (rxvt_screen *screen, XRenderPictFormat *format, int width, int height, Pixmap pixmap) -: s(screen), x(0), y(0), w(width), h(height), format(format), repeat(RepeatNormal), shared(false), pm(pixmap) -{ -} -#endif - rxvt_img * rxvt_img::new_from_root (rxvt_screen *s) { @@ -123,10 +116,7 @@ uint32_t v = (r << 16) | (g << 8) | b; - if (ecb_big_endian ()) - v = ecb_bswap32 (v); - - if (byte_order_mismatch) + if (ecb_big_endian () ? !byte_order_mismatch : byte_order_mismatch) v = ecb_bswap32 (v); *dst++ = v; @@ -136,12 +126,12 @@ { uint32_t v = *(uint32_t *)src; src += 4; - if (ecb_little_endian ()) + if (ecb_big_endian ()) v = ecb_bswap32 (v); - v = ecb_rotr32 (v, 8); + v = ecb_rotl32 (v, 8); // abgr to bgra - if (byte_order_mismatch) + if (!byte_order_mismatch) v = ecb_bswap32 (v); *dst++ = v; @@ -277,11 +267,10 @@ rxvt_img *img = new rxvt_img (s, format, x, y, w, h, repeat); img->alloc (); - Picture src = src_picture (); - XRenderPictureAttributes pa; pa.repeat = RepeatPad; - Picture dst = XRenderCreatePicture (dpy, img->pm, format, CPRepeat, &pa); + Picture src = XRenderCreatePicture (dpy, pm, format, CPRepeat, &pa); + Picture dst = XRenderCreatePicture (dpy, img->pm, format, 0, 0); Pixmap tmp_pm = XCreatePixmap (dpy, pm, w, h, format->depth); Picture tmp = XRenderCreatePicture (dpy, tmp_pm , format, CPRepeat, &pa); @@ -307,7 +296,7 @@ get_gaussian_kernel (rv, size, kernel, params); ::swap (params[0], params[1]); - XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2); + XRenderSetPictureFilter (dpy, tmp, FilterConvolution, params, size+2); XRenderComposite (dpy, PictOpSrc, tmp, @@ -420,9 +409,10 @@ Display *dpy = s->display->dpy; - bool alpha = !format->direct.alphaMask - && (x || y) - && repeat == RepeatNone; + // add an alpha channel if... + bool alpha = !format->direct.alphaMask // pixmap has none yet + && (x || y) // we need one because of non-zero offset + && repeat == RepeatNone; // and we have no good pixels to fill with rxvt_img *img = new rxvt_img (s, alpha ? find_alpha_format_for (dpy, format) : format, 0, 0, w, h, repeat); img->alloc ();