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