17 #include <QCoreApplication>
54 double scale = (fgRed + fgGreen + fgBlue) / 2.0;
63 scale = (bgRed + bgGreen + bgBlue) / 2.0;
68 for (
int i = 0; i < 256; i++) {
75 double red = b * bgRed * 16 + f * fgRed * 16;
76 double green = b * bgGreen * 16 + f * fgGreen * 16;
77 double blue = b * bgBlue * 16 + f * fgBlue * 16;
80 for (
int j = 0; j < 5; j++)
88 if (red > 255) { excess += red - 255; red = 255; }
89 if (green > 255) { excess += green - 255; green = 255; }
90 if (blue > 255) { excess += blue - 255; blue = 255; }
93 double scale2 = (0.5 + (red + green + blue) / 768.0) / 1.5;
98 m_palette[i * 3 + 0] = std::clamp(
int(red), 0, 255);
99 m_palette[i * 3 + 1] = std::clamp(
int(green), 0, 255);
100 m_palette[i * 3 + 2] = std::clamp(
int(blue), 0, 255);
123 LOG(VB_GENERAL, LOG_ERR,
124 "outputImage in Synaesthesia::resize() is NULL");
128 for (
size_t i = 0; i < 256; i++)
133 surface = SDL_SetVideoMode(size.width(), size.height(), 8, 0);
137 LOG(VB_GENERAL, LOG_ERR,
"Couldn't get SDL surface");
141 SDL_Color sdlPalette[256];
143 for (
int i = 0; i < 256; i++)
150 SDL_SetColors(surface, sdlPalette, 0, 256);
157 for (
size_t j = 0; j <
LogSize; j++)
159 sum = (i & 1) + sum * 2;
169 for (
size_t twoToTheK = 1; twoToTheK <
NumSamples; twoToTheK *= 2)
173 for (
size_t j = 0; j < n2; j++)
180 double xt = x[i] - x[l];
181 x[i] = (x[i] + x[l]);
182 double yt = y[i] - y[l];
183 y[i] = (y[i] + y[l]);
184 x[l] = xt * c - yt * s;
185 y[l] = xt * s + yt * c;
198 factor = int(exp(
log(fadeModeFudge) / (lsize * 8.0)) * 255);
202 for (
int i = 0; i < 256; i++)
220 #define output ((unsigned char*)m_outputBmp.data)
221 #define lastOutput ((unsigned char*)m_lastOutputBmp.data)
222 #define lastLastOutput ((unsigned char*)m_lastLastOutputBmp.data)
229 unsigned char *
p =
output +
static_cast<ptrdiff_t
>(x) * 2 +
231 if (
p[0] + br1 < 255)
235 if (
p[1] + br2 < 255)
243 if (
p[0] + br1 < 255)
247 if (
p[1] + br2 < 255)
263 auto *ptr = (uint32_t *)
output;
269 *(ptr++) = x - ((x & (uintptr_t)0xf0f0f0f0) >> 4) -
270 ((x & (uintptr_t)0xe0e0e0e0) >> 5);
281 short j = short((
int(
getPixel(x - 1, y, where - 2)) +
282 int(
getPixel(x + 1, y, where + 2)) +
283 int(
getPixel(x, y - 1, where - step)) +
284 int(
getPixel(x, y + 1, where + step))) >> 2) +
295 else if (j & (255 * 256))
328 y <
m_outHeight - 1; y++, start += step, end += step)
347 else if (j2 & (255*256))
358 short j = short((
int(
getPixel(x - 1, y, where - 2)) +
359 int(
getPixel(x + 1, y, where + 2)) +
360 int(
getPixel(x, y - 1, where - step)) +
361 int(
getPixel(x, y + 1, where + step))) >> 2) +
371 else if (j & (255 * 256))
395 y++, i += step, j += step)
404 y <
m_outHeight - 1; y++, start += step, end += step)
422 else if (j2 & (255*256))
461 for (
size_t i = 0; i < numSamps; i++)
470 fft(x.data(), y.data());
474 for (
size_t i = 0 + 1; i <
NumSamples / 2; i++)
482 a[i] = sqrt(aa = (
x1 +
x2) * (
x1 +
x2) + (y1 - y2) * (y1 - y2));
483 b[i] = sqrt(bb = (
x1 -
x2) * (
x1 -
x2) + (y2 + y2) * (y1 + y2));
486 clarity[i] = (int)(((
x1 +
x2) * (
x1 -
x2) + (y1 + y2) * (y1 - y2)) /
494 energy += (aa + bb) * i * i;
503 double brightFactor2 = (brightFactor / 65536.0 /
NumSamples) *
512 if (a[i] > 0 || b[i] > 0)
514 int h = (int)(b[i] *
m_outWidth / (a[i] + b[i]));
515 int br = (int)((a[i] + b[i]) * i * brightFactor2);
516 int br1 = br * (clarity[i] + 128) >> 8;
517 int br2 = br * (128 - clarity[i]) >> 8;
518 if (br1 < 0) br1 = 0;
else if (br1 > 255) br1 = 255;
519 if (br2 < 0) br2 = 0;
else if (br2 > 255) br2 = 255;
530 for(
int j = 1; br1 > 0 || br2 > 0;
533 for (
int k = 0; k < j; k++)
535 addPixel(px - j + k,py - k, br1, br2);
536 addPixel(px + k, py - j + k, br1, br2);
537 addPixel(px + j - k, py + k, br1, br2);
538 addPixel(px - k, py + j - k, br1, br2);
549 for(
int j = 1; br1 > 0 || br2 > 0;
560 unsigned char *
p =
output +
static_cast<ptrdiff_t
>(px) * 2 +
562 unsigned char *
p1 =
p;
563 unsigned char *
p2 =
p;
564 unsigned char *p3 =
p;
565 unsigned char *p4 =
p;
567 for (; br1 > 0 || br2 > 0;
594 auto *ptrOutput = (uint32_t *)
output;
605 unsigned int const r1 = *(ptrOutput++);
606 unsigned int const r2 = *(ptrOutput++);
608 unsigned int const v = ((r1 & 0x000000f0UL) >> 4) |
609 ((r1 & 0x0000f000UL) >> 8) |
610 ((r1 & 0x00f00000UL) >> 12) |
611 ((r1 & 0xf0000000UL) >> 16);
613 *(ptrTop++) = v | (((r2 & 0x000000f0UL) << 12) |
614 ((r2 & 0x0000f000UL) << 8) |
615 ((r2 & 0x00f00000UL) << 4) |
616 ((r2 & 0xf0000000UL)));
618 *(ptrBot++) = v | (((r2 & 0x000000f0UL) << 12) |
619 ((r2 & 0x0000f000UL) << 8) |
620 ((r2 & 0x00f00000UL) << 4) |
621 ((r2 & 0xf0000000UL)));
633 const QString &
name(
void)
const override
635 static QString s_name = QCoreApplication::translate(
"Visualizers",