49 512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,
50 454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,
51 482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,
52 437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,
53 497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,
54 320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,
55 446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,
56 329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,
57 505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,
58 399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,
59 324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,
60 268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,
61 451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,
62 385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,
63 332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,
64 289,287,285,282,280,278,275,273,271,269,267,265,263,261,259
69 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17,
70 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19,
71 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,
72 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,
73 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
74 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22,
75 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
76 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,
77 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
78 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
79 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
80 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
81 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
82 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
83 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
84 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24
87 inline static void blurHorizontal(QImage &image,
unsigned int *stack,
int div,
int radius)
92 quint32 *
const pixels =
reinterpret_cast<quint32 *
>(image.bits());
95 int w = image.width();
96 int h = image.height();
102 unsigned int sum, sum_in, sum_out;
104 for (
int y = 0; y < h; y++)
110 const int yw = y * w;
112 for (
int i = 0; i <= radius; i++)
114 stack[i] = qAlpha(pixel);
116 sum += stack[i] * (i + 1);
120 for (
int i = 1; i <= radius; i++)
122 pixel = pixels[yw + qMin(i, wm)];
124 unsigned int *stackpix = &stack[i + radius];
125 *stackpix = qAlpha(pixel);
127 sum += *stackpix * (radius + 1 - i);
132 for (
int x = 0, i = yw; x < w; x++)
134 pixels[i++] = (((sum * mul_sum) >> shr_sum) << 24) & 0xff000000;
138 stackstart = stackindex + div - radius;
139 if (stackstart >= div)
142 unsigned int *stackpix = &stack[stackstart];
144 sum_out -= *stackpix;
146 pixel = pixels[yw + qMin(x + radius + 1, wm)];
148 *stackpix = qAlpha(pixel);
153 if (++stackindex >= div)
156 stackpix = &stack[stackindex];
158 sum_out += *stackpix;
164 inline static void blurVertical(QImage &image,
unsigned int *stack,
int div,
int radius)
169 quint32 *
const pixels =
reinterpret_cast<quint32 *
>(image.bits());
172 int w = image.width();
173 int h = image.height();
179 unsigned int sum, sum_in, sum_out;
181 for (
int x = 0; x < w; x++)
188 for (
int i = 0; i <= radius; i++)
190 stack[i] = qAlpha(pixel);
192 sum += stack[i] * (i + 1);
196 for (
int i = 1; i <= radius; i++)
198 pixel = pixels[qMin(i, hm) * w + x];
200 unsigned int *stackpix = &stack[i + radius];
201 *stackpix = qAlpha(pixel);
203 sum += *stackpix * (radius + 1 - i);
208 for (
int y = 0, i = x; y < h; y++, i += w)
210 pixels[i] = (((sum * mul_sum) >> shr_sum) << 24) & 0xff000000;
214 stackstart = stackindex + div - radius;
215 if (stackstart >= div)
218 unsigned int *stackpix = &stack[stackstart];
220 sum_out -= *stackpix;
222 pixel = pixels[qMin(y + radius + 1, hm) * w + x];
224 *stackpix = qAlpha(pixel);
229 if (++stackindex >= div)
232 stackpix = &stack[stackindex];
234 sum_out += *stackpix;
242 radius = qRound(radius);
244 int div = int(radius * 2) + 1;
245 unsigned int *stack =
new unsigned int[div];
263 p.setCompositionMode(QPainter::CompositionMode_SourceIn);
264 p.fillRect(image.rect(), color);
static void blurVertical(QImage &image, unsigned int *stack, int div, int radius)
static void stackBlur(QImage &image, float radius)
static const quint32 stack_blur8_shr[255]
static void blurHorizontal(QImage &image, unsigned int *stack, int div, int radius)
static const quint32 stack_blur8_mul[255]
static void shadowBlur(QImage &image, float radius, const QColor &color)