Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/waveform/waveformrendersignalpixmap.cpp

Go to the documentation of this file.
00001 
00002 #include <QDebug>
00003 #include <QColor>
00004 #include <QDomNode>
00005 #include <QPaintEvent>
00006 #include <QPainter>
00007 #include <QObject>
00008 #include <QVector>
00009 #include <QLine>
00010 
00011 #include "waveformrendersignalpixmap.h"
00012 #include "waveformrenderer.h"
00013 #include "controlobjectthreadmain.h"
00014 #include "controlobject.h"
00015 #include "widget/wskincolor.h"
00016 #include "widget/wwidget.h"
00017 #include "trackinfoobject.h"
00018 
00019 WaveformRenderSignalPixmap::WaveformRenderSignalPixmap(const char* group, WaveformRenderer *parent)
00020         : m_iWidth(0),
00021           m_iHeight(0),
00022           m_pParent(parent),
00023           m_lines(0),
00024           signalColor(255,255,255),
00025           m_screenPixmap(),
00026           m_iLastPlaypos(0) {
00027 }
00028 
00029 WaveformRenderSignalPixmap::~WaveformRenderSignalPixmap() {
00030 
00031 }
00032 
00033 void WaveformRenderSignalPixmap::resize(int w, int h) {
00034     m_iWidth = w;
00035     m_iHeight = h;
00036     m_screenPixmap = QPixmap(w,h);
00037     m_screenPixmap.fill(QColor(0,0,0,0));
00038 }
00039 
00040 void WaveformRenderSignalPixmap::newTrack(TrackPointer pTrack) {
00041     m_pTrack = pTrack;
00042 }
00043 
00044 void WaveformRenderSignalPixmap::setup(QDomNode node) {
00045     signalColor.setNamedColor(WWidget::selectNodeQString(node, "SignalColor"));
00046     signalColor = WSkinColor::getCorrectColor(signalColor);
00047 }
00048 
00049 void WaveformRenderSignalPixmap::draw(QPainter *pPainter, QPaintEvent *event, QVector<float> *buffer, double dPlayPos, double rateAdjust) {
00050     if(buffer == NULL)
00051         return;
00052 
00053     updatePixmap(buffer, dPlayPos, rateAdjust);
00054 
00055     pPainter->drawPixmap(m_screenPixmap.rect(), m_screenPixmap, event->rect());
00056 }
00057 
00058 void WaveformRenderSignalPixmap::updatePixmap(QVector<float> *buffer, double dPlayPos, double rateAdjust) {
00059 
00060 
00061     int numBufferSamples = buffer->size();
00062     int iCurPos = 0;
00063     if(dPlayPos >= 0) {
00064         iCurPos = (int)(dPlayPos*numBufferSamples);
00065     }
00066 
00067     if((iCurPos % 2) != 0)
00068         iCurPos--;
00069 
00070     double subpixelsPerPixel = m_pParent->getSubpixelsPerPixel() * (1.0 + rateAdjust);
00071     int subpixelWidth = int(m_iWidth * subpixelsPerPixel);
00072 
00073     int pixelsToDraw = iCurPos - m_iLastPlaypos;
00074     int startPixel, endPixel;
00075 
00076     QRectF oldRect;
00077     QPointF oldPoint;
00078     if(abs(pixelsToDraw) > subpixelWidth) {
00079         startPixel = 0;
00080         endPixel = subpixelWidth;
00081     } else if(pixelsToDraw > 0) {
00082         // going forward
00083         startPixel = subpixelWidth - pixelsToDraw;
00084         endPixel = subpixelWidth;
00085         //oldRect = QRectF(QPointF(pixelsToDraw,1.0f), QPointF(endPixel, -1.0f));
00086         oldPoint = QPointF(-pixelsToDraw,1.0f);
00087     } else if(pixelsToDraw < 0) {
00088         // going backward
00089         startPixel = 0;
00090         endPixel = -pixelsToDraw;
00091         //oldRect = QRectF(QPointF(0,1.0f), QPointF(subpixelWidth+pixelsToDraw, -1.0f));
00092         oldPoint = QPointF(pixelsToDraw,1.0f);
00093     } else {
00094         // Nothing changed, so we don't have to do anything.
00095         return;
00096     }
00097 
00098     QRectF newRect = QRectF(QPointF(startPixel,1.0), QPointF(endPixel, -1.0));
00099     QPainter painter;
00100     painter.begin(&m_screenPixmap);
00101     painter.setPen(signalColor);
00102     painter.setBackground(QBrush(QColor(0,0,0,0)));
00103     painter.setCompositionMode(QPainter::CompositionMode_Source);
00104     painter.setBackgroundMode(Qt::TransparentMode);
00105 
00106 
00107 
00108     // Translate our coordinate frame from (0,0) at top left
00109     // to (0,0) at left, center. All the subrenderers expect this.
00110     painter.translate(0.0,m_iHeight/2.0);
00111 
00112     // Now scale so that positive-y points up.
00113     painter.scale(1.0,-1.0);
00114 
00115 
00116     //qDebug() << "startPixel " << startPixel;
00117     //qDebug() << "endPixel " << endPixel;
00118 
00119     painter.scale(1.0/subpixelsPerPixel,m_iHeight*0.40);
00120 
00121     // If the array is not large enough, expand it.
00122     // Amortize the cost of this by requesting a factor of 2 more.
00123     if(m_lines.size() < subpixelWidth) {
00124         m_lines.resize(2*subpixelWidth);
00125     }
00126 
00127 
00128     painter.drawPixmap(oldPoint, m_screenPixmap);
00129     painter.eraseRect(newRect);
00130 
00131     //painter.fillRect(newRect, QColor(0,0,0,0));
00132 
00133     int halfw = subpixelWidth/2;
00134     for(int i=startPixel;i<endPixel;i++) {
00135         // Start at curPos minus half the waveform viewer
00136         int thisIndex = iCurPos+2*(i-halfw);
00137         if(thisIndex >= 0 && (thisIndex+1) < numBufferSamples) {
00138             float sampl = (*buffer)[thisIndex];
00139             float sampr = (*buffer)[thisIndex+1];
00140             m_lines[i] = QLineF(i,-sampr,i,sampl);
00141         } else {
00142             m_lines[i] = QLineF(0,0,0,0);
00143         }
00144     }
00145 
00146     // Only draw lines that we have provided
00147     painter.drawLines(m_lines.data()+startPixel, endPixel-startPixel);
00148 
00149     painter.end();
00150 
00151     m_iLastPlaypos = iCurPos;
00152 
00153 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines