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.190 by sf-exg, Thu Dec 29 20:35:37 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);
819 } 824 }
820 825
821#if XRENDER 826#if XRENDER
822 if (tr_flags) 827 if (tr_flags)
823 { 828 {
824 XRenderPictureAttributes pa;
825 XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual); 829 XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual);
826 830
827 Picture src = XRenderCreatePicture (dpy, root_pmap, format, 0, &pa); 831 Picture src = XRenderCreatePicture (dpy, root_pmap, format, 0, 0);
828 832
829 Picture dst = XRenderCreatePicture (dpy, bg_pixmap, format, 0, &pa); 833 Picture dst = XRenderCreatePicture (dpy, bg_pixmap, format, 0, 0);
830 834
831 Picture mask = create_xrender_mask (dpy, vt, False, False); 835 Picture mask = create_xrender_mask (dpy, vt, False, False);
832 836
833 XRenderColor mask_c; 837 XRenderColor mask_c;
834 838
835 mask_c.alpha = 0x8000; 839 mask_c.alpha = 0x8000;
836 mask_c.red = 0; 840 mask_c.red =
837 mask_c.green = 0; 841 mask_c.green =
838 mask_c.blue = 0; 842 mask_c.blue = 0;
839 XRenderFillRectangle (dpy, PictOpSrc, mask, &mask_c, 0, 0, 1, 1); 843 XRenderFillRectangle (dpy, PictOpSrc, mask, &mask_c, 0, 0, 1, 1);
844
840 XRenderComposite (dpy, PictOpOver, src, mask, dst, 0, 0, 0, 0, 0, 0, target_width, target_height); 845 XRenderComposite (dpy, PictOpOver, src, mask, dst, 0, 0, 0, 0, 0, 0, target_width, target_height);
841 846
842 XRenderFreePicture (dpy, src); 847 XRenderFreePicture (dpy, src);
843 XRenderFreePicture (dpy, dst); 848 XRenderFreePicture (dpy, dst);
844 XRenderFreePicture (dpy, mask); 849 XRenderFreePicture (dpy, mask);
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;
1057 XFixed *params = (XFixed *)malloc ((size + 2) * sizeof (XFixed)); 1062 XFixed *params = (XFixed *)malloc ((size + 2) * sizeof (XFixed));
1058 1063
1059 XRenderPictureAttributes pa; 1064 XRenderPictureAttributes pa;
1060 XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual); 1065 XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual);
1061 1066
1067 pa.repeat = RepeatPad;
1062 Picture src = XRenderCreatePicture (dpy, pixmap, format, 0, &pa); 1068 Picture src = XRenderCreatePicture (dpy, pixmap, format, CPRepeat, &pa);
1063 Picture dst = XRenderCreatePicture (dpy, pixmap, format, 0, &pa); 1069 Picture dst = XRenderCreatePicture (dpy, pixmap, format, CPRepeat, &pa);
1064 1070
1065 if (kernel && params) 1071 if (kernel && params)
1066 { 1072 {
1067 if (h_blurRadius)
1068 {
1069 size = h_blurRadius * 2 + 1; 1073 size = h_blurRadius * 2 + 1;
1070 get_gaussian_kernel (h_blurRadius, size, kernel, params); 1074 get_gaussian_kernel (h_blurRadius, size, kernel, params);
1071 1075
1072 XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2); 1076 XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2);
1073 XRenderComposite (dpy, 1077 XRenderComposite (dpy,
1074 PictOpSrc, 1078 PictOpSrc,
1075 src, 1079 src,
1076 None, 1080 None,
1077 dst, 1081 dst,
1078 0, 0, 1082 0, 0,
1079 0, 0, 1083 0, 0,
1080 0, 0, 1084 0, 0,
1081 width, height); 1085 width, height);
1082 }
1083 1086
1084 if (v_blurRadius)
1085 {
1086 size = v_blurRadius * 2 + 1; 1087 size = v_blurRadius * 2 + 1;
1087 get_gaussian_kernel (v_blurRadius, size, kernel, params); 1088 get_gaussian_kernel (v_blurRadius, size, kernel, params);
1088 ::swap (params[0], params[1]); 1089 ::swap (params[0], params[1]);
1089 1090
1090 XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2); 1091 XRenderSetPictureFilter (dpy, src, FilterConvolution, params, size+2);
1091 XRenderComposite (dpy, 1092 XRenderComposite (dpy,
1092 PictOpSrc, 1093 PictOpSrc,
1093 src, 1094 src,
1094 None, 1095 None,
1095 dst, 1096 dst,
1096 0, 0, 1097 0, 0,
1097 0, 0, 1098 0, 0,
1098 0, 0, 1099 0, 0,
1099 width, height); 1100 width, height);
1100 }
1101 1101
1102 ret = true; 1102 ret = true;
1103 } 1103 }
1104 1104
1105 free (kernel); 1105 free (kernel);
1135 } 1135 }
1136 } 1136 }
1137# if XRENDER 1137# if XRENDER
1138 else if (bg_flags & BG_HAS_RENDER) 1138 else if (bg_flags & BG_HAS_RENDER)
1139 { 1139 {
1140 rgba c; 1140 rgba c (rgba::MAX_CC, rgba::MAX_CC, rgba::MAX_CC);
1141 1141
1142 if (bg_flags & BG_TINT_SET)
1142 tint.get (c); 1143 tint.get (c);
1143 1144
1144 if (shade <= 100) 1145 if (shade <= 100)
1145 { 1146 {
1146 c.r = c.r * shade / 100; 1147 c.r = c.r * shade / 100;
1147 c.g = c.g * shade / 100; 1148 c.g = c.g * shade / 100;
1153 c.g = c.g * (200 - shade) / 100; 1154 c.g = c.g * (200 - shade) / 100;
1154 c.b = c.b * (200 - shade) / 100; 1155 c.b = c.b * (200 - shade) / 100;
1155 } 1156 }
1156 1157
1157 XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual); 1158 XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual);
1158 XRenderPictureAttributes pa;
1159 1159
1160 Picture back_pic = XRenderCreatePicture (dpy, pixmap, format, 0, &pa); 1160 Picture back_pic = XRenderCreatePicture (dpy, pixmap, format, 0, 0);
1161 1161
1162 Picture overlay_pic = create_xrender_mask (dpy, pixmap, True, False); 1162 Picture overlay_pic = create_xrender_mask (dpy, pixmap, True, False);
1163 1163
1164 Picture mask_pic = create_xrender_mask (dpy, pixmap, True, True); 1164 Picture mask_pic = create_xrender_mask (dpy, pixmap, True, True);
1165 1165
1174 mask_c.alpha = 0; 1174 mask_c.alpha = 0;
1175 mask_c.red = 0xffff - c.r; 1175 mask_c.red = 0xffff - c.r;
1176 mask_c.green = 0xffff - c.g; 1176 mask_c.green = 0xffff - c.g;
1177 mask_c.blue = 0xffff - c.b; 1177 mask_c.blue = 0xffff - c.b;
1178 XRenderFillRectangle (dpy, PictOpSrc, mask_pic, &mask_c, 0, 0, 1, 1); 1178 XRenderFillRectangle (dpy, PictOpSrc, mask_pic, &mask_c, 0, 0, 1, 1);
1179
1179 XRenderComposite (dpy, PictOpOver, overlay_pic, mask_pic, back_pic, 0, 0, 0, 0, 0, 0, width, height); 1180 XRenderComposite (dpy, PictOpOver, overlay_pic, mask_pic, back_pic, 0, 0, 0, 0, 0, 0, width, height);
1180 1181
1181 if (shade > 100) 1182 if (shade > 100)
1182 { 1183 {
1183 mask_c.red = mask_c.green = mask_c.blue = 0xffff * (shade - 100) / 100;
1184 mask_c.alpha = 0; 1184 mask_c.alpha = 0;
1185 mask_c.red =
1186 mask_c.green =
1187 mask_c.blue = 0xffff * (shade - 100) / 100;
1185 XRenderFillRectangle (dpy, PictOpSrc, overlay_pic, &mask_c, 0, 0, 1, 1); 1188 XRenderFillRectangle (dpy, PictOpSrc, overlay_pic, &mask_c, 0, 0, 1, 1);
1186 1189
1187 XRenderComposite (dpy, PictOpOver, overlay_pic, None, back_pic, 0, 0, 0, 0, 0, 0, width, height); 1190 XRenderComposite (dpy, PictOpOver, overlay_pic, None, back_pic, 0, 0, 0, 0, 0, 0, width, height);
1188 } 1191 }
1189 1192
1252#if XRENDER 1255#if XRENDER
1253 if (bg_flags & BG_HAS_RENDER) 1256 if (bg_flags & BG_HAS_RENDER)
1254 { 1257 {
1255 recoded_root_pmap = XCreatePixmap (dpy, vt, root_pmap_width, root_pmap_height, depth); 1258 recoded_root_pmap = XCreatePixmap (dpy, vt, root_pmap_width, root_pmap_height, depth);
1256 1259
1257 XRenderPictureAttributes pa;
1258
1259 XRenderPictFormat *src_format = XRenderFindVisualFormat (dpy, DefaultVisual (dpy, screen)); 1260 XRenderPictFormat *src_format = XRenderFindVisualFormat (dpy, DefaultVisual (dpy, screen));
1260 Picture src = XRenderCreatePicture (dpy, root_pixmap, src_format, 0, &pa); 1261 Picture src = XRenderCreatePicture (dpy, root_pixmap, src_format, 0, 0);
1261 1262
1262 XRenderPictFormat *dst_format = XRenderFindVisualFormat (dpy, visual); 1263 XRenderPictFormat *dst_format = XRenderFindVisualFormat (dpy, visual);
1263 Picture dst = XRenderCreatePicture (dpy, recoded_root_pmap, dst_format, 0, &pa); 1264 Picture dst = XRenderCreatePicture (dpy, recoded_root_pmap, dst_format, 0, 0);
1264 1265
1265 XRenderComposite (dpy, PictOpSrc, src, None, dst, 0, 0, 0, 0, 0, 0, root_pmap_width, root_pmap_height); 1266 XRenderComposite (dpy, PictOpSrc, src, None, dst, 0, 0, 0, 0, 0, 0, root_pmap_width, root_pmap_height);
1266 1267
1267 XRenderFreePicture (dpy, src); 1268 XRenderFreePicture (dpy, src);
1268 XRenderFreePicture (dpy, dst); 1269 XRenderFreePicture (dpy, dst);
1394 1395
1395void 1396void
1396rxvt_term::bg_init () 1397rxvt_term::bg_init ()
1397{ 1398{
1398#ifdef ENABLE_TRANSPARENCY 1399#ifdef ENABLE_TRANSPARENCY
1399 rgba c (rgba::MAX_CC, rgba::MAX_CC, rgba::MAX_CC);
1400 tint.set (this, c);
1401 shade = 100; 1400 shade = 100;
1402#endif 1401#endif
1403 1402
1404 bg_flags &= ~(BG_HAS_RENDER | BG_HAS_RENDER_CONV); 1403 bg_flags &= ~(BG_HAS_RENDER | BG_HAS_RENDER_CONV);
1405#if XRENDER 1404#if XRENDER
1508 break; 1507 break;
1509 default: 1508 default:
1510 return; /* we do not support this color depth */ 1509 return; /* we do not support this color depth */
1511 } 1510 }
1512 1511
1513 rgba c; 1512 rgba c (rgba::MAX_CC, rgba::MAX_CC, rgba::MAX_CC);
1514 1513
1514 if (bg_flags & BG_TINT_SET)
1515 tint.get (c); 1515 tint.get (c);
1516 1516
1517 /* prepare limits for color transformation (each channel is handled separately) */ 1517 /* prepare limits for color transformation (each channel is handled separately) */
1518 if (shade > 100) 1518 if (shade > 100)
1519 { 1519 {
1520 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