… | |
… | |
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) |
… | |
… | |
1770 | p = p1; |
1770 | p = p1; |
1771 | pl = p1 + srcImage->width; |
1771 | pl = p1 + srcImage->width; |
1772 | for (; p < pl; p++) |
1772 | for (; p < pl; p++) |
1773 | { |
1773 | { |
1774 | *p = lookup_r[(*p & 0x7c00)>>10] | |
1774 | *p = lookup_r[(*p & 0x7c00)>>10] | |
1775 | lookup_g[(*p & 0x03e0)>> 5] | |
1775 | lookup_g[(*p & 0x03e0)>> 5] | |
1776 | lookup_b[(*p & 0x001f)]; |
1776 | lookup_b[(*p & 0x001f)]; |
1777 | } |
1777 | } |
1778 | p1 = (unsigned short *) ((char *) p1 + srcImage->bytes_per_line); |
1778 | p1 = (unsigned short *) ((char *) p1 + srcImage->bytes_per_line); |
1779 | } |
1779 | } |
1780 | break; |
1780 | break; |
1781 | } |
1781 | } |
… | |
… | |
1789 | p = p1; |
1789 | p = p1; |
1790 | pl = p1 + srcImage->width; |
1790 | pl = p1 + srcImage->width; |
1791 | for (; p < pl; p++) |
1791 | for (; p < pl; p++) |
1792 | { |
1792 | { |
1793 | *p = lookup_r[(*p & 0xf800)>>11] | |
1793 | *p = lookup_r[(*p & 0xf800)>>11] | |
1794 | lookup_g[(*p & 0x07e0)>> 5] | |
1794 | lookup_g[(*p & 0x07e0)>> 5] | |
1795 | lookup_b[(*p & 0x001f)]; |
1795 | lookup_b[(*p & 0x001f)]; |
1796 | } |
1796 | } |
1797 | p1 = (unsigned short *) ((char *) p1 + srcImage->bytes_per_line); |
1797 | p1 = (unsigned short *) ((char *) p1 + srcImage->bytes_per_line); |
1798 | } |
1798 | } |
1799 | break; |
1799 | break; |
1800 | } |
1800 | } |
… | |
… | |
1828 | p = p1; |
1828 | p = p1; |
1829 | pl = p1 + srcImage->width; |
1829 | pl = p1 + srcImage->width; |
1830 | for (; p < pl; p++) |
1830 | for (; p < pl; p++) |
1831 | { |
1831 | { |
1832 | *p = lookup_r[(*p & 0xff0000)>>16] | |
1832 | *p = lookup_r[(*p & 0xff0000)>>16] | |
1833 | lookup_g[(*p & 0x00ff00)>> 8] | |
1833 | lookup_g[(*p & 0x00ff00)>> 8] | |
1834 | lookup_b[(*p & 0x0000ff)] | |
1834 | lookup_b[(*p & 0x0000ff)] | |
1835 | (*p & ~0xffffff); |
1835 | (*p & ~0xffffff); |
1836 | } |
1836 | } |
1837 | p1 = (RUINT32T *) ((char *) p1 + srcImage->bytes_per_line); |
1837 | p1 = (RUINT32T *) ((char *) p1 + srcImage->bytes_per_line); |
1838 | } |
1838 | } |
1839 | break; |
1839 | break; |
1840 | } |
1840 | } |