ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/background.C
(Generate patch)

Comparing rxvt-unicode/src/background.C (file contents):
Revision 1.192 by sf-exg, Fri Dec 30 12:45:56 2011 UTC vs.
Revision 1.195 by sf-exg, Mon Jan 2 19:31:00 2012 UTC

32 32
33#ifndef FilterConvolution 33#ifndef FilterConvolution
34#define FilterConvolution "convolution" 34#define FilterConvolution "convolution"
35#endif 35#endif
36 36
37#ifndef RepeatPad
38#define RepeatPad True
39#endif
40
37#ifdef HAVE_BG_PIXMAP 41#ifdef HAVE_BG_PIXMAP
38# if XRENDER 42# if XRENDER
39static Picture 43static Picture
40create_xrender_mask (Display *dpy, Drawable drawable, Bool argb, Bool component_alpha) 44create_xrender_mask (Display *dpy, Drawable drawable, Bool argb, Bool component_alpha)
41{ 45{
392 if (tr_flags & BG_NEEDS_TINT) 396 if (tr_flags & BG_NEEDS_TINT)
393 { 397 {
394 ShadingInfo as_shade; 398 ShadingInfo as_shade;
395 as_shade.shading = shade; 399 as_shade.shading = shade;
396 400
397 rgba c; 401 rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC);
402 if (bg_flags & BG_TINT_SET)
398 tint.get (c); 403 tint.get (c);
399 as_shade.tintColor.red = c.r; 404 as_shade.tintColor.red = c.r;
400 as_shade.tintColor.green = c.g; 405 as_shade.tintColor.green = c.g;
401 as_shade.tintColor.blue = c.b; 406 as_shade.tintColor.blue = c.b;
402 407
403 background_tint = shading2tint32 (&as_shade); 408 background_tint = shading2tint32 (&as_shade);
956 { 961 {
957 changed = true; 962 changed = true;
958 v_blurRadius = vr; 963 v_blurRadius = vr;
959 } 964 }
960 965
961 if (v_blurRadius == 0 && h_blurRadius == 0) 966 if (h_blurRadius == 0 || v_blurRadius == 0)
962 bg_flags &= ~BG_NEEDS_BLUR; 967 bg_flags &= ~BG_NEEDS_BLUR;
963 else 968 else
964 bg_flags |= BG_NEEDS_BLUR; 969 bg_flags |= BG_NEEDS_BLUR;
965 970
966 return changed; 971 return changed;
972 rgba c; 977 rgba c;
973 bool has_shade = shade != 100; 978 bool has_shade = shade != 100;
974 979
975 bg_flags &= ~BG_TINT_FLAGS; 980 bg_flags &= ~BG_TINT_FLAGS;
976 981
982 if (bg_flags & BG_TINT_SET)
983 {
977 tint.get (c); 984 tint.get (c);
978
979 if (!has_shade 985 if (!has_shade
980 && (c.r <= 0x00ff || c.r >= 0xff00) 986 && (c.r <= 0x00ff || c.r >= 0xff00)
981 && (c.g <= 0x00ff || c.g >= 0xff00) 987 && (c.g <= 0x00ff || c.g >= 0xff00)
982 && (c.b <= 0x00ff || c.b >= 0xff00)) 988 && (c.b <= 0x00ff || c.b >= 0xff00))
983 bg_flags |= BG_TINT_BITAND; 989 bg_flags |= BG_TINT_BITAND;
990 }
984 991
985 if (has_shade 992 if (has_shade || (bg_flags & BG_TINT_SET))
986 || c.r < 0xff00
987 || c.g < 0xff00
988 || c.b < 0xff00)
989 bg_flags |= BG_NEEDS_TINT; 993 bg_flags |= BG_NEEDS_TINT;
990} 994}
991 995
992bool 996bool
993rxvt_term::bg_set_tint (rxvt_color &new_tint) 997rxvt_term::bg_set_tint (rxvt_color &new_tint)
994{ 998{
995 if (tint != new_tint) 999 if (!(bg_flags & BG_TINT_SET) || tint != new_tint)
996 { 1000 {
997 tint = new_tint; 1001 tint = new_tint;
1002 bg_flags |= BG_TINT_SET;
998 set_tint_shade_flags (); 1003 set_tint_shade_flags ();
999 return true; 1004 return true;
1000 } 1005 }
1001 1006
1002 return false; 1007 return false;
1054 1059
1055 int size = max (h_blurRadius, v_blurRadius) * 2 + 1; 1060 int size = max (h_blurRadius, v_blurRadius) * 2 + 1;
1056 double *kernel = (double *)malloc (size * sizeof (double)); 1061 double *kernel = (double *)malloc (size * sizeof (double));
1057 XFixed *params = (XFixed *)malloc ((size + 2) * sizeof (XFixed)); 1062 XFixed *params = (XFixed *)malloc ((size + 2) * sizeof (XFixed));
1058 1063
1064 XRenderPictureAttributes pa;
1059 XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual); 1065 XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual);
1060 1066
1067 pa.repeat = RepeatPad;
1061 Picture src = XRenderCreatePicture (dpy, pixmap, format, 0, 0); 1068 Picture src = XRenderCreatePicture (dpy, pixmap, format, CPRepeat, &pa);
1062 Picture dst = XRenderCreatePicture (dpy, pixmap, format, 0, 0); 1069 Picture dst = XRenderCreatePicture (dpy, pixmap, format, CPRepeat, &pa);
1063 1070
1064 if (kernel && params) 1071 if (kernel && params)
1065 { 1072 {
1066 if (h_blurRadius)
1067 {
1068 size = h_blurRadius * 2 + 1; 1073 size = h_blurRadius * 2 + 1;
1069 get_gaussian_kernel (h_blurRadius, size, kernel, params); 1074 get_gaussian_kernel (h_blurRadius, size, kernel, params);
1070 1075
1071 XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2); 1076 XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2);
1072 XRenderComposite (dpy, 1077 XRenderComposite (dpy,
1073 PictOpSrc, 1078 PictOpSrc,
1074 src, 1079 src,
1075 None, 1080 None,
1076 dst, 1081 dst,
1077 0, 0, 1082 0, 0,
1078 0, 0, 1083 0, 0,
1079 0, 0, 1084 0, 0,
1080 width, height); 1085 width, height);
1081 }
1082 1086
1083 if (v_blurRadius)
1084 {
1085 size = v_blurRadius * 2 + 1; 1087 size = v_blurRadius * 2 + 1;
1086 get_gaussian_kernel (v_blurRadius, size, kernel, params); 1088 get_gaussian_kernel (v_blurRadius, size, kernel, params);
1087 ::swap (params[0], params[1]); 1089 ::swap (params[0], params[1]);
1088 1090
1089 XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2); 1091 XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2);
1090 XRenderComposite (dpy, 1092 XRenderComposite (dpy,
1091 PictOpSrc, 1093 PictOpSrc,
1092 src, 1094 src,
1093 None, 1095 None,
1094 dst, 1096 dst,
1095 0, 0, 1097 0, 0,
1096 0, 0, 1098 0, 0,
1097 0, 0, 1099 0, 0,
1098 width, height); 1100 width, height);
1099 }
1100 1101
1101 ret = true; 1102 ret = true;
1102 } 1103 }
1103 1104
1104 free (kernel); 1105 free (kernel);
1134 } 1135 }
1135 } 1136 }
1136# if XRENDER 1137# if XRENDER
1137 else if (bg_flags & BG_HAS_RENDER) 1138 else if (bg_flags & BG_HAS_RENDER)
1138 { 1139 {
1139 rgba c; 1140 rgba c (rgba::MAX_CC, rgba::MAX_CC, rgba::MAX_CC);
1140 1141
1142 if (bg_flags & BG_TINT_SET)
1141 tint.get (c); 1143 tint.get (c);
1142 1144
1143 if (shade <= 100) 1145 if (shade <= 100)
1144 { 1146 {
1145 c.r = c.r * shade / 100; 1147 c.r = c.r * shade / 100;
1146 c.g = c.g * shade / 100; 1148 c.g = c.g * shade / 100;
1393 1395
1394void 1396void
1395rxvt_term::bg_init () 1397rxvt_term::bg_init ()
1396{ 1398{
1397#ifdef ENABLE_TRANSPARENCY 1399#ifdef ENABLE_TRANSPARENCY
1398 rgba c (rgba::MAX_CC, rgba::MAX_CC, rgba::MAX_CC);
1399 tint.set (this, c);
1400 shade = 100; 1400 shade = 100;
1401#endif 1401#endif
1402 1402
1403 bg_flags &= ~(BG_HAS_RENDER | BG_HAS_RENDER_CONV); 1403 bg_flags &= ~(BG_HAS_RENDER | BG_HAS_RENDER_CONV);
1404#if XRENDER 1404#if XRENDER
1507 break; 1507 break;
1508 default: 1508 default:
1509 return; /* we do not support this color depth */ 1509 return; /* we do not support this color depth */
1510 } 1510 }
1511 1511
1512 rgba c; 1512 rgba c (rgba::MAX_CC, rgba::MAX_CC, rgba::MAX_CC);
1513 1513
1514 if (bg_flags & BG_TINT_SET)
1514 tint.get (c); 1515 tint.get (c);
1515 1516
1516 /* prepare limits for color transformation (each channel is handled separately) */ 1517 /* prepare limits for color transformation (each channel is handled separately) */
1517 if (shade > 100) 1518 if (shade > 100)
1518 { 1519 {
1519 c.r = c.r * (200 - shade) / 100; 1520 c.r = c.r * (200 - shade) / 100;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines