summaryrefslogtreecommitdiffstats
path: root/src/waveform/renderers/glwaveformrenderersimplesignal.cpp
diff options
context:
space:
mode:
authorRJ Ryan <rryan@mixxx.org>2013-06-19 00:46:54 -0400
committerRJ Ryan <rryan@mixxx.org>2013-06-19 00:46:54 -0400
commit25d57b59dff3947212909634864dd82365c9606b (patch)
treef0d0f8a048f8ed2f45c5ff015fc96891662f72f1 /src/waveform/renderers/glwaveformrenderersimplesignal.cpp
parente50f9f168fa08f2be6d0f13e8a225bbcc9de09bb (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.cpp159
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();
+}