2014-05-22 16:33:21 +02:00
|
|
|
/* This file is part of Clementine.
|
2014-11-29 20:07:01 +01:00
|
|
|
Copyright 2014, Alibek Omarov <a1ba.omarov@gmail.com>
|
Add "Psychedelic Colour" mode to all analyzers
(Well, except Nyanalyzer and Rainbow dash because they are already colourful enough.)
I have added functionality for any 2D analyzer to change any part of its colour palatte with the frequency content of the music, in the same way that Moodbars do.
I find this gives the analyzer a sort of "third dimention".
This is built into Analyzer::Base, so all analyzers can use it and override it as they please. I have thus added support for Block, Boom, Turbine, Sonogram, and Bar, however Boom and Block seem to look the best in my opinion.
This is of course all optional and is toggled by a checkbox in the context menu for the analyzer, disabled by default.
I have not been able to measure any increase in CPU activity with this enabled, even at 60fps.
2015-07-01 17:48:03 +02:00
|
|
|
Copyright 2014-2015, Mark Furneaux <mark@furneaux.ca>
|
2014-11-29 20:07:01 +01:00
|
|
|
Copyright 2014, Krzysztof Sobiecki <sobkas@gmail.com>
|
2014-05-22 16:33:21 +02:00
|
|
|
|
|
|
|
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 <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2014-11-29 20:07:01 +01:00
|
|
|
#ifndef ANALYZERS_RAINBOWDASHANALYZER_H_
|
|
|
|
#define ANALYZERS_RAINBOWDASHANALYZER_H_
|
2014-05-22 16:33:21 +02:00
|
|
|
|
|
|
|
#include "analyzerbase.h"
|
|
|
|
|
|
|
|
#include <QDateTime>
|
|
|
|
|
|
|
|
class RainbowDashAnalyzer : public Analyzer::Base {
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
|
|
|
Q_INVOKABLE RainbowDashAnalyzer(QWidget* parent);
|
|
|
|
|
|
|
|
static const char* kName;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
void transform(Analyzer::Scope&);
|
|
|
|
void analyze(QPainter& p, const Analyzer::Scope&, bool new_frame);
|
|
|
|
|
|
|
|
void timerEvent(QTimerEvent* e);
|
|
|
|
void resizeEvent(QResizeEvent* e);
|
|
|
|
|
|
|
|
private:
|
2014-06-18 19:37:43 +02:00
|
|
|
static const int kDashHeight = 33;
|
|
|
|
static const int kDashWidth = 53;
|
2014-05-22 16:33:21 +02:00
|
|
|
static const int kRainbowHeight = 16;
|
2014-06-18 19:37:43 +02:00
|
|
|
static const int kDashFrameCount = 16;
|
2014-05-22 16:33:21 +02:00
|
|
|
static const int kRainbowOverlap = 15;
|
2014-06-18 19:37:43 +02:00
|
|
|
static const int kSleepingDashHeight = 33;
|
2014-05-22 16:33:21 +02:00
|
|
|
|
|
|
|
static const int kHistorySize = 128;
|
|
|
|
static const int kRainbowBands = 6;
|
|
|
|
static const float kPixelScale;
|
|
|
|
|
|
|
|
static const int kFrameIntervalMs = 150;
|
|
|
|
|
|
|
|
private:
|
|
|
|
inline QRect DashSourceRect() const {
|
|
|
|
return QRect(0, kDashHeight * frame_, kDashWidth, kDashHeight);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline QRect SleepingDashSourceRect() const {
|
|
|
|
return QRect(0, kDashHeight * kDashFrameCount, kDashWidth,
|
|
|
|
kSleepingDashHeight);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline QRect DashDestRect() const {
|
|
|
|
return QRect(width() - kDashWidth, (height() - kDashHeight) / 2, kDashWidth,
|
|
|
|
kDashHeight);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline QRect SleepingDashDestRect() const {
|
|
|
|
return QRect(width() - kDashWidth, (height() - kSleepingDashHeight) / 2,
|
|
|
|
kDashWidth, kSleepingDashHeight);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
// "constants" that get initialised in the constructor
|
|
|
|
float band_scale_[kRainbowBands];
|
|
|
|
QPen colors_[kRainbowBands];
|
|
|
|
|
|
|
|
QPixmap dash_;
|
|
|
|
|
|
|
|
// For the animation
|
|
|
|
int timer_id_;
|
|
|
|
int frame_;
|
|
|
|
|
|
|
|
// The y positions of each point on the rainbow.
|
|
|
|
float history_[kHistorySize * kRainbowBands];
|
|
|
|
|
|
|
|
// A cache of the last frame's rainbow, so it can be used in the next frame.
|
|
|
|
QPixmap buffer_[2];
|
|
|
|
int current_buffer_;
|
|
|
|
|
|
|
|
// Geometry information that's updated on resize:
|
|
|
|
// The width of the widget minus the space for the pony
|
|
|
|
int available_rainbow_width_;
|
|
|
|
|
|
|
|
// X spacing between each point in the polyline.
|
|
|
|
int px_per_frame_;
|
|
|
|
|
|
|
|
// Amount the buffer_ is shifted to the left (off the edge of the widget) to
|
|
|
|
// make the rainbow extend from 0 to available_rainbow_width_.
|
|
|
|
int x_offset_;
|
|
|
|
|
|
|
|
QBrush background_brush_;
|
|
|
|
};
|
|
|
|
|
2014-11-29 20:07:01 +01:00
|
|
|
#endif // ANALYZERS_RAINBOWDASHANALYZER_H_
|