Files
EqualizerAPO/Editor/AnalysisPlotView.cpp
T
jthedering 0895d84055 Added: Analysis panel which shows the calculated frequency response of the filters for the selected device and channel.
Improved: GUIs of GraphicEQ and Copy command can now be resized
Improved: GraphicEQ GUI can now be zoomed separately in X and Y direction using mouse wheel on rulers. Also now shows values at mouse position.
Fixed: Original APO was not released when E-APO was shutting down, leading to a memory leak.
2015-11-07 19:00:49 +00:00

81 lines
2.3 KiB
C++

/*
This file is part of EqualizerAPO, a system-wide equalizer.
Copyright (C) 2015 Jonas Thedering
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 <algorithm>
#include "helpers/GainIterator.h"
#include "AnalysisPlotScene.h"
#include "AnalysisPlotView.h"
using namespace std;
AnalysisPlotView::AnalysisPlotView(QWidget* parent)
: FrequencyPlotView(parent)
{
}
void AnalysisPlotView::drawBackground(QPainter* painter, const QRectF& rect)
{
FrequencyPlotView::drawBackground(painter, rect);
painter->setRenderHint(QPainter::Antialiasing, true);
AnalysisPlotScene* s = qobject_cast<AnalysisPlotScene*>(scene());
std::vector<FilterNode>& nodes = s->getNodes();
GainIterator gainIterator(nodes);
QPainterPath path;
bool first = true;
double lastDb = -1000;
for(int x = rect.left() - 1; x <= rect.right() + 1; x++)
{
double hz = s->xToHz(x);
double db = gainIterator.gainAt(hz);
double y = s->dbToY(db);
if(db == lastDb)
y = floor(y) + 0.5;
lastDb = db;
if(first)
{
path.moveTo(x, y);
first = false;
}
else
{
path.lineTo(x, y);
}
}
path.lineTo(rect.right() + 1, rect.bottom() + 1);
path.lineTo(rect.left() - 1, rect.bottom() + 1);
double thresholdY = s->dbToY(0);
if(rect.top() < thresholdY)
{
QPainterPath rectPath;
rectPath.addRect(rect.left(), rect.top(), rect.width(), min(thresholdY - rect.top(), rect.height()));
QPainterPath clippingPath = path.intersected(rectPath);
painter->setPen(Qt::NoPen);
painter->setBrush(Qt::red);
painter->drawPath(clippingPath);
painter->setBrush(Qt::NoBrush);
}
painter->setPen(Qt::black);
painter->drawPath(path);
}