diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-08-11 09:08:12 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2015-08-11 09:08:12 +0000 |
| commit | 017d2d27bfbcd97ada407212e925b280ff3482b5 (patch) | |
| tree | 2a832873a52ee7c8546b6262be58f41d1bdd480e /src/plugins/Ui/qsui/logo.cpp | |
| parent | 22cf3c55368be9361b43eb002e7a2fb7f2868ac2 (diff) | |
| download | qmmp-017d2d27bfbcd97ada407212e925b280ff3482b5.tar.gz qmmp-017d2d27bfbcd97ada407212e925b280ff3482b5.tar.bz2 qmmp-017d2d27bfbcd97ada407212e925b280ff3482b5.zip | |
added qsui plugin
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@5367 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Ui/qsui/logo.cpp')
| -rw-r--r-- | src/plugins/Ui/qsui/logo.cpp | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/src/plugins/Ui/qsui/logo.cpp b/src/plugins/Ui/qsui/logo.cpp new file mode 100644 index 000000000..49ec2f275 --- /dev/null +++ b/src/plugins/Ui/qsui/logo.cpp @@ -0,0 +1,284 @@ +/*************************************************************************** + * Copyright (C) 2011-2014 by Ilya Kotov * + * forkotov02@hotmail.ru * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include <QPainter> +#include <QFile> +#include <QTimer> +#include <stdlib.h> +#include <qmmp/qmmp.h> +#include "logo.h" + +#define VISUAL_NODE_SIZE 128 //samples +#define VISUAL_BUFFER_SIZE (3*VISUAL_NODE_SIZE) + +Logo::Logo(QWidget *parent) : Visual(parent) +{ + QPixmap pixmap(":/qsui/terminus.png"); + m_letters.insert('0', pixmap.copy(0, 0, 8, 14)); + m_letters.insert('1', pixmap.copy(8, 0, 8, 14)); + m_letters.insert('2', pixmap.copy(16, 0, 8, 14)); + m_letters.insert('3', pixmap.copy(24, 0, 8, 14)); + m_letters.insert('4', pixmap.copy(32, 0, 8, 14)); + m_letters.insert('5', pixmap.copy(40, 0, 8, 14)); + m_letters.insert('6', pixmap.copy(48, 0, 8, 14)); + m_letters.insert('7', pixmap.copy(56, 0, 8, 14)); + m_letters.insert('8', pixmap.copy(64, 0, 8, 14)); + m_letters.insert('9', pixmap.copy(72, 0, 8, 14)); + m_letters.insert('A', pixmap.copy(80, 0, 8, 14)); + m_letters.insert('B', pixmap.copy(88, 0, 8, 14)); + m_letters.insert('C', pixmap.copy(96, 0, 8, 14)); + m_letters.insert('D', pixmap.copy(104, 0, 8, 14)); + m_letters.insert('E', pixmap.copy(112, 0, 8, 14)); + m_letters.insert('F', pixmap.copy(120, 0, 8, 14)); + m_letters.insert('/', pixmap.copy(128, 0, 8, 14)); + m_letters.insert('|', pixmap.copy(136, 0, 8, 14)); + m_letters.insert('\\', pixmap.copy(144, 0, 8, 14)); + m_letters.insert('_', pixmap.copy(152, 0, 8, 14)); + m_letters.insert('-', pixmap.copy(160, 0, 8, 14)); + m_letters.insert('X', pixmap.copy(168, 0, 8, 14)); + m_letters.insert('.', pixmap.copy(176, 0, 8, 14)); + m_letters.insert(' ', pixmap.copy(184, 0, 8, 14)); + + QFile file(":/ascii_logo.txt"); + file.open(QIODevice::ReadOnly | QIODevice::Text); + + while(!file.atEnd()) + { + QString line = file.readLine(); + m_source_lines.append(line); + } + + QTimer *m_timer = new QTimer(this); + connect(m_timer, SIGNAL(timeout()), SLOT(updateLetters())); + m_timer->setInterval(50); + m_timer->start(); + + m_buffer_at = 0; + m_value = 0; + m_elapsed = 0; + m_buffer = new short[VISUAL_BUFFER_SIZE]; + + updateLetters(); + Visual::add(this); +} + +Logo::~Logo() +{ + Visual::remove(this); +} + +void Logo::add(unsigned char *data, qint64 size, int chan) +{ + Q_UNUSED(chan); + if(VISUAL_BUFFER_SIZE == m_buffer_at) + { + m_buffer_at -= VISUAL_NODE_SIZE; + memmove(m_buffer, (short*) (m_buffer + VISUAL_NODE_SIZE), m_buffer_at * 2); + return; + } + int size_2 = qMin((int)size/2, VISUAL_BUFFER_SIZE - m_buffer_at); + memcpy((ushort*)(m_buffer + m_buffer_at), (short*) data, size_2 * 2); + m_buffer_at += size_2; +} + +void Logo::clear() +{ + update(); +} + +void Logo::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + painter.fillRect(rect(), "black"); + + for(int row = 0; row < m_lines.count(); ++row) + { + QString text = m_lines.at(row); + for(int i = 0; i < text.size(); ++i) + { + painter.drawPixmap(width() / 2 - 155 + i*8,row*14, m_letters.value(text[i])); + } + } +} + +void Logo::mousePressEvent(QMouseEvent *) +{ + m_elapsed = 2000; + m_value = 0; +} + +void Logo::updateLetters() +{ + if(m_elapsed < 2000) + { + m_value = m_elapsed / 100; + processPreset1(); + } + else if (m_elapsed >= 2000 && m_elapsed < 6000) + { + m_value++; + processPreset2(); + } + else if(m_elapsed >= 6000 && m_elapsed < 9000) + { + m_value++; + processPreset3(); + } + else if(m_elapsed >= 9000 && m_elapsed < 12000) + { + processPreset4(); + } + else if(m_elapsed >= 12000) + { + m_value = 0; + m_elapsed = 0; + } + m_elapsed += 50; +} + +void Logo::processPreset1() +{ + m_lines.clear(); + mutex()->lock(); + QString line; + for(int i = 0; i < m_source_lines.count(); ++i) + { + line = m_source_lines[i]; + line = line.replace("X", "."); + if(m_value == i) + { + line.remove(0,2); + line.append(" "); + } + else if(m_value == i - 1 || m_value == i + 1) + { + line.remove(0,1); + line.append(" "); + } + m_lines.append(line); + } + mutex()->unlock(); + update(); +} + +void Logo::processPreset2() +{ + m_lines.clear(); + mutex()->lock(); + QString str = QString("..0000..");//.arg(Qmmp::strVersion().left(5)); + int at = m_value % str.size(); + + foreach(QString line, m_source_lines) + { + while(line.contains("X")) + { + at++; + line.replace(line.indexOf("X"), 1, QString("%1").arg(str.at(at % str.size()), + 0, 16).toUpper()); + } + + m_lines.append(line); + } + mutex()->unlock(); + update(); +} + +void Logo::processPreset3() +{ + m_lines.clear(); + mutex()->lock(); + QString str = QString("...%1...").arg(Qmmp::strVersion().left(5)); + int at = m_value % str.size(); + + foreach(QString line, m_source_lines) + { + while(line.contains("X")) + { + at++; + line.replace(line.indexOf("X"), 1, QString("%1").arg(str.at(at % str.size()), + 0, 16).toUpper()); + } + + m_lines.append(line); + } + mutex()->unlock(); + update(); +} + +void Logo::processPreset4() +{ + m_lines.clear(); + mutex()->lock(); + + int max = 0; + + if(m_buffer_at < VISUAL_NODE_SIZE) + { + m_value -= 512; + m_value = qMax(m_value, max); + } + else + { + for(int j = 0; j < VISUAL_NODE_SIZE; j+=8) + { + if(m_buffer[j] > max) + max = m_buffer[j]; + } + + m_buffer_at -= VISUAL_NODE_SIZE; + memmove(m_buffer, m_buffer + VISUAL_NODE_SIZE, m_buffer_at * 2); + m_value -= 512; + m_value = qMax(m_value, max); + } + + int at = 0; + + foreach(QString line, m_source_lines) + { + + int count = line.count("X"); + int k = 0; + + while(k < m_value * count / 2048 / 16 / 2) + { + int value = abs(m_buffer[qMin(at++, m_buffer_at)] / 2048); + line.replace(line.indexOf("X"), 1, QString("%1").arg(value, 0, 16).toUpper()); + k++; + } + + k = 0; + + while(k < m_value * count / 2048 / 16 / 2) + { + int value = abs(m_buffer[qMin(at++, m_buffer_at)] / 2048); + line.replace(line.lastIndexOf("X"), 1, QString("%1").arg(value, 0, 16).toUpper()); + k++; + } + + while(line.contains("X")) + { + line.replace(line.indexOf("X"), 1, "."); + } + + m_lines.append(line); + } + mutex()->unlock(); + update(); +} |
