… | |
… | |
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 |
39 | static Picture |
43 | static Picture |
40 | create_xrender_mask (Display *dpy, Drawable drawable, Bool argb, Bool component_alpha) |
44 | create_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 | |
992 | bool |
996 | bool |
993 | rxvt_term::bg_set_tint (rxvt_color &new_tint) |
997 | rxvt_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 | |
1394 | void |
1396 | void |
1395 | rxvt_term::bg_init () |
1397 | rxvt_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; |