![]() |
Mixxx
|
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 }