diff options
author | RJ Ryan <rryan@mixxx.org> | 2013-06-19 00:46:54 -0400 |
---|---|---|
committer | RJ Ryan <rryan@mixxx.org> | 2013-06-19 00:46:54 -0400 |
commit | 25d57b59dff3947212909634864dd82365c9606b (patch) | |
tree | f0d0f8a048f8ed2f45c5ff015fc96891662f72f1 /src/waveform/renderers/glwaveformrenderersimplesignal.cpp | |
parent | e50f9f168fa08f2be6d0f13e8a225bbcc9de09bb (diff) |
Moving mixxx/* to the root. A new era begins!
Diffstat (limited to 'src/waveform/renderers/glwaveformrenderersimplesignal.cpp')
-rw-r--r-- | src/waveform/renderers/glwaveformrenderersimplesignal.cpp | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/src/waveform/renderers/glwaveformrenderersimplesignal.cpp b/src/waveform/renderers/glwaveformrenderersimplesignal.cpp new file mode 100644 index 0000000000..b324363e94 --- /dev/null +++ b/src/waveform/renderers/glwaveformrenderersimplesignal.cpp @@ -0,0 +1,159 @@ +#include "glwaveformrenderersimplesignal.h" + +#include "waveformwidgetrenderer.h" +#include "waveform/waveform.h" + +#include "waveform/waveformwidgetfactory.h" + +#include <qgl.h> + +GLWaveformRendererSimpleSignal::GLWaveformRendererSimpleSignal( + WaveformWidgetRenderer* waveformWidgetRenderer) + : WaveformRendererSignalBase(waveformWidgetRenderer) { + +} + +GLWaveformRendererSimpleSignal::~GLWaveformRendererSimpleSignal(){ +} + +void GLWaveformRendererSimpleSignal::onSetup(const QDomNode &node){ + Q_UNUSED(node); +} + +inline void setPoint(QPointF& point, qreal x, qreal y) { + point.setX(x); + point.setY(y); +} + +void GLWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*event*/){ + + TrackPointer pTrack = m_waveformRenderer->getTrackInfo(); + if (!pTrack) { + return; + } + + const Waveform* waveform = pTrack->getWaveform(); + if (waveform == NULL) { + return; + } + + const int dataSize = waveform->getDataSize(); + if (dataSize <= 1) { + return; + } + + const WaveformData* data = waveform->data(); + if (data == NULL) { + return; + } + + double firstVisualIndex = m_waveformRenderer->getFirstDisplayedPosition() * dataSize; + double lastVisualIndex = m_waveformRenderer->getLastDisplayedPosition() * dataSize; + + const int firstIndex = int(firstVisualIndex+0.5); + firstVisualIndex = firstIndex - firstIndex%2; + + const int lastIndex = int(lastVisualIndex+0.5); + lastVisualIndex = lastIndex + lastIndex%2; + + // Reset device for native painting + painter->beginNativePainting(); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + const QColor& color = m_pColors->getSignalColor(); + + WaveformWidgetFactory* factory = WaveformWidgetFactory::instance(); + const double visualGain = factory->getVisualGain(::WaveformWidgetFactory::All); + + float maxAll[2]; + + if (m_alignment == Qt::AlignCenter) { + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(firstVisualIndex, lastVisualIndex, -255.0, 255.0, -10.0, 10.0); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + glScalef(1.f,visualGain*m_waveformRenderer->getGain(),1.f); + + glLineWidth(1.0); + glDisable(GL_LINE_SMOOTH); + + //draw reference line + glBegin(GL_LINES); { + glColor4f(m_axesColor.redF(),m_axesColor.greenF(),m_axesColor.blueF(),m_axesColor.alphaF()); + glVertex2f(firstVisualIndex,0); + glVertex2f(lastVisualIndex,0); + } + glEnd(); + + glLineWidth(1.1); + glEnable(GL_LINE_SMOOTH); + + glBegin(GL_LINES); { + for( int visualIndex = firstVisualIndex; + visualIndex < lastVisualIndex; + visualIndex += 2) { + + if( visualIndex < 0) + continue; + + if( visualIndex > dataSize - 1) + break; + + maxAll[0] = (float)data[visualIndex].filtered.all; + maxAll[1] = (float)data[visualIndex+1].filtered.all; + glColor4f(color.redF(),color.greenF(),color.blueF(),0.9); + glVertex2f(visualIndex,maxAll[0]); + glVertex2f(visualIndex,-1.f*maxAll[1]); + } + } + glEnd(); + } else { //top || bottom + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + if( m_alignment == Qt::AlignBottom) + glOrtho(firstVisualIndex, lastVisualIndex, 0.0, 255.0, -10.0, 10.0); + else + glOrtho(firstVisualIndex, lastVisualIndex, 255.0, 0.0, -10.0, 10.0); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + glScalef(1.f,visualGain*m_waveformRenderer->getGain(),1.f); + + glLineWidth(1.1); + glEnable(GL_LINE_SMOOTH); + + glBegin(GL_LINES); { + for( int visualIndex = firstVisualIndex; + visualIndex < lastVisualIndex; + visualIndex += 2) { + + if( visualIndex < 0) + continue; + + if( visualIndex > dataSize - 1) + break; + + maxAll[0] = (float)data[visualIndex].filtered.all; + maxAll[1] = (float)data[visualIndex+1].filtered.all; + glColor4f(color.redF(),color.greenF(),color.blueF(),0.8); + glVertex2f(float(visualIndex),0.f); + glVertex2f(float(visualIndex),math_max(maxAll[0],maxAll[1])); + } + } + glEnd(); + } + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + painter->endNativePainting(); +} |