--- rxvt-unicode/src/rxvtimg.C 2012/06/05 18:52:48 1.24 +++ rxvt-unicode/src/rxvtimg.C 2012/06/06 20:22:03 1.28 @@ -67,6 +67,8 @@ img->render_pixbuf (pb, 0, 0, img->w, img->h, 0, 0); + g_object_unref (pb); + return img; } @@ -294,18 +296,6 @@ unsigned char *row = gdk_pixbuf_get_pixels (pixbuf) + src_y * rowstride + src_x * channels; char *line = ximage->data; - rgba c (0, 0, 0); - - if (channels == 4 && alpha_mask == 0) - { - //pix_colors[Color_bg].get (c); - //TODO - c.r = 0xffff; c.g = 0xc0c0; c.b = 0xcbcb;//D - c.r >>= 8; - c.g >>= 8; - c.b >>= 8; - } - for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) @@ -317,9 +307,9 @@ if (channels == 4) { a = pixel[3]; - r = (pixel[0] * a + c.r * (0xff - a)) / 0xff; - g = (pixel[1] * a + c.g * (0xff - a)) / 0xff; - b = (pixel[2] * a + c.b * (0xff - a)) / 0xff; + r = pixel[0] * a / 0xff; + g = pixel[1] * a / 0xff; + b = pixel[2] * a / 0xff; } else { @@ -437,15 +427,30 @@ } rxvt_img * -rxvt_img::convert_to (XRenderPictFormat *new_format) +rxvt_img::convert_to (XRenderPictFormat *new_format, const rxvt_color &bg) { rxvt_img *img = new rxvt_img (s, new_format, w, h); Display *dpy = s->display->dpy; Picture src = XRenderCreatePicture (dpy, pm, format, 0, 0); Picture dst = XRenderCreatePicture (dpy, img->pm, new_format, 0, 0); + int op = PictOpSrc; + + printf ("fa %x,%x fb %x,%x\n", format->direct.alpha, format->direct.alphaMask, new_format->direct.alpha, new_format->direct.alphaMask);//D + + if (format->direct.alpha && !new_format->direct.alpha) + { + // does it have to be that complicated + rgba c; + bg.get (c); + + XRenderColor rc = { c.r, c.g, c.b, 0xffff }; + XRenderFillRectangle (dpy, PictOpSrc, dst, &rc, 0, 0, w, h); + + op = PictOpOver; + } - XRenderComposite (dpy, PictOpSrc, src, None, dst, 0, 0, 0, 0, 0, 0, w, h); + XRenderComposite (dpy, op, src, None, dst, 0, 0, 0, 0, 0, 0, w, h); XRenderFreePicture (dpy, src); XRenderFreePicture (dpy, dst);