diff --git a/data/data.qrc b/data/data.qrc index a4d776abd..3d7d6dabc 100644 --- a/data/data.qrc +++ b/data/data.qrc @@ -339,5 +339,6 @@ pythonlibs/uic/properties.py pythonlibs/uic/uiparser.py pythonlibs/clementinelogging.py + nyancat.png diff --git a/data/nyancat.png b/data/nyancat.png new file mode 100644 index 000000000..a129ea0f2 Binary files /dev/null and b/data/nyancat.png differ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2254244bf..fa8c89971 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -59,6 +59,7 @@ set(SOURCES analyzers/baranalyzer.cpp analyzers/blockanalyzer.cpp analyzers/boomanalyzer.cpp + analyzers/nyancatanalyzer.cpp analyzers/sonogram.cpp analyzers/turbine.cpp @@ -301,6 +302,7 @@ set(HEADERS analyzers/baranalyzer.h analyzers/blockanalyzer.h analyzers/boomanalyzer.h + analyzers/nyancatanalyzer.h analyzers/sonogram.h analyzers/turbine.h diff --git a/src/analyzers/analyzercontainer.cpp b/src/analyzers/analyzercontainer.cpp index 7e98b2bdf..aa60dc31e 100644 --- a/src/analyzers/analyzercontainer.cpp +++ b/src/analyzers/analyzercontainer.cpp @@ -19,6 +19,7 @@ #include "baranalyzer.h" #include "blockanalyzer.h" #include "boomanalyzer.h" +#include "nyancatanalyzer.h" #include "sonogram.h" #include "turbine.h" #include "core/logging.h" @@ -72,6 +73,8 @@ AnalyzerContainer::AnalyzerContainer(QWidget *parent) AddAnalyzerType(); AddAnalyzerType(); AddAnalyzerType(); + AddAnalyzerType(); + connect(mapper_, SIGNAL(mapped(int)), SLOT(ChangeAnalyzer(int))); disable_action_ = context_menu_->addAction(tr("No analyzer"), this, SLOT(DisableAnalyzer())); diff --git a/src/analyzers/nyancatanalyzer.cpp b/src/analyzers/nyancatanalyzer.cpp new file mode 100644 index 000000000..f86cdb486 --- /dev/null +++ b/src/analyzers/nyancatanalyzer.cpp @@ -0,0 +1,110 @@ +/* This file is part of Clementine. + Copyright 2010, David Sansome + + Clementine 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 3 of the License, or + (at your option) any later version. + + Clementine 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 Clementine. If not, see . +*/ + +#include "nyancatanalyzer.h" +#include "core/logging.h" + +#include + +#include + +const char* NyanCatAnalyzer::kName = "Nyan nyan nyan"; + + +NyanCatAnalyzer::NyanCatAnalyzer(QWidget* parent) + : Analyzer::Base(parent, 9), + cat_(":/nyancat.png"), + timer_id_(startTimer(kFrameIntervalMs)), + frame_(0) +{ + memset(history_, 0, sizeof(history_)); + + for (int i=0 ; ispectrum(&s.front()); +} + +void NyanCatAnalyzer::timerEvent(QTimerEvent* e) { + if (e->timerId() == timer_id_) { + frame_ = (frame_ + 1) % kCatFrameCount; + } else { + Analyzer::Base::timerEvent(e); + } +} + +void NyanCatAnalyzer::analyze(QPainter& p, const Analyzer::Scope& s) { + // Discard the second half of the transform + const int scope_size = s.size() / 2; + + // Transform the music into rainbows! + for (int band=0 ; band=0 ; --band) { + p.setPen(colors_[band]); + p.drawPolyline(&polyline[band*kHistorySize], kHistorySize); + } + + // Draw nyan cat (he's been waiting for this for 50 lines). + // Nyan nyan nyan nyan. + QRect cat_dest(width() - kCatWidth, (height() - kCatHeight) / 2, + kCatWidth, kCatHeight); + p.drawPixmap(cat_dest, cat_, CatSourceRect()); +} diff --git a/src/analyzers/nyancatanalyzer.h b/src/analyzers/nyancatanalyzer.h new file mode 100644 index 000000000..411f5d320 --- /dev/null +++ b/src/analyzers/nyancatanalyzer.h @@ -0,0 +1,67 @@ +/* This file is part of Clementine. + Copyright 2010, David Sansome + + Clementine 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 3 of the License, or + (at your option) any later version. + + Clementine 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 Clementine. If not, see . +*/ + +#ifndef NYANCATANALYZER_H +#define NYANCATANALYZER_H + +#include "analyzerbase.h" + +#include + + +class NyanCatAnalyzer : public Analyzer::Base { + Q_OBJECT + +public: + Q_INVOKABLE NyanCatAnalyzer(QWidget* parent); + + static const char* kName; + + void timerEvent(QTimerEvent* e); + +protected: + void transform( Scope& ); + void analyze( QPainter& p, const Analyzer::Scope& ); + +private: + static const int kCatHeight = 21; + static const int kCatWidth = 34; + static const int kCatFrameCount = 5; + static const int kRainbowOverlap = 13; + + static const int kHistorySize = 256; + static const int kRainbowBands = 6; + static const float kPixelScale = 0.01; + + static const int kFrameIntervalMs = 150; + +private: + inline QRect CatSourceRect() const { + return QRect(0, kCatHeight * frame_, kCatWidth, kCatHeight); + } + +private: + QPixmap cat_; + + int timer_id_; + int frame_; + + float history_[kHistorySize * kRainbowBands]; + QPen colors_[kRainbowBands]; +}; + +#endif // NYANCATANALYZER_H