--- rxvt-unicode/src/background.C 2011/12/24 09:44:10 1.179 +++ rxvt-unicode/src/background.C 2011/12/25 17:07:00 1.184 @@ -955,7 +955,7 @@ void rxvt_term::set_tint_shade_flags () { - rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC); + rgba c; bool has_shade = shade != 100; bg_flags &= ~BG_TINT_FLAGS; @@ -1035,6 +1035,9 @@ { bool ret = false; #if XRENDER + if (!(bg_flags & BG_HAS_RENDER_CONV)) + return false; + int size = max (h_blurRadius, v_blurRadius) * 2 + 1; double *kernel = (double *)malloc (size * sizeof (double)); XFixed *params = (XFixed *)malloc ((size + 2) * sizeof (XFixed)); @@ -1117,9 +1120,9 @@ XFreeGC (dpy, gc); } } - else - { # if XRENDER + else if (bg_flags & BG_HAS_RENDER) + { rgba c (rgba::MAX_CC, rgba::MAX_CC, rgba::MAX_CC); if (bg_flags & BG_TINT_SET) @@ -1184,8 +1187,8 @@ XRenderFreePicture (dpy, mask_pic); XRenderFreePicture (dpy, overlay_pic); XRenderFreePicture (dpy, back_pic); -# endif } +# endif return ret; } @@ -1296,14 +1299,12 @@ if (!(bg_flags & BG_CLIENT_RENDER)) { - if ((bg_flags & BG_NEEDS_BLUR) - && (bg_flags & BG_HAS_RENDER_CONV)) + if (bg_flags & BG_NEEDS_BLUR) { if (blur_pixmap (bg_pixmap, visual, window_width, window_height)) result &= ~BG_NEEDS_BLUR; } - if ((bg_flags & BG_NEEDS_TINT) - && (bg_flags & (BG_TINT_BITAND | BG_HAS_RENDER))) + if (bg_flags & BG_NEEDS_TINT) { if (tint_pixmap (bg_pixmap, visual, window_width, window_height)) result &= ~BG_NEEDS_TINT; @@ -1328,10 +1329,6 @@ } # endif /* ENABLE_TRANSPARENCY */ -#if defined(ENABLE_TRANSPARENCY) && !defined(HAVE_AFTERIMAGE) -static void shade_ximage (Visual *visual, XImage *ximage, int shade, const rgba &c); -# endif - bool rxvt_term::bg_render () { @@ -1371,12 +1368,7 @@ /* our own client-side tinting */ //if (tr_flags & BG_NEEDS_TINT) if (1) - { - rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC); - if (bg_flags & BG_TINT_SET) - tint.get (c); - shade_ximage (DefaultVisual (dpy, display->screen), result, shade, c); - } + tint_ximage (DefaultVisual (dpy, display->screen), result); GC gc = XCreateGC (dpy, vt, 0UL, NULL); @@ -1449,14 +1441,13 @@ } } -static void -shade_ximage (Visual *visual, XImage *ximage, int shade, const rgba &c) +void +rxvt_term::tint_ximage (Visual *visual, XImage *ximage) { int sh_r, sh_g, sh_b; uint32_t mask_r, mask_g, mask_b; uint32_t *lookup, *lookup_r, *lookup_g, *lookup_b; - rgba low; - rgba high; + unsigned short low; int host_byte_order = ecb_big_endian () ? MSBFirst : LSBFirst; if (visual->c_class != TrueColor || ximage->format != ZPixmap) return; @@ -1525,32 +1516,33 @@ return; /* we do not support this color depth */ } + rgba c (rgba::MAX_CC, rgba::MAX_CC, rgba::MAX_CC); + + if (bg_flags & BG_TINT_SET) + tint.get (c); + /* prepare limits for color transformation (each channel is handled separately) */ if (shade > 100) { - shade = 200 - shade; + c.r = c.r * (200 - shade) / 100; + c.g = c.g * (200 - shade) / 100; + c.b = c.b * (200 - shade) / 100; - high.r = c.r * shade / 100; - high.g = c.g * shade / 100; - high.b = c.b * shade / 100; - - low.r = 65535 * (100 - shade) / 100; - low.g = 65535 * (100 - shade) / 100; - low.b = 65535 * (100 - shade) / 100; + low = 0xffff * (shade - 100) / 100; } else { - high.r = c.r * shade / 100; - high.g = c.g * shade / 100; - high.b = c.b * shade / 100; + c.r = c.r * shade / 100; + c.g = c.g * shade / 100; + c.b = c.b * shade / 100; - low.r = low.g = low.b = 0; + low = 0; } /* fill our lookup tables */ - fill_lut (lookup_r, mask_r, sh_r, low.r, high.r); - fill_lut (lookup_g, mask_g, sh_g, low.g, high.g); - fill_lut (lookup_b, mask_b, sh_b, low.b, high.b); + fill_lut (lookup_r, mask_r, sh_r, low, c.r); + fill_lut (lookup_g, mask_g, sh_g, low, c.g); + fill_lut (lookup_b, mask_b, sh_b, low, c.b); /* apply table to input image (replacing colors by newly calculated ones) */ if (ximage->bits_per_pixel == 32