20 #include <QCoreApplication> 37 setStarSize(m_starSize);
48 #define sBOUND(x) ((x) > 255 ? 255 : (x)) 49 #define sPEAKIFY(x) int(sBOUND((x) - (x)*(255-(x))/255/2)) 50 #define sMAX(x,y) ((x) > (y) ? (x) : (y)) 51 double fgRed = m_fgRedSlider;
52 double fgGreen = m_fgGreenSlider;
53 double fgBlue = 1.0 -
sMAX(m_fgRedSlider,m_fgGreenSlider);
55 double scale = (fgRed + fgGreen + fgBlue) / 2.0;
60 double bgRed = m_bgRedSlider;
61 double bgGreen = m_bgGreenSlider;
62 double bgBlue = 1.0 -
sMAX(m_bgRedSlider,m_bgGreenSlider);
64 scale = (bgRed + bgGreen + bgBlue) / 2.0;
69 for (
int i = 0; i < 256; i++) {
70 int f = i & 15, b = i / 16;
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] =
sBOUND(
int(red));
99 m_palette[i * 3 + 1] =
sBOUND(
int(green));
100 m_palette[i * 3 + 2] =
sBOUND(
int(blue));
108 m_size.setHeight(m_size.height() / 2);
109 m_size.setWidth((m_size.width() / 4) * 4);
110 m_outputBmp.size(m_size.width(), m_size.height());
111 m_lastOutputBmp.size(m_size.width(), m_size.height());
112 m_lastLastOutputBmp.size(m_size.width(), m_size.height());
113 m_outWidth = m_size.width();
114 m_outHeight = m_size.height();
116 delete m_outputImage;
118 m_size.setHeight(m_size.height() * 2);
119 m_outputImage =
new QImage(m_size, QImage::Format_Indexed8);
123 LOG(VB_GENERAL, LOG_ERR,
124 "outputImage in Synaesthesia::resize() is NULL");
128 for (
int i = 0; i < 256; i++)
129 m_outputImage->setColor(i, qRgba(m_palette[i * 3], m_palette[i * 3 + 1],
130 m_palette[i * 3 + 2], 255));
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++)
145 sdlPalette[i].r = m_palette[i * 3];
146 sdlPalette[i].g = m_palette[i * 3 + 1];
147 sdlPalette[i].b = m_palette[i * 3 + 2];
150 SDL_SetColors(surface, sdlPalette, 0, 256);
157 for (
int j = 0; j <
LogSize; j++)
159 sum = (i & 1) + sum * 2;
169 for (
int twoToTheK = 1; twoToTheK <
NumSamples; twoToTheK *= 2)
173 for (
int j = 0; j < n2; j++)
175 double c = m_cosTable[j * twoToTheK & (
NumSamples - 1)],
176 s = m_negSinTable[j * twoToTheK & (
NumSamples - 1)];
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;
193 double fadeModeFudge = (m_fadeMode ==
Wave ? 0.4 :
194 (m_fadeMode ==
Flame ? 0.6 : 0.78));
198 factor = int(exp(
log(fadeModeFudge) / (lsize * 8.0)) * 255);
202 for (
int i = 0; i < 256; i++)
203 m_scaleDown[i] = i * factor>>8;
206 for (
int i = 255; i; i = m_scaleDown[i])
214 m_negSinTable[i] = -sin(3.141592 * 2.0 /
NumSamples * i);
215 m_cosTable[i] = cos(3.141592 * 2.0 /
NumSamples * i);
216 m_bitReverse[i] = bitReverser(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) 226 if (x < 0 || x > m_outWidth || y < 0 || y >= m_outHeight)
229 unsigned char *
p =
output + x * 2 + y * m_outWidth * 2;
230 if (
p[0] + br1 < 255)
234 if (
p[1] + br2 < 255)
242 if (
p[0] + br1 < 255)
246 if (
p[1] + br2 < 255)
254 if (x < 0 || y < 0 || x >= m_outWidth || y >= m_outHeight)
262 auto *ptr = (uint32_t *)
output;
263 int i = m_outWidth * m_outHeight * 2 /
sizeof(uint32_t);
267 *(ptr++) = x - ((x & (uintptr_t)0xf0f0f0f0) >> 4) -
268 ((x & (uintptr_t)0xe0e0e0e0) >> 5);
276 short j = short((
int(getPixel(x - 1, y, where - 2)) +
277 int(getPixel(x + 1, y, where + 2)) +
278 int(getPixel(x, y - 1, where - step)) +
279 int(getPixel(x, y + 1, where + step))) >> 2) +
290 else if (j & (255 * 256))
298 unsigned short *
t = m_lastLastOutputBmp.data;
299 m_lastLastOutputBmp.data = m_lastOutputBmp.data;
300 m_lastOutputBmp.data = m_outputBmp.data;
301 m_outputBmp.data =
t;
303 int step = m_outWidth*2;
304 for (
int x = 0, i = 0, j = m_outWidth * (m_outHeight - 1) * 2;
305 x < m_outWidth; x++, i += 2, j += 2)
307 fadePixelWave(x, 0, i, step);
308 fadePixelWave(x, 0, i + 1, step);
309 fadePixelWave(x, m_outHeight - 1, j, step);
310 fadePixelWave(x, m_outHeight - 1, j + 1, step);
313 for (
int y = 1, i = m_outWidth * 2, j = m_outWidth * 4 - 2;
314 y < m_outHeight; y++, i += step, j += step)
316 fadePixelWave(0, y, i, step);
317 fadePixelWave(0, y, i + 1, step);
318 fadePixelWave(m_outWidth - 1, y, j, step);
319 fadePixelWave(m_outWidth - 1, y, j + 1, step);
322 for (
int y = 1, start = m_outWidth * 2 + 2, end = m_outWidth * 4 - 2;
323 y < m_outHeight - 1; y++, start += step, end += step)
342 else if (j2 & (255*256))
353 short j = short((
int(getPixel(x - 1, y, where - 2)) +
354 int(getPixel(x + 1, y, where + 2)) +
355 int(getPixel(x, y - 1, where - step)) +
356 int(getPixel(x, y + 1, where + step))) >> 2) +
366 else if (j & (255 * 256))
374 unsigned short *
t = m_lastLastOutputBmp.data;
375 m_lastLastOutputBmp.data = m_lastOutputBmp.data;
376 m_lastOutputBmp.data = m_outputBmp.data;
377 m_outputBmp.data =
t;
379 int step = m_outWidth * 2;
380 for (
int x = 0, i = 0, j = m_outWidth * (m_outHeight - 1) * 2;
381 x < m_outWidth; x++, i += 2, j += 2)
383 fadePixelHeat(x, 0, i, step);
384 fadePixelHeat(x, 0, i + 1, step);
385 fadePixelHeat(x, m_outHeight - 1, j, step);
386 fadePixelHeat(x, m_outHeight - 1, j + 1, step);
389 for(
int y = 1, i = m_outWidth * 2, j = m_outWidth * 4 - 2; y < m_outHeight;
390 y++, i += step, j += step)
392 fadePixelHeat(0, y, i, step);
393 fadePixelHeat(0, y, i + 1, step);
394 fadePixelHeat(m_outWidth - 1, y, j, step);
395 fadePixelHeat(m_outWidth - 1, y, j + 1, step);
398 for(
int y = 1, start = m_outWidth * 2 + 2, end = m_outWidth * 4 - 2;
399 y < m_outHeight - 1; y++, start += step, end += step)
417 else if (j2 & (255*256))
430 case Stars: fadeFade();
break;
431 case Flame: fadeHeat();
break;
432 case Wave: fadeWave();
break;
448 int brightFactor = int(
Brightness * m_brightnessTwiddler / (m_starSize + 0.01));
454 memset(x, 0,
sizeof(x));
455 memset(y, 0,
sizeof(y));
457 for (
int i = 0; i < numSamps; i++)
472 double x1 = x[m_bitReverse[i]],
473 y1 = y[m_bitReverse[i]],
477 a[i] = sqrt(aa = (
x1 +
x2) * (
x1 +
x2) + (y1 - y2) * (y1 - y2));
478 b[i] = sqrt(bb = (
x1 -
x2) * (
x1 -
x2) + (y2 + y2) * (y1 + y2));
480 clarity[i] = (int)(((
x1 +
x2) * (
x1 -
x2) + (y1 + y2) * (y1 - y2)) /
485 energy += (aa + bb) * i * i;
494 double brightFactor2 = (brightFactor / 65536.0 /
NumSamples) *
495 sqrt(m_outHeight * m_outWidth / (320.0 * 200.0));
497 m_energy_avg = m_energy_avg * 0.95 + energy * 0.05;
498 if (m_energy_avg > 0.0)
499 brightFactor2 *= 80.0 / (m_energy_avg + 5.0);
503 if (a[i] > 0 || b[i] > 0)
505 int h = (int)(b[i] * m_outWidth / (a[i] + b[i]));
506 int br = (int)((a[i] + b[i]) * i * brightFactor2);
507 int br1 = br * (clarity[i] + 128) >> 8;
508 int br2 = br * (128 - clarity[i]) >> 8;
509 if (br1 < 0) br1 = 0;
else if (br1 > 255) br1 = 255;
510 if (br2 < 0) br2 = 0;
else if (br2 > 255) br2 = 255;
513 py = m_outHeight - i * m_outHeight / (
NumSamples / 2);
515 if (m_pointsAreDiamonds)
517 addPixel(px, py, br1, br2);
518 br1 = m_scaleDown[br1];
519 br2 = m_scaleDown[br2];
521 for(
int j = 1; br1 > 0 || br2 > 0;
522 j++, br1 = m_scaleDown[br1], br2 = m_scaleDown[br2])
524 for (
int k = 0; k < j; k++)
526 addPixel(px - j + k,py - k, br1, br2);
527 addPixel(px + k, py - j + k, br1, br2);
528 addPixel(px + j - k, py + k, br1, br2);
529 addPixel(px - k, py + j - k, br1, br2);
535 if (px < m_maxStarRadius || py < m_maxStarRadius ||
536 px > m_outWidth - m_maxStarRadius ||
537 py > m_outHeight - m_maxStarRadius)
539 addPixel(px, py, br1, br2);
540 for(
int j = 1; br1 > 0 || br2 > 0;
541 j++, br1 = m_scaleDown[br1], br2 = m_scaleDown[br2])
543 addPixel(px + j, py, br1, br2);
544 addPixel(px, py + j, br1, br2);
545 addPixel(px - j, py, br1, br2);
546 addPixel(px, py - j, br1, br2);
551 unsigned char *
p =
output + px * 2 + py * m_outWidth * 2,
553 addPixelFast(
p, br1, br2);
554 for (; br1 > 0 || br2 > 0;
555 br1 = m_scaleDown[br1], br2 = m_scaleDown[br2])
558 addPixelFast(
p1, br1, br2);
560 addPixelFast(
p2, br1, br2);
561 p3 += m_outWidth * 2;
562 addPixelFast(p3, br1, br2);
564 addPixelFast(p4, br1, br2);
581 auto *ptrOutput = (uint32_t *)
output;
583 for (
int j = 0; j < m_outHeight * 2; j += 2)
585 auto *ptrTop = (uint32_t *)(m_outputImage->scanLine(j));
586 auto *ptrBot = (uint32_t *)(m_outputImage->scanLine(j+1));
588 int i = m_outWidth / 4;
592 unsigned int const r1 = *(ptrOutput++);
593 unsigned int const r2 = *(ptrOutput++);
595 unsigned int const v = ((r1 & 0x000000f0UL) >> 4) |
596 ((r1 & 0x0000f000UL) >> 8) |
597 ((r1 & 0x00f00000UL) >> 12) |
598 ((r1 & 0xf0000000UL) >> 16);
600 *(ptrTop++) = v | (((r2 & 0x000000f0UL) << 12) |
601 ((r2 & 0x0000f000UL) << 8) |
602 ((r2 & 0x00f00000UL) << 4) |
603 ((r2 & 0xf0000000UL)));
605 *(ptrBot++) = v | (((r2 & 0x000000f0UL) << 12) |
606 ((r2 & 0x0000f000UL) << 8) |
607 ((r2 & 0x00f00000UL) << 4) |
608 ((r2 & 0xf0000000UL)));
612 p->drawImage(0, 0, *m_outputImage);
620 const QString &
name(
void)
const override 622 static QString s_name = QCoreApplication::translate(
"Visualizers",
VisualBase * create(MainVisual *parent, const QString &pluginName) const override
void fadePixelWave(int x, int y, int where, int step)
uint plugins(QStringList *list) const override
bool draw(QPainter *p, const QColor &back) override
unsigned char getPixel(int x, int y, int where)
static void addPixelFast(unsigned char *p, int br1, int br2)
SynaesthesiaFactory SynaesthesiaFactory
static int bitReverser(int i)
void setStarSize(double lsize)
void addPixel(int x, int y, int br1, int br2)
void resize(const QSize &size) override
#define LOG(_MASK_, _LEVEL_, _STRING_)
void fadePixelHeat(int x, int y, int where, int step)
void fft(double *x, double *y)
const QString & name(void) const override
bool process(VisualNode *node) override