annotate widgets/Plotter.cpp @ 233:628531da16ef

pass equalizer filter curve in float
author lbajardsilogic
date Thu, 06 Mar 2008 16:37:44 +0000
parents 70b88fbbfb5c
children 7ab3e81f52d4
rev   line source
benoitrigolleau@211 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
benoitrigolleau@211 2
benoitrigolleau@211 3 /* Sound Access
benoitrigolleau@211 4 EASAIER client application.
benoitrigolleau@211 5 Silogic 2007. Benoit Rigolleau.
benoitrigolleau@211 6
benoitrigolleau@211 7 This program is free software; you can redistribute it and/or
benoitrigolleau@211 8 modify it under the terms of the GNU General Public License as
benoitrigolleau@211 9 published by the Free Software Foundation; either version 2 of the
benoitrigolleau@211 10 License, or (at your option) any later version. See the file
benoitrigolleau@211 11 COPYING included with this distribution for more information.
benoitrigolleau@211 12 */
benoitrigolleau@211 13
benoitrigolleau@211 14 #include "Plotter.h"
benoitrigolleau@231 15 #include <math.h>
benoitrigolleau@211 16 #include <QtGui>
benoitrigolleau@211 17
benoitrigolleau@211 18 Plotter::Plotter(QWidget *parent):
benoitrigolleau@211 19 m_signalWidth(400),
lbajardsilogic@233 20 m_signalHeight(120),
benoitrigolleau@211 21 m_margin(5),
benoitrigolleau@211 22 m_curveMaskActive(false)
benoitrigolleau@211 23 {
lbajardsilogic@229 24 //m_curveMask = new int[m_signalWidth];
benoitrigolleau@211 25 for(int i = 0 ; i < m_signalWidth ; i++){
lbajardsilogic@229 26 m_curveMask.push_back(0);
benoitrigolleau@211 27 }
benoitrigolleau@211 28
lbajardsilogic@222 29 setMinimumSize(QSize(m_signalWidth + 10, m_signalHeight + 10));
benoitrigolleau@211 30
benoitrigolleau@211 31 refreshPixmap();
benoitrigolleau@211 32
benoitrigolleau@211 33 }
benoitrigolleau@211 34
benoitrigolleau@211 35 void Plotter::setCurveData(const QVector<QPoint> &data){
benoitrigolleau@211 36 m_curve = data;
benoitrigolleau@211 37 refreshPixmap();
benoitrigolleau@211 38 }
benoitrigolleau@211 39
lbajardsilogic@229 40 void Plotter::setCurve(float * curve)
lbajardsilogic@229 41 {
lbajardsilogic@229 42 m_curve.clear();
benoitrigolleau@231 43 for (int i=0; i< m_signalWidth; i++)
lbajardsilogic@229 44 {
lbajardsilogic@233 45 int m = m_signalHeight*2/3 +(int) floor(curve[i]/0.1);
lbajardsilogic@233 46 m_curve.push_back(QPoint(i, m));
lbajardsilogic@229 47 }
lbajardsilogic@229 48 refreshPixmap();
lbajardsilogic@229 49 }
lbajardsilogic@229 50
benoitrigolleau@211 51 void Plotter::clearCurve(){
benoitrigolleau@211 52 m_curve.clear();
benoitrigolleau@211 53 refreshPixmap();
benoitrigolleau@211 54 }
benoitrigolleau@211 55
benoitrigolleau@211 56 void Plotter::paintEvent(QPaintEvent *event){
benoitrigolleau@211 57 QStylePainter painter(this);
benoitrigolleau@211 58 painter.drawPixmap(0, 0, m_pixmap);
benoitrigolleau@211 59 }
benoitrigolleau@211 60
benoitrigolleau@211 61 void Plotter::resizeEvent(QResizeEvent *event){
benoitrigolleau@211 62 refreshPixmap();
benoitrigolleau@211 63 }
benoitrigolleau@211 64
benoitrigolleau@211 65 void Plotter::mousePressEvent(QMouseEvent *event){
benoitrigolleau@211 66 QRect rect(m_margin, m_margin,
benoitrigolleau@211 67 m_signalWidth + m_margin, m_signalHeight + m_margin);
benoitrigolleau@211 68
benoitrigolleau@211 69 if (event->button() == Qt::LeftButton) {
benoitrigolleau@211 70 if (rect.contains(event->pos())) {
benoitrigolleau@211 71 m_curveMaskActive = true;
benoitrigolleau@211 72 int x = event->pos().x()- m_margin;
benoitrigolleau@211 73 int y = event->pos().y()- m_margin;
benoitrigolleau@211 74 m_curveMask[x] = y;
benoitrigolleau@211 75 m_lastPoint.setX(x);
benoitrigolleau@211 76 m_lastPoint.setY(y);
benoitrigolleau@211 77 setCursor(Qt::CrossCursor);
benoitrigolleau@211 78 refreshPixmap();
benoitrigolleau@211 79 }
benoitrigolleau@211 80 }
benoitrigolleau@211 81 }
benoitrigolleau@211 82
benoitrigolleau@211 83 void Plotter::mouseMoveEvent(QMouseEvent *event){
benoitrigolleau@211 84 QRect rect(m_margin, m_margin,
benoitrigolleau@211 85 m_signalWidth + m_margin , m_signalHeight + m_margin);
benoitrigolleau@211 86
benoitrigolleau@211 87 if(m_curveMaskActive && rect.contains(event->pos())){
benoitrigolleau@211 88 int x = event->pos().x() - m_margin;
benoitrigolleau@211 89 int y = event->pos().y() - m_margin;
benoitrigolleau@211 90 if(y>m_signalHeight-1)
benoitrigolleau@211 91 y= m_signalHeight-1;
benoitrigolleau@231 92 if(x>m_signalWidth-1)
benoitrigolleau@231 93 y= m_signalWidth-1;
benoitrigolleau@211 94 int xlast = m_lastPoint.x();
benoitrigolleau@211 95 int ylast = m_lastPoint.y();
benoitrigolleau@211 96
benoitrigolleau@211 97 //regul mask curve
benoitrigolleau@211 98 int minx, maxx, miny, maxy;
benoitrigolleau@211 99 if(x>xlast){
benoitrigolleau@211 100 minx = xlast;
benoitrigolleau@211 101 maxx = x;
benoitrigolleau@211 102 }else{
benoitrigolleau@211 103 minx = x;
benoitrigolleau@211 104 maxx = xlast;
benoitrigolleau@211 105 }
benoitrigolleau@211 106 if(y>ylast){
benoitrigolleau@211 107 miny = ylast;
benoitrigolleau@211 108 maxy = y;
benoitrigolleau@211 109 }else{
benoitrigolleau@211 110 miny = y;
benoitrigolleau@211 111 maxy = ylast;
benoitrigolleau@211 112 }
benoitrigolleau@211 113
benoitrigolleau@211 114 if((maxx - minx)>1){
benoitrigolleau@211 115 double incr = (double)(maxy - miny)/(double)(maxx - minx);
benoitrigolleau@211 116 if(x>xlast){
benoitrigolleau@211 117 for (int i = xlast + 1 ; i < x ; i++){
benoitrigolleau@211 118 if(ylast > y){
benoitrigolleau@211 119 m_curveMask[i] = ylast - (i-xlast)*incr;
benoitrigolleau@211 120 }else{
benoitrigolleau@211 121 m_curveMask[i] = ylast + (i-xlast)*incr;
benoitrigolleau@211 122 }
benoitrigolleau@211 123 }
benoitrigolleau@211 124 }else{
benoitrigolleau@211 125 for (int i = xlast - 1 ; i > x ; i--){
benoitrigolleau@211 126 if(ylast > y){
benoitrigolleau@211 127 m_curveMask[i] = ylast + (i-xlast)*incr;
benoitrigolleau@211 128 }else{
benoitrigolleau@211 129 m_curveMask[i] = ylast - (i-xlast)*incr;
benoitrigolleau@211 130 }
benoitrigolleau@211 131 }
benoitrigolleau@211 132 }
benoitrigolleau@211 133 }
benoitrigolleau@211 134 m_curveMask[x] = y;
benoitrigolleau@211 135 m_lastPoint.setX(x);
benoitrigolleau@211 136 m_lastPoint.setY(y);
benoitrigolleau@211 137 refreshPixmap();
benoitrigolleau@211 138 }
benoitrigolleau@211 139 }
benoitrigolleau@211 140
benoitrigolleau@211 141 void Plotter::mouseReleaseEvent(QMouseEvent *event){
benoitrigolleau@211 142 if ((event->button() == Qt::LeftButton) && m_curveMaskActive) {
benoitrigolleau@211 143 m_curveMaskActive = false;
benoitrigolleau@211 144 unsetCursor();
lbajardsilogic@232 145 emit filterChanged(m_curveMask);
benoitrigolleau@211 146 }
benoitrigolleau@211 147 }
benoitrigolleau@211 148
benoitrigolleau@211 149 void Plotter::drawGrid(QPainter *painter){
benoitrigolleau@211 150 QPixmap pm(":icons/grid.png");
benoitrigolleau@211 151 painter->drawPixmap(0,0,pm);
benoitrigolleau@211 152 }
benoitrigolleau@211 153
benoitrigolleau@211 154 void Plotter::drawCurve(QPainter *painter){
benoitrigolleau@231 155 //painter->setRenderHint (QPainter::Antialiasing, true );
benoitrigolleau@211 156 QPolygonF polyline(m_signalWidth);
benoitrigolleau@231 157
benoitrigolleau@211 158 for(int i = 0 ; i < m_curve.count() ; i++){
lbajardsilogic@233 159 int m = m_curve.at(i).y(); // Calculates pixel coordinate and Plots FFT (in green)
benoitrigolleau@231 160 if (m>m_signalHeight){m = m_signalHeight;}
benoitrigolleau@231 161 if (m<0){m = 0;}
benoitrigolleau@231 162 int y= m_signalHeight - m;
benoitrigolleau@231 163 polyline[i] = QPoint(m_curve.at(i).x() + m_margin, /*m_curve.at(i).y()*/y + m_margin);
benoitrigolleau@211 164 }
benoitrigolleau@231 165
benoitrigolleau@211 166 painter->setPen(Qt::green);
benoitrigolleau@211 167 painter->drawPolyline(polyline);
benoitrigolleau@211 168 }
benoitrigolleau@211 169
benoitrigolleau@211 170 void Plotter::drawMaskCurve(QPainter *painter){
benoitrigolleau@211 171
benoitrigolleau@220 172 painter->setRenderHint (QPainter::Antialiasing, true );
benoitrigolleau@220 173
benoitrigolleau@211 174 QPolygonF polyline(m_signalWidth);
benoitrigolleau@211 175
benoitrigolleau@211 176 for(int i = 0 ; i < m_signalWidth ; i++){
benoitrigolleau@211 177 polyline[i] = QPoint(i+m_margin, m_curveMask[i]+m_margin);
benoitrigolleau@211 178 }
benoitrigolleau@211 179 painter->setPen(Qt::red);
benoitrigolleau@211 180 painter->drawPolyline(polyline);
benoitrigolleau@211 181 }
benoitrigolleau@211 182
benoitrigolleau@211 183 void Plotter::refreshPixmap(){
benoitrigolleau@211 184 m_pixmap = QPixmap(size());
benoitrigolleau@211 185 m_pixmap.fill(this, 0, 0);
benoitrigolleau@211 186
benoitrigolleau@211 187 QPainter painter(&m_pixmap);
benoitrigolleau@211 188 painter.initFrom(this);
benoitrigolleau@211 189 drawGrid(&painter);
benoitrigolleau@211 190 drawCurve(&painter);
benoitrigolleau@211 191 drawMaskCurve(&painter);
benoitrigolleau@211 192 update();
benoitrigolleau@211 193 }
benoitrigolleau@211 194
benoitrigolleau@211 195 void Plotter::setMargin(int margin){
benoitrigolleau@211 196 m_margin = margin;
lbajardsilogic@232 197 }
lbajardsilogic@232 198
lbajardsilogic@232 199 void Plotter::setFilter(float* filter)
lbajardsilogic@232 200 {
lbajardsilogic@232 201 m_curveMask.clear();
lbajardsilogic@232 202 for (int i=0; i<m_signalWidth; i++)
lbajardsilogic@232 203 {
lbajardsilogic@233 204 m_curveMask.push_back((int) (m_signalHeight - filter[i]*(m_signalHeight/2-1)));
lbajardsilogic@232 205 }
lbajardsilogic@232 206 refreshPixmap();
benoitrigolleau@211 207 }