… | |
… | |
1007 | flags &= ~blurNeeded; |
1007 | flags &= ~blurNeeded; |
1008 | else |
1008 | else |
1009 | flags |= blurNeeded; |
1009 | flags |= blurNeeded; |
1010 | |
1010 | |
1011 | #if XFT |
1011 | #if XFT |
1012 | XFilters *filters = XRenderQueryFilters (target->dpy, target->display->root); |
1012 | XFilters *filters = XRenderQueryFilters (target->dpy, target->display->root); |
1013 | if (filters) |
1013 | if (filters) |
1014 | { |
1014 | { |
1015 | for (int i = 0; i < filters->nfilter; i++) |
1015 | for (int i = 0; i < filters->nfilter; i++) |
1016 | if (!strcmp (filters->filter[i], FilterConvolution)) |
1016 | if (!strcmp (filters->filter[i], FilterConvolution)) |
1017 | flags |= bgPixmap_t::blurServerSide; |
1017 | flags |= bgPixmap_t::blurServerSide; |
1018 | |
1018 | |
1019 | XFree (filters); |
1019 | XFree (filters); |
1020 | } |
1020 | } |
1021 | #endif |
1021 | #endif |
1022 | |
1022 | |
1023 | return (changed > 0); |
1023 | return (changed > 0); |
1024 | } |
1024 | } |
1025 | |
1025 | |
… | |
… | |
1117 | |
1117 | |
1118 | #if XFT |
1118 | #if XFT |
1119 | static void |
1119 | static void |
1120 | get_gaussian_kernel (int radius, int width, double *kernel, XFixed *params) |
1120 | get_gaussian_kernel (int radius, int width, double *kernel, XFixed *params) |
1121 | { |
1121 | { |
1122 | double sigma = radius / 2.0; |
1122 | double sigma = radius / 2.0; |
1123 | double scale = sqrt (2.0 * M_PI) * sigma; |
1123 | double scale = sqrt (2.0 * M_PI) * sigma; |
1124 | double sum = 0.0; |
1124 | double sum = 0.0; |
1125 | |
1125 | |
1126 | for (int i = 0; i < width; i++) |
1126 | for (int i = 0; i < width; i++) |
1127 | { |
1127 | { |
1128 | double x = i - width / 2; |
1128 | double x = i - width / 2; |
1129 | kernel[i] = exp (-(x * x) / (2.0 * sigma * sigma)) / scale; |
1129 | kernel[i] = exp (-(x * x) / (2.0 * sigma * sigma)) / scale; |
1130 | sum += kernel[i]; |
1130 | sum += kernel[i]; |
1131 | } |
1131 | } |
1132 | |
1132 | |
1133 | params[0] = XDoubleToFixed (width); |
1133 | params[0] = XDoubleToFixed (width); |
1134 | params[1] = XDoubleToFixed (1); |
1134 | params[1] = XDoubleToFixed (1); |
1135 | |
1135 | |
1136 | for (int i = 0; i < width; i++) |
1136 | for (int i = 0; i < width; i++) |
1137 | params[i+2] = XDoubleToFixed (kernel[i] / sum); |
1137 | params[i+2] = XDoubleToFixed (kernel[i] / sum); |
1138 | } |
1138 | } |
1139 | #endif |
1139 | #endif |
1140 | |
1140 | |
1141 | bool |
1141 | bool |
1142 | bgPixmap_t::blur_pixmap (Pixmap pixmap, Visual *visual, int width, int height) |
1142 | bgPixmap_t::blur_pixmap (Pixmap pixmap, Visual *visual, int width, int height) |
… | |
… | |
1375 | { |
1375 | { |
1376 | if (!need_client_side_rendering ()) |
1376 | if (!need_client_side_rendering ()) |
1377 | { |
1377 | { |
1378 | if (flags & (blurNeeded | blurServerSide)) |
1378 | if (flags & (blurNeeded | blurServerSide)) |
1379 | { |
1379 | { |
1380 | if (blur_pixmap (tiled_root_pmap, DefaultVisual (dpy, target->display->screen), window_width, window_height)) |
1380 | if (blur_pixmap (tiled_root_pmap, DefaultVisual (dpy, screen), window_width, window_height)) |
1381 | result |= transpPmapBlurred; |
1381 | result |= transpPmapBlurred; |
1382 | } |
1382 | } |
1383 | if (flags & (tintNeeded | tintServerSide)) |
1383 | if (flags & (tintNeeded | tintServerSide)) |
1384 | { |
1384 | { |
1385 | if (tint_pixmap (tiled_root_pmap, DefaultVisual (dpy, target->display->screen), window_width, window_height)) |
1385 | if (tint_pixmap (tiled_root_pmap, DefaultVisual (dpy, screen), window_width, window_height)) |
1386 | result |= transpPmapTinted; |
1386 | result |= transpPmapTinted; |
1387 | } |
1387 | } |
1388 | } /* server side rendering completed */ |
1388 | } /* server side rendering completed */ |
1389 | |
1389 | |
1390 | if (pixmap) |
1390 | if (pixmap) |