benoitrigolleau@211: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ benoitrigolleau@211: benoitrigolleau@211: /* Sound Access benoitrigolleau@211: EASAIER client application. benoitrigolleau@211: Silogic 2007. Benoit Rigolleau. benoitrigolleau@211: benoitrigolleau@211: This program is free software; you can redistribute it and/or benoitrigolleau@211: modify it under the terms of the GNU General Public License as benoitrigolleau@211: published by the Free Software Foundation; either version 2 of the benoitrigolleau@211: License, or (at your option) any later version. See the file benoitrigolleau@211: COPYING included with this distribution for more information. benoitrigolleau@211: */ benoitrigolleau@211: benoitrigolleau@211: #include "Plotter.h" benoitrigolleau@231: #include benoitrigolleau@211: #include benoitrigolleau@211: benoitrigolleau@211: Plotter::Plotter(QWidget *parent): benoitrigolleau@211: m_signalWidth(400), benoitrigolleau@211: m_signalHeight(180), benoitrigolleau@211: m_margin(5), benoitrigolleau@211: m_curveMaskActive(false) benoitrigolleau@211: { lbajardsilogic@229: //m_curveMask = new int[m_signalWidth]; benoitrigolleau@211: for(int i = 0 ; i < m_signalWidth ; i++){ lbajardsilogic@229: m_curveMask.push_back(0); benoitrigolleau@211: } benoitrigolleau@211: lbajardsilogic@222: setMinimumSize(QSize(m_signalWidth + 10, m_signalHeight + 10)); benoitrigolleau@211: benoitrigolleau@211: refreshPixmap(); benoitrigolleau@211: benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::setCurveData(const QVector &data){ benoitrigolleau@211: m_curve = data; benoitrigolleau@211: refreshPixmap(); benoitrigolleau@211: } benoitrigolleau@211: lbajardsilogic@229: void Plotter::setCurve(float * curve) lbajardsilogic@229: { lbajardsilogic@229: m_curve.clear(); benoitrigolleau@231: for (int i=0; i< m_signalWidth; i++) lbajardsilogic@229: { lbajardsilogic@229: m_curve.push_back(QPoint(i, curve[i])); lbajardsilogic@229: } lbajardsilogic@229: refreshPixmap(); lbajardsilogic@229: } lbajardsilogic@229: benoitrigolleau@211: void Plotter::clearCurve(){ benoitrigolleau@211: m_curve.clear(); benoitrigolleau@211: refreshPixmap(); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::paintEvent(QPaintEvent *event){ benoitrigolleau@211: QStylePainter painter(this); benoitrigolleau@211: painter.drawPixmap(0, 0, m_pixmap); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::resizeEvent(QResizeEvent *event){ benoitrigolleau@211: refreshPixmap(); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::mousePressEvent(QMouseEvent *event){ benoitrigolleau@211: QRect rect(m_margin, m_margin, benoitrigolleau@211: m_signalWidth + m_margin, m_signalHeight + m_margin); benoitrigolleau@211: benoitrigolleau@211: if (event->button() == Qt::LeftButton) { benoitrigolleau@211: if (rect.contains(event->pos())) { benoitrigolleau@211: m_curveMaskActive = true; benoitrigolleau@211: int x = event->pos().x()- m_margin; benoitrigolleau@211: int y = event->pos().y()- m_margin; benoitrigolleau@211: m_curveMask[x] = y; benoitrigolleau@211: m_lastPoint.setX(x); benoitrigolleau@211: m_lastPoint.setY(y); benoitrigolleau@211: setCursor(Qt::CrossCursor); benoitrigolleau@211: refreshPixmap(); benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::mouseMoveEvent(QMouseEvent *event){ benoitrigolleau@211: QRect rect(m_margin, m_margin, benoitrigolleau@211: m_signalWidth + m_margin , m_signalHeight + m_margin); benoitrigolleau@211: benoitrigolleau@211: if(m_curveMaskActive && rect.contains(event->pos())){ benoitrigolleau@211: int x = event->pos().x() - m_margin; benoitrigolleau@211: int y = event->pos().y() - m_margin; benoitrigolleau@211: if(y>m_signalHeight-1) benoitrigolleau@211: y= m_signalHeight-1; benoitrigolleau@231: if(x>m_signalWidth-1) benoitrigolleau@231: y= m_signalWidth-1; benoitrigolleau@211: int xlast = m_lastPoint.x(); benoitrigolleau@211: int ylast = m_lastPoint.y(); benoitrigolleau@211: benoitrigolleau@211: //regul mask curve benoitrigolleau@211: int minx, maxx, miny, maxy; benoitrigolleau@211: if(x>xlast){ benoitrigolleau@211: minx = xlast; benoitrigolleau@211: maxx = x; benoitrigolleau@211: }else{ benoitrigolleau@211: minx = x; benoitrigolleau@211: maxx = xlast; benoitrigolleau@211: } benoitrigolleau@211: if(y>ylast){ benoitrigolleau@211: miny = ylast; benoitrigolleau@211: maxy = y; benoitrigolleau@211: }else{ benoitrigolleau@211: miny = y; benoitrigolleau@211: maxy = ylast; benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: if((maxx - minx)>1){ benoitrigolleau@211: double incr = (double)(maxy - miny)/(double)(maxx - minx); benoitrigolleau@211: if(x>xlast){ benoitrigolleau@211: for (int i = xlast + 1 ; i < x ; i++){ benoitrigolleau@211: if(ylast > y){ benoitrigolleau@211: m_curveMask[i] = ylast - (i-xlast)*incr; benoitrigolleau@211: }else{ benoitrigolleau@211: m_curveMask[i] = ylast + (i-xlast)*incr; benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: }else{ benoitrigolleau@211: for (int i = xlast - 1 ; i > x ; i--){ benoitrigolleau@211: if(ylast > y){ benoitrigolleau@211: m_curveMask[i] = ylast + (i-xlast)*incr; benoitrigolleau@211: }else{ benoitrigolleau@211: m_curveMask[i] = ylast - (i-xlast)*incr; benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: m_curveMask[x] = y; benoitrigolleau@211: m_lastPoint.setX(x); benoitrigolleau@211: m_lastPoint.setY(y); benoitrigolleau@211: refreshPixmap(); benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::mouseReleaseEvent(QMouseEvent *event){ benoitrigolleau@211: if ((event->button() == Qt::LeftButton) && m_curveMaskActive) { benoitrigolleau@211: m_curveMaskActive = false; benoitrigolleau@211: unsetCursor(); lbajardsilogic@232: emit filterChanged(m_curveMask); benoitrigolleau@211: } benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::drawGrid(QPainter *painter){ benoitrigolleau@211: QPixmap pm(":icons/grid.png"); benoitrigolleau@211: painter->drawPixmap(0,0,pm); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::drawCurve(QPainter *painter){ benoitrigolleau@231: //painter->setRenderHint (QPainter::Antialiasing, true ); benoitrigolleau@211: QPolygonF polyline(m_signalWidth); benoitrigolleau@231: benoitrigolleau@211: for(int i = 0 ; i < m_curve.count() ; i++){ benoitrigolleau@231: int m=-(1*floor((m_curve.at(i).y()/0.1))); // Calculates pixel coordinate and Plots FFT (in green) benoitrigolleau@231: if (m>m_signalHeight){m = m_signalHeight;} benoitrigolleau@231: if (m<0){m = 0;} benoitrigolleau@231: int y= m_signalHeight - m; benoitrigolleau@231: polyline[i] = QPoint(m_curve.at(i).x() + m_margin, /*m_curve.at(i).y()*/y + m_margin); benoitrigolleau@211: } benoitrigolleau@231: benoitrigolleau@211: painter->setPen(Qt::green); benoitrigolleau@211: painter->drawPolyline(polyline); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::drawMaskCurve(QPainter *painter){ benoitrigolleau@211: benoitrigolleau@220: painter->setRenderHint (QPainter::Antialiasing, true ); benoitrigolleau@220: benoitrigolleau@211: QPolygonF polyline(m_signalWidth); benoitrigolleau@211: benoitrigolleau@211: for(int i = 0 ; i < m_signalWidth ; i++){ benoitrigolleau@211: polyline[i] = QPoint(i+m_margin, m_curveMask[i]+m_margin); benoitrigolleau@211: } benoitrigolleau@211: painter->setPen(Qt::red); benoitrigolleau@211: painter->drawPolyline(polyline); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::refreshPixmap(){ benoitrigolleau@211: m_pixmap = QPixmap(size()); benoitrigolleau@211: m_pixmap.fill(this, 0, 0); benoitrigolleau@211: benoitrigolleau@211: QPainter painter(&m_pixmap); benoitrigolleau@211: painter.initFrom(this); benoitrigolleau@211: drawGrid(&painter); benoitrigolleau@211: drawCurve(&painter); benoitrigolleau@211: drawMaskCurve(&painter); benoitrigolleau@211: update(); benoitrigolleau@211: } benoitrigolleau@211: benoitrigolleau@211: void Plotter::setMargin(int margin){ benoitrigolleau@211: m_margin = margin; lbajardsilogic@232: } lbajardsilogic@232: lbajardsilogic@232: void Plotter::setFilter(float* filter) lbajardsilogic@232: { lbajardsilogic@232: m_curveMask.clear(); lbajardsilogic@232: for (int i=0; i