diff --git a/res/shaders/filteredsignal.frag b/res/shaders/filteredsignal.frag index ce0f0631df72..b995aabad4b5 100644 --- a/res/shaders/filteredsignal.frag +++ b/res/shaders/filteredsignal.frag @@ -16,6 +16,8 @@ uniform float midGain; uniform float highGain; uniform float firstVisualIndex; uniform float lastVisualIndex; +uniform float alpha; +uniform float alphaUnscaled; uniform sampler2D waveformDataTexture; @@ -90,35 +92,35 @@ void main(void) { } if (lowShowingUnscaled) { - float lowAlpha = 0.2; + float lowAlpha = alphaUnscaled; outputColor.xyz = mix(outputColor.xyz, lowColor.xyz, lowAlpha); outputColor.w = 1.0; } if (midShowingUnscaled) { - float midAlpha = 0.2; + float midAlpha = alphaUnscaled; outputColor.xyz = mix(outputColor.xyz, midColor.xyz, midAlpha); outputColor.w = 1.0; } if (highShowingUnscaled) { - float highAlpha = 0.2; + float highAlpha = alphaUnscaled; outputColor.xyz = mix(outputColor.xyz, highColor.xyz, highAlpha); outputColor.w = 1.0; } if (lowShowing) { - float lowAlpha = 0.8; + float lowAlpha = alpha; outputColor.xyz = mix(outputColor.xyz, lowColor.xyz, lowAlpha); outputColor.w = 1.0; } if (midShowing) { - float midAlpha = 0.85; + float midAlpha = min(alpha+0.05, 1.0); outputColor.xyz = mix(outputColor.xyz, midColor.xyz, midAlpha); outputColor.w = 1.0; } if (highShowing) { - float highAlpha = 0.9; + float highAlpha = min(alpha+0.1, 1.0); outputColor.xyz = mix(outputColor.xyz, highColor.xyz, highAlpha); outputColor.w = 1.0; } diff --git a/res/shaders/rgbsignal.frag b/res/shaders/rgbsignal.frag index 23d1375b68c0..8064f52ce0b1 100644 --- a/res/shaders/rgbsignal.frag +++ b/res/shaders/rgbsignal.frag @@ -16,6 +16,9 @@ uniform float midGain; uniform float highGain; uniform float firstVisualIndex; uniform float lastVisualIndex; +uniform float alpha; +uniform float alphaUnscaled; + uniform sampler2D waveformDataTexture; @@ -116,13 +119,11 @@ void main(void) { } if (showingUnscaled) { - float alpha = 0.4; - outputColor.xyz = mix(outputColor.xyz, showingUnscaledColor.xyz, alpha); + outputColor.xyz = mix(outputColor.xyz, showingUnscaledColor.xyz, alphaUnscaled); outputColor.w = 1.0; } if (showing) { - float alpha = 0.8; outputColor.xyz = mix(outputColor.xyz, showingColor.xyz, alpha); outputColor.w = 1.0; } diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index 3ff81a7cf94b..c714bc6d4090 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -103,6 +103,9 @@ DlgPrefEQ::~DlgPrefEQ() { qDeleteAll(m_filterWaveformEnableCOs); m_filterWaveformEnableCOs.clear(); + + qDeleteAll(m_filterWaveformPrefilterAlphaCOs); + m_filterWaveformPrefilterAlphaCOs.clear(); } void DlgPrefEQ::slotNumDecksChanged(double numDecks) { diff --git a/src/preferences/dialog/dlgprefeq.h b/src/preferences/dialog/dlgprefeq.h index d4a4b8493f31..c23e86150a48 100644 --- a/src/preferences/dialog/dlgprefeq.h +++ b/src/preferences/dialog/dlgprefeq.h @@ -96,6 +96,7 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { QList m_deckQuickEffectSelectors; QList m_filterWaveformEffectLoaded; QList m_filterWaveformEnableCOs; + QList m_filterWaveformPrefilterAlphaCOs; ControlProxy* m_pNumDecks; bool m_inSlotPopulateDeckEffectSelectors; diff --git a/src/preferences/dialog/dlgprefwaveform.cpp b/src/preferences/dialog/dlgprefwaveform.cpp index f8ff29549f16..4ca8eda8f722 100644 --- a/src/preferences/dialog/dlgprefwaveform.cpp +++ b/src/preferences/dialog/dlgprefwaveform.cpp @@ -49,6 +49,18 @@ DlgPrefWaveform::DlgPrefWaveform(QWidget* pParent, MixxxMainWindow* pMixxx, frameRateSpinBox, SLOT(setValue(int))); connect(frameRateSpinBox, SIGNAL(valueChanged(int)), frameRateSlider, SLOT(setValue(int))); + connect(waveformAlphaSlider, SIGNAL(valueChanged(int)), + waveformAlphaSpinBox, SLOT(setValue(int))); + connect(waveformAlphaSpinBox, SIGNAL(valueChanged(int)), + waveformAlphaSlider, SLOT(setValue(int))); + connect(waveformAlphaSpinBox, SIGNAL(valueChanged(int)), + this, SLOT(slotSetWaveformAlpha(int))); + connect(waveformAlphaPrefilterSlider, SIGNAL(valueChanged(int)), + waveformAlphaPrefilterSpinBox, SLOT(setValue(int))); + connect(waveformAlphaPrefilterSpinBox, SIGNAL(valueChanged(int)), + waveformAlphaPrefilterSlider, SLOT(setValue(int))); + connect(waveformAlphaPrefilterSpinBox, SIGNAL(valueChanged(int)), + this, SLOT(slotSetWaveformPrefilterAlpha(int))); connect(endOfTrackWarningTimeSlider, SIGNAL(valueChanged(int)), endOfTrackWarningTimeSpinBox, SLOT(setValue(int))); connect(endOfTrackWarningTimeSpinBox, SIGNAL(valueChanged(int)), @@ -82,6 +94,28 @@ DlgPrefWaveform::DlgPrefWaveform(QWidget* pParent, MixxxMainWindow* pMixxx, this, SLOT(slotClearCachedWaveforms())); connect(playMarkerPositionSlider, SIGNAL(valueChanged(int)), this, SLOT(slotSetPlayMarkerPosition(int))); + + // Waveform control objects + m_pCOWaveformAlpha = new ControlObject( + ConfigKey("[Controls]", "waveform_alpha")); + connect(m_pCOWaveformAlpha, + SIGNAL(valueChanged(double)), + this, + SLOT(slotCOWaveformAlpha(double))); + m_pCOWaveformAlphaPrefilter = new ControlObject( + ConfigKey("[Controls]", "waveform_alpha_prefilter")); + connect(m_pCOWaveformAlphaPrefilter, + SIGNAL(valueChanged(double)), + this, + SLOT(slotCOWaveformPrefilterAlpha(double))); + + double waveformAlpha = m_pConfig->getValue(ConfigKey("[Waveform]","WaveformAlpha"), 80)/100.0; + m_pCOWaveformAlpha->forceSet(waveformAlpha); + slotCOWaveformAlpha(waveformAlpha); + + double waveformPrefilterAlpha = m_pConfig->getValue(ConfigKey("[Waveform]","WaveformPrefilterAlpha"), 20)/100.0; + m_pCOWaveformAlphaPrefilter->forceSet(waveformPrefilterAlpha); + slotCOWaveformPrefilterAlpha(waveformPrefilterAlpha); } DlgPrefWaveform::~DlgPrefWaveform() { @@ -265,6 +299,38 @@ void DlgPrefWaveform::slotSetPlayMarkerPosition(int position) { WaveformWidgetFactory::instance()->setPlayMarkerPosition(position / 100.0); } +void DlgPrefWaveform::slotSetWaveformAlpha(int percent) { + m_pConfig->setValue(ConfigKey("[Waveform]","WaveformAlpha"), percent); + m_pCOWaveformAlpha->set((double)percent/100.0); +} + +void DlgPrefWaveform::slotSetWaveformPrefilterAlpha(int percent) { + m_pConfig->setValue(ConfigKey("[Waveform]","WaveformPrefilterAlpha"), percent); + m_pCOWaveformAlphaPrefilter->set((double)percent/100.0); +} + +void DlgPrefWaveform::slotCOWaveformAlpha(double alpha) { + if (alpha < 0.0) { + alpha = 0; + } else if (alpha > 1.0) { + alpha = 1.0; + } + int percent = (int)(alpha*100.0); + m_pConfig->setValue(ConfigKey("[Waveform]","WaveformAlpha"), percent); + waveformAlphaSpinBox->setValue(percent); +} + +void DlgPrefWaveform::slotCOWaveformPrefilterAlpha(double alpha) { + if (alpha < 0.0) { + alpha = 0; + } else if (alpha > 1.0) { + alpha = 1.0; + } + int percent = (int)(alpha*100.0); + m_pConfig->setValue(ConfigKey("[Waveform]","WaveformPrefilterAlpha"), percent); + waveformAlphaPrefilterSpinBox->setValue(percent); +} + void DlgPrefWaveform::calculateCachedWaveformDiskUsage() { AnalysisDao analysisDao(m_pConfig); QSqlDatabase dbConnection = mixxx::DbConnectionPooled(m_pLibrary->dbConnectionPool()); diff --git a/src/preferences/dialog/dlgprefwaveform.h b/src/preferences/dialog/dlgprefwaveform.h index c6a0a652e598..5dfd2b4e0f59 100644 --- a/src/preferences/dialog/dlgprefwaveform.h +++ b/src/preferences/dialog/dlgprefwaveform.h @@ -6,6 +6,7 @@ #include "preferences/dialog/ui_dlgprefwaveformdlg.h" #include "preferences/usersettings.h" #include "preferences/dlgpreferencepage.h" +#include "control/controlobject.h" class MixxxMainWindow; class Library; @@ -38,6 +39,10 @@ class DlgPrefWaveform : public DlgPreferencePage, public Ui::DlgPrefWaveformDlg void slotClearCachedWaveforms(); void slotSetBeatGridAlpha(int alpha); void slotSetPlayMarkerPosition(int position); + void slotSetWaveformAlpha(int alpha); + void slotSetWaveformPrefilterAlpha(int alpha); + void slotCOWaveformAlpha(double alpha); + void slotCOWaveformPrefilterAlpha(double alpha); private: void initWaveformControl(); @@ -46,6 +51,8 @@ class DlgPrefWaveform : public DlgPreferencePage, public Ui::DlgPrefWaveformDlg UserSettingsPointer m_pConfig; Library* m_pLibrary; MixxxMainWindow* m_pMixxx; + ControlObject* m_pCOWaveformAlpha; + ControlObject* m_pCOWaveformAlphaPrefilter; }; diff --git a/src/preferences/dialog/dlgprefwaveformdlg.ui b/src/preferences/dialog/dlgprefwaveformdlg.ui index 8c5480ab486c..f099ce8ac568 100644 --- a/src/preferences/dialog/dlgprefwaveformdlg.ui +++ b/src/preferences/dialog/dlgprefwaveformdlg.ui @@ -6,165 +6,42 @@ 0 0 - 677 - 528 + 741 + 776 Waveform Preferences + + + + Qt::Vertical + + + + 20 + 40 + + + + - - - - Visual gain - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - allVisualGain - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - 0 - + + - 60 - - - 30 - - - Qt::Horizontal - - - - - - - Normalize waveform overview - - - - - - - Displays which OpenGL version is supported by the current platform. - - - - - - - - - - Highlight the waveforms when the last seconds of a track remains. - - - seconds + 100 - + 0 - - 60 - - - 30 - - - - - - - - - - Average frame rate - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Frame rate - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - frameRateSlider - - - - - - - - - Qt::Horizontal - - - - - - - OpenGL status - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - - - Waveform type - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - waveformTypeComboBox - - - @@ -297,39 +174,29 @@ - - - - The waveform overview shows the waveform envelope of the entire track. -Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. + + + + Caching - - - - - - The waveform shows the waveform envelope of the track near the current playback position. -Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - + + - - - - Waveform overview type + - - - - - - Displays the actual frame rate. + + 6 - + Beat grid opacity + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter @@ -374,59 +241,7 @@ Select from different types of displays for the waveform, which differ primarily - - - - - - - fps - - - 10 - - - 60 - - - 30 - - - - - - - Default zoom level - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - defaultZoomComboBox - - - - - - - Synchronize zoom level across all waveform displays. - - - Synchronize zoom level across all waveforms - - - - - - - Caching - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - + @@ -471,29 +286,281 @@ Select from different types of displays for the waveform, which differ primarily - - + + - - 6 - - - Beat grid opacity + + fps - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + 10 + + + 60 + + + 30 - - + + + + + + + OpenGL status + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + 0 + + + 60 + + + 30 + + + Qt::Horizontal + + + + + + + Displays the actual frame rate. + + + + + + + + + + + + + Waveform overview type + + + + + + + Frame rate + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + frameRateSlider + + + + + + + Waveform opacity + + + + + + + Displays which OpenGL version is supported by the current platform. + + + + + + + + + + Normalize waveform overview + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Moves the play marker position on the waveforms to the left, right or center (default). + + + 0 + 100 - 90 + 50 + + + Qt::Horizontal + + + + + + + + + + Play marker position + + + + + + + % + + + 100 + + + + + + + + + + Average frame rate + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + % + + + 100 + + + + + + + + 0 + 0 + + + + + + + Waveform type + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + waveformTypeComboBox + + + + + + + Synchronize zoom level across all waveform displays. + + + Synchronize zoom level across all waveforms + + + + + + + The waveform shows the waveform envelope of the track near the current playback position. +Select from different types of displays for the waveform, which differ primarily in the level of detail shown in the waveform. + + + + + + + Qt::Horizontal + + + + + + + Visual gain + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + allVisualGain + + + + + + + Default zoom level + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + defaultZoomComboBox + + + + + + + Waveform prefilter opacity + + + + + + + 100 Qt::Horizontal @@ -516,59 +583,48 @@ Select from different types of displays for the waveform, which differ primarily - - - - Play marker position - - - - - - - Moves the play marker position on the waveforms to the left, right or center (default). - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - 0 - - - 100 - - - 50 - - - Qt::Horizontal - - + + + + Highlight the waveforms when the last seconds of a track remains. + + + seconds + + + 0 + + + 60 + + + 30 + + + + + + + The waveform overview shows the waveform envelope of the entire track. +Select from different types of displays for the waveform overview, which differ primarily in the level of detail shown in the waveform. + + + + + + + 100 + + + 90 + + + Qt::Horizontal + + - - - - Qt::Vertical - - - - 20 - 40 - - - - diff --git a/src/waveform/renderers/glslwaveformrenderersignal.cpp b/src/waveform/renderers/glslwaveformrenderersignal.cpp index 347ad2156e37..bafbf0afea8c 100644 --- a/src/waveform/renderers/glslwaveformrenderersignal.cpp +++ b/src/waveform/renderers/glslwaveformrenderersignal.cpp @@ -326,6 +326,8 @@ void GLSLWaveformRendererSignal::draw(QPainter* painter, QPaintEvent* /*event*/) m_frameShaderProgram->setUniformValue("lowGain", lowGain); m_frameShaderProgram->setUniformValue("midGain", midGain); m_frameShaderProgram->setUniformValue("highGain", highGain); + m_frameShaderProgram->setUniformValue("alpha", (float)m_pAlphaControlObject->get()); + m_frameShaderProgram->setUniformValue("alphaUnscaled", (float)m_pAlphaPrefilterControlObject->get()); m_frameShaderProgram->setUniformValue("axesColor", QVector4D(m_axesColor_r, m_axesColor_g, m_axesColor_b, m_axesColor_a)); diff --git a/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp b/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp index 5c65e48e5ac2..ba5b794aecaa 100644 --- a/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp +++ b/src/waveform/renderers/glwaveformrendererfilteredsignal.cpp @@ -2,6 +2,7 @@ #if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_2) #include +#include #include "track/track.h" #include "waveform/waveform.h" @@ -62,146 +63,159 @@ void GLWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*ev glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Per-band gain from the EQ knobs. - float allGain(1.0), lowGain(1.0), midGain(1.0), highGain(1.0); - getGains(&allGain, &lowGain, &midGain, &highGain); - - if (m_alignment == Qt::AlignCenter) { - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - if (m_orientation == Qt::Vertical) { - glRotatef(90.0f, 0.0f, 0.0f, 1.0f); - glScalef(-1.0f, 1.0f, 1.0f); + float allGain(1.0), lowGain(1.0), midGain(1.0), highGain(1.0), alpha(1.0); + + for (int i = 0; i < 2; i++) { + if (i == 0) { + // first pass in the unfiltered value, only master gain is added + getGains(&allGain, nullptr, nullptr, nullptr); + alpha = m_pAlphaPrefilterControlObject->get(); + } else { + // now the filtered value is overdrawn + getGains(&allGain, &lowGain, &midGain, &highGain); + alpha = m_pAlphaControlObject->get(); } - glOrtho(firstVisualIndex, lastVisualIndex, -255.0, 255.0, -10.0, 10.0); + if (alpha <= 0.0) { + continue; + } + if (m_alignment == Qt::AlignCenter) { + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + if (m_orientation == Qt::Vertical) { + glRotatef(90.0f, 0.0f, 0.0f, 1.0f); + glScalef(-1.0f, 1.0f, 1.0f); + } + glOrtho(firstVisualIndex, lastVisualIndex, -255.0, 255.0, -10.0, 10.0); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); - glScalef(1.f,allGain,1.f); + glScalef(1.f,allGain,1.f); - glLineWidth(1.0); - glDisable(GL_LINE_SMOOTH); + glLineWidth(1.0); + glDisable(GL_LINE_SMOOTH); - //draw reference line - glBegin(GL_LINES); { - glColor4f(m_axesColor_r, m_axesColor_g, - m_axesColor_b, m_axesColor_a); - glVertex2f(firstVisualIndex,0); - glVertex2f(lastVisualIndex,0); - } - glEnd(); + //draw reference line + glBegin(GL_LINES); { + glColor4f(m_axesColor_r, m_axesColor_g, + m_axesColor_b, m_axesColor_a); + glVertex2f(firstVisualIndex,0); + glVertex2f(lastVisualIndex,0); + } + glEnd(); - glLineWidth(lineWidth); - glEnable(GL_LINE_SMOOTH); + glLineWidth(lineWidth); + glEnable(GL_LINE_SMOOTH); - glBegin(GL_LINES); { + glBegin(GL_LINES); { - int firstIndex = math_max(static_cast(firstVisualIndex), 0); - int lastIndex = math_min(static_cast(lastVisualIndex), dataSize); + int firstIndex = math_max(static_cast(firstVisualIndex), 0); + int lastIndex = math_min(static_cast(lastVisualIndex), dataSize); - glColor4f(m_lowColor_r, m_lowColor_g, m_lowColor_b, 0.8); - for (int visualIndex = firstIndex; - visualIndex < lastIndex; - visualIndex += 2) { + glColor4f(m_lowColor_r, m_lowColor_g, m_lowColor_b, alpha); + for (int visualIndex = firstIndex; + visualIndex < lastIndex; + visualIndex += 2) { - GLfloat maxLow0 = data[visualIndex].filtered.low; - GLfloat maxLow1 = data[visualIndex+1].filtered.low; + GLfloat maxLow0 = data[visualIndex].filtered.low; + GLfloat maxLow1 = data[visualIndex+1].filtered.low; - glVertex2f(visualIndex,lowGain*maxLow0); - glVertex2f(visualIndex,-1.f*lowGain*maxLow1); - } + glVertex2f(visualIndex,lowGain*maxLow0); + glVertex2f(visualIndex,-1.f*lowGain*maxLow1); + } - glColor4f(m_midColor_r, m_midColor_g, m_midColor_b, 0.85); - for (int visualIndex = firstIndex; - visualIndex < lastIndex; - visualIndex += 2) { + glColor4f(m_midColor_r, m_midColor_g, m_midColor_b, qMin(alpha + 0.05f, 1.0f)); + for (int visualIndex = firstIndex; + visualIndex < lastIndex; + visualIndex += 2) { - GLfloat maxMid0 = data[visualIndex].filtered.mid; - GLfloat maxMid1 = data[visualIndex+1].filtered.mid; + GLfloat maxMid0 = data[visualIndex].filtered.mid; + GLfloat maxMid1 = data[visualIndex+1].filtered.mid; - glVertex2f(visualIndex, midGain * maxMid0); - glVertex2f(visualIndex,-1.f * midGain * maxMid1); - } + glVertex2f(visualIndex, midGain * maxMid0); + glVertex2f(visualIndex,-1.f * midGain * maxMid1); + } - glColor4f(m_highColor_r, m_highColor_g, m_highColor_b, 0.9); - for (int visualIndex = firstIndex; - visualIndex < lastIndex; - visualIndex += 2) { + glColor4f(m_highColor_r, m_highColor_g, m_highColor_b, qMin(alpha + 0.1f, 1.0f)); + for (int visualIndex = firstIndex; + visualIndex < lastIndex; + visualIndex += 2) { - GLfloat maxHigh0 = data[visualIndex].filtered.high; - GLfloat maxHigh1 = data[visualIndex + 1].filtered.high; + GLfloat maxHigh0 = data[visualIndex].filtered.high; + GLfloat maxHigh1 = data[visualIndex + 1].filtered.high; - glVertex2f(visualIndex, highGain * maxHigh0); - glVertex2f(visualIndex, -1.f * highGain * maxHigh1); + glVertex2f(visualIndex, highGain * maxHigh0); + glVertex2f(visualIndex, -1.f * highGain * maxHigh1); + } } - } - glEnd(); - } else { //top || bottom - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - if (m_orientation == Qt::Vertical) { - glRotatef(90.0f, 0.0f, 0.0f, 1.0f); - glScalef(-1.0f, 1.0f, 1.0f); - } - if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignRight) - glOrtho(firstVisualIndex, lastVisualIndex, 0.0, 255.0, -10.0, 10.0); - else - glOrtho(firstVisualIndex, lastVisualIndex, 255.0, 0.0, -10.0, 10.0); + glEnd(); + } else { //top || bottom + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + if (m_orientation == Qt::Vertical) { + glRotatef(90.0f, 0.0f, 0.0f, 1.0f); + glScalef(-1.0f, 1.0f, 1.0f); + } + if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignRight) + 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(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); - glScalef(1.f,allGain,1.f); + glScalef(1.f,allGain,1.f); - glLineWidth(lineWidth); - glEnable(GL_LINE_SMOOTH); + glLineWidth(lineWidth); + glEnable(GL_LINE_SMOOTH); - glBegin(GL_LINES); { + glBegin(GL_LINES); { - int firstIndex = math_max(static_cast(firstVisualIndex), 0); - int lastIndex = math_min(static_cast(lastVisualIndex), dataSize); + int firstIndex = math_max(static_cast(firstVisualIndex), 0); + int lastIndex = math_min(static_cast(lastVisualIndex), dataSize); - glColor4f(m_lowColor_r, m_lowColor_g, m_lowColor_b, 0.8); - for (int visualIndex = firstIndex; - visualIndex < lastIndex; - visualIndex += 2) { + glColor4f(m_lowColor_r, m_lowColor_g, m_lowColor_b, alpha); + for (int visualIndex = firstIndex; + visualIndex < lastIndex; + visualIndex += 2) { - GLfloat maxLow = math_max( - data[visualIndex].filtered.low, - data[visualIndex+1].filtered.low); + GLfloat maxLow = math_max( + data[visualIndex].filtered.low, + data[visualIndex+1].filtered.low); - glVertex2f(visualIndex, 0); - glVertex2f(visualIndex, lowGain * maxLow); - } + glVertex2f(visualIndex, 0); + glVertex2f(visualIndex, lowGain * maxLow); + } - glColor4f(m_midColor_r, m_midColor_g, m_midColor_b, 0.85); - for (int visualIndex = firstIndex; - visualIndex < lastIndex; - visualIndex += 2) { + glColor4f(m_midColor_r, m_midColor_g, m_midColor_b, qMin(alpha + 0.05f, 1.0f)); + for (int visualIndex = firstIndex; + visualIndex < lastIndex; + visualIndex += 2) { - GLfloat maxMid = math_max( - data[visualIndex].filtered.mid, - data[visualIndex+1].filtered.mid); + GLfloat maxMid = math_max( + data[visualIndex].filtered.mid, + data[visualIndex+1].filtered.mid); - glVertex2f(visualIndex, 0.f); - glVertex2f(visualIndex, midGain * maxMid); - } + glVertex2f(visualIndex, 0.f); + glVertex2f(visualIndex, midGain * maxMid); + } - glColor4f(m_highColor_r, m_highColor_g, m_highColor_b, 0.9); - for (int visualIndex = firstIndex; - visualIndex < lastIndex; - visualIndex += 2) { + glColor4f(m_highColor_r, m_highColor_g, m_highColor_b, qMin(alpha + 0.1f, 1.0f)); + for (int visualIndex = firstIndex; + visualIndex < lastIndex; + visualIndex += 2) { - GLfloat maxHigh = math_max( - data[visualIndex].filtered.high, - data[visualIndex + 1].filtered.high); + GLfloat maxHigh = math_max( + data[visualIndex].filtered.high, + data[visualIndex + 1].filtered.high); - glVertex2f(visualIndex, 0.f); - glVertex2f(visualIndex, highGain * maxHigh); + glVertex2f(visualIndex, 0.f); + glVertex2f(visualIndex, highGain * maxHigh); + } } } glEnd(); diff --git a/src/waveform/renderers/glwaveformrendererrgb.cpp b/src/waveform/renderers/glwaveformrendererrgb.cpp index 7620dae20038..a1dd5e9b32f6 100644 --- a/src/waveform/renderers/glwaveformrendererrgb.cpp +++ b/src/waveform/renderers/glwaveformrendererrgb.cpp @@ -58,134 +58,148 @@ void GLWaveformRendererRGB::draw(QPainter* painter, QPaintEvent* /*event*/) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Per-band gain from the EQ knobs. - float allGain(1.0), lowGain(1.0), midGain(1.0), highGain(1.0); - getGains(&allGain, &lowGain, &midGain, &highGain); + float allGain(1.0), lowGain(1.0), midGain(1.0), highGain(1.0), alpha(1.0); const float kHeightScaleFactor = 255.0 / sqrtf(255 * 255 * 3); - if (m_alignment == Qt::AlignCenter) { - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - if (m_orientation == Qt::Vertical) { - glRotatef(90.0f, 0.0f, 0.0f, 1.0f); - glScalef(-1.0f, 1.0f, 1.0f); + for (int i = 0; i < 2; i++) { + if (i == 0) { + // first pass in the unfiltered value, only master gain is added + getGains(&allGain, nullptr, nullptr, nullptr); + alpha = m_pAlphaPrefilterControlObject->get(); + } else { + // now the filtered value is overdrawn + getGains(&allGain, &lowGain, &midGain, &highGain); + alpha = m_pAlphaControlObject->get(); + } + if (alpha <= 0.0) { + continue; } - glOrtho(firstVisualIndex, lastVisualIndex, -255.0, 255.0, -10.0, 10.0); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); + if (m_alignment == Qt::AlignCenter) { + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + if (m_orientation == Qt::Vertical) { + glRotatef(90.0f, 0.0f, 0.0f, 1.0f); + glScalef(-1.0f, 1.0f, 1.0f); + } + glOrtho(firstVisualIndex, lastVisualIndex, -255.0, 255.0, -10.0, 10.0); - glScalef(1.0f, allGain, 1.0f); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); - glLineWidth(1.2); - glDisable(GL_LINE_SMOOTH); + glScalef(1.0f, allGain, 1.0f); - // Draw reference line - glBegin(GL_LINES); { - glColor4f(m_axesColor_r, m_axesColor_g, m_axesColor_b, m_axesColor_a); - glVertex2f(firstVisualIndex, 0); - glVertex2f(lastVisualIndex, 0); - } - glEnd(); - - glLineWidth(lineWidth); - glEnable(GL_LINE_SMOOTH); - - glBegin(GL_LINES); { - - int firstIndex = math_max(static_cast(firstVisualIndex), 0); - int lastIndex = math_min(static_cast(lastVisualIndex), dataSize); - - for (int visualIndex = firstIndex; - visualIndex < lastIndex; - visualIndex += 2) { - - float left_low = lowGain * (float) data[visualIndex].filtered.low; - float left_mid = midGain * (float) data[visualIndex].filtered.mid; - float left_high = highGain * (float) data[visualIndex].filtered.high; - float left_all = sqrtf(left_low * left_low + left_mid * left_mid + left_high * left_high) * kHeightScaleFactor; - float left_red = left_low * m_rgbLowColor_r + left_mid * m_rgbMidColor_r + left_high * m_rgbHighColor_r; - float left_green = left_low * m_rgbLowColor_g + left_mid * m_rgbMidColor_g + left_high * m_rgbHighColor_g; - float left_blue = left_low * m_rgbLowColor_b + left_mid * m_rgbMidColor_b + left_high * m_rgbHighColor_b; - float left_max = math_max3(left_red, left_green, left_blue); - if (left_max > 0.0f) { // Prevent division by zero - glColor4f(left_red / left_max, left_green / left_max, left_blue / left_max, 0.8f); - glVertex2f(visualIndex, 0.0f); - glVertex2f(visualIndex, left_all); - } + glLineWidth(1.2); + glDisable(GL_LINE_SMOOTH); - float right_low = lowGain * (float) data[visualIndex+1].filtered.low; - float right_mid = midGain * (float) data[visualIndex+1].filtered.mid; - float right_high = highGain * (float) data[visualIndex+1].filtered.high; - float right_all = sqrtf(right_low * right_low + right_mid * right_mid + right_high * right_high) * kHeightScaleFactor; - float right_red = right_low * m_rgbLowColor_r + right_mid * m_rgbMidColor_r + right_high * m_rgbHighColor_r; - float right_green = right_low * m_rgbLowColor_g + right_mid * m_rgbMidColor_g + right_high * m_rgbHighColor_g; - float right_blue = right_low * m_rgbLowColor_b + right_mid * m_rgbMidColor_b + right_high * m_rgbHighColor_b; - float right_max = math_max3(right_red, right_green, right_blue); - if (right_max > 0.0f) { // Prevent division by zero - glColor4f(right_red / right_max, right_green / right_max, right_blue / right_max, 0.8f); - glVertex2f(visualIndex, 0.0f); - glVertex2f(visualIndex, -1.0f * right_all); + // Draw reference line + glBegin(GL_LINES); { + glColor4f(m_axesColor_r, m_axesColor_g, m_axesColor_b, m_axesColor_a); + glVertex2f(firstVisualIndex, 0); + glVertex2f(lastVisualIndex, 0); + } + glEnd(); + + glLineWidth(lineWidth); + glEnable(GL_LINE_SMOOTH); + + glBegin(GL_LINES); { + + int firstIndex = math_max(static_cast(firstVisualIndex), 0); + int lastIndex = math_min(static_cast(lastVisualIndex), dataSize); + + for (int visualIndex = firstIndex; + visualIndex < lastIndex; + visualIndex += 2) { + + float left_low = lowGain * (float) data[visualIndex].filtered.low; + float left_mid = midGain * (float) data[visualIndex].filtered.mid; + float left_high = highGain * (float) data[visualIndex].filtered.high; + float left_all = sqrtf(left_low * left_low + left_mid * left_mid + left_high * left_high) * kHeightScaleFactor; + float left_red = left_low * m_rgbLowColor_r + left_mid * m_rgbMidColor_r + left_high * m_rgbHighColor_r; + float left_green = left_low * m_rgbLowColor_g + left_mid * m_rgbMidColor_g + left_high * m_rgbHighColor_g; + float left_blue = left_low * m_rgbLowColor_b + left_mid * m_rgbMidColor_b + left_high * m_rgbHighColor_b; + float left_max = math_max3(left_red, left_green, left_blue); + if (left_max > 0.0f) { // Prevent division by zero + glColor4f(left_red / left_max, left_green / left_max, left_blue / left_max, alpha); + glVertex2f(visualIndex, 0.0f); + glVertex2f(visualIndex, left_all); + } + + float right_low = lowGain * (float) data[visualIndex+1].filtered.low; + float right_mid = midGain * (float) data[visualIndex+1].filtered.mid; + float right_high = highGain * (float) data[visualIndex+1].filtered.high; + float right_all = sqrtf(right_low * right_low + right_mid * right_mid + right_high * right_high) * kHeightScaleFactor; + float right_red = right_low * m_rgbLowColor_r + right_mid * m_rgbMidColor_r + right_high * m_rgbHighColor_r; + float right_green = right_low * m_rgbLowColor_g + right_mid * m_rgbMidColor_g + right_high * m_rgbHighColor_g; + float right_blue = right_low * m_rgbLowColor_b + right_mid * m_rgbMidColor_b + right_high * m_rgbHighColor_b; + float right_max = math_max3(right_red, right_green, right_blue); + if (right_max > 0.0f) { // Prevent division by zero + glColor4f(right_red / right_max, right_green / right_max, right_blue / right_max, alpha); + glVertex2f(visualIndex, 0.0f); + glVertex2f(visualIndex, -1.0f * right_all); + } } } - } - glEnd(); + glEnd(); - } else { // top || bottom - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - if (m_orientation == Qt::Vertical) { - glRotatef(90.0f, 0.0f, 0.0f, 1.0f); - glScalef(-1.0f, 1.0f, 1.0f); - } - if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignRight) { - glOrtho(firstVisualIndex, lastVisualIndex, 0.0, 255.0, -10.0, 10.0); - } else { - glOrtho(firstVisualIndex, lastVisualIndex, 255.0, 0.0, -10.0, 10.0); - } + } else { // top || bottom + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + if (m_orientation == Qt::Vertical) { + glRotatef(90.0f, 0.0f, 0.0f, 1.0f); + glScalef(-1.0f, 1.0f, 1.0f); + } + if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignRight) { + 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(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); - glScalef(1.0f, allGain, 1.0f); + glScalef(1.0f, allGain, 1.0f); - glLineWidth(lineWidth); - glEnable(GL_LINE_SMOOTH); + glLineWidth(lineWidth); + glEnable(GL_LINE_SMOOTH); - glBegin(GL_LINES); { + glBegin(GL_LINES); { - int firstIndex = math_max(static_cast(firstVisualIndex), 0); - int lastIndex = math_min(static_cast(lastVisualIndex), dataSize); + int firstIndex = math_max(static_cast(firstVisualIndex), 0); + int lastIndex = math_min(static_cast(lastVisualIndex), dataSize); - for (int visualIndex = firstIndex; - visualIndex < lastIndex; - visualIndex += 2) { + for (int visualIndex = firstIndex; + visualIndex < lastIndex; + visualIndex += 2) { - float low = lowGain * (float) math_max(data[visualIndex].filtered.low, data[visualIndex+1].filtered.low); - float mid = midGain * (float) math_max(data[visualIndex].filtered.mid, data[visualIndex+1].filtered.mid); - float high = highGain * (float) math_max(data[visualIndex].filtered.high, data[visualIndex+1].filtered.high); + float low = lowGain * (float) math_max(data[visualIndex].filtered.low, data[visualIndex+1].filtered.low); + float mid = midGain * (float) math_max(data[visualIndex].filtered.mid, data[visualIndex+1].filtered.mid); + float high = highGain * (float) math_max(data[visualIndex].filtered.high, data[visualIndex+1].filtered.high); - float all = sqrtf(low * low + mid * mid + high * high) * kHeightScaleFactor; + float all = sqrtf(low * low + mid * mid + high * high) * kHeightScaleFactor; - float red = low * m_rgbLowColor_r + mid * m_rgbMidColor_r + high * m_rgbHighColor_r; - float green = low * m_rgbLowColor_g + mid * m_rgbMidColor_g + high * m_rgbHighColor_g; - float blue = low * m_rgbLowColor_b + mid * m_rgbMidColor_b + high * m_rgbHighColor_b; + float red = low * m_rgbLowColor_r + mid * m_rgbMidColor_r + high * m_rgbHighColor_r; + float green = low * m_rgbLowColor_g + mid * m_rgbMidColor_g + high * m_rgbHighColor_g; + float blue = low * m_rgbLowColor_b + mid * m_rgbMidColor_b + high * m_rgbHighColor_b; - float max = math_max3(red, green, blue); - if (max > 0.0f) { // Prevent division by zero - glColor4f(red / max, green / max, blue / max, 0.9f); - glVertex2f(float(visualIndex), 0.0f); - glVertex2f(float(visualIndex), all); + float max = math_max3(red, green, blue); + if (max > 0.0f) { // Prevent division by zero + glColor4f(red / max, green / max, blue / max, alpha); + glVertex2f(float(visualIndex), 0.0f); + glVertex2f(float(visualIndex), all); + } } } - } - glEnd(); + glEnd(); + } } glPopMatrix(); diff --git a/src/waveform/renderers/glwaveformrenderersimplesignal.cpp b/src/waveform/renderers/glwaveformrenderersimplesignal.cpp index 3a161f74f962..b637817f6f84 100644 --- a/src/waveform/renderers/glwaveformrenderersimplesignal.cpp +++ b/src/waveform/renderers/glwaveformrenderersimplesignal.cpp @@ -61,95 +61,107 @@ void GLWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - float allGain(1.0); + float allGain(1.0), alpha(1.0); getGains(&allGain, NULL, NULL, NULL); - if (m_alignment == Qt::AlignCenter) { - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - if (m_orientation == Qt::Vertical) { - glRotatef(90.0f, 0.0f, 0.0f, 1.0f); - glScalef(-1.0f, 1.0f, 1.0f); + for (int i = 0; i < 2; i++) { + if (i == 0) { + // first pass in the unfiltered value, only master gain is added + alpha = m_pAlphaPrefilterControlObject->get(); + } else { + // now the filtered value is overdrawn + alpha = m_pAlphaControlObject->get(); } - glOrtho(firstVisualIndex, lastVisualIndex, -255.0, 255.0, -10.0, 10.0); + if (alpha <= 0.0) { + continue; + } + if (m_alignment == Qt::AlignCenter) { + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + if (m_orientation == Qt::Vertical) { + glRotatef(90.0f, 0.0f, 0.0f, 1.0f); + glScalef(-1.0f, 1.0f, 1.0f); + } + glOrtho(firstVisualIndex, lastVisualIndex, -255.0, 255.0, -10.0, 10.0); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); - glScalef(1.f, allGain, 1.f); + glScalef(1.f, allGain, 1.f); - glLineWidth(1.0); - glDisable(GL_LINE_SMOOTH); + glLineWidth(1.0); + glDisable(GL_LINE_SMOOTH); - //draw reference line - glBegin(GL_LINES); { - glColor4f(m_axesColor_r, m_axesColor_g, - m_axesColor_b, m_axesColor_a); - glVertex2f(firstVisualIndex,0); - glVertex2f(lastVisualIndex,0); - } - glEnd(); + //draw reference line + glBegin(GL_LINES); { + glColor4f(m_axesColor_r, m_axesColor_g, + m_axesColor_b, m_axesColor_a); + glVertex2f(firstVisualIndex,0); + glVertex2f(lastVisualIndex,0); + } + glEnd(); - glLineWidth(lineWidth); - glEnable(GL_LINE_SMOOTH); + glLineWidth(lineWidth); + glEnable(GL_LINE_SMOOTH); - glBegin(GL_LINES); { - int firstIndex = math_max(static_cast(firstVisualIndex), 0); - int lastIndex = math_min(static_cast(lastVisualIndex), dataSize); + glBegin(GL_LINES); { + int firstIndex = math_max(static_cast(firstVisualIndex), 0); + int lastIndex = math_min(static_cast(lastVisualIndex), dataSize); - glColor4f(m_signalColor_r, m_signalColor_g, m_signalColor_b, 0.9); - for (int visualIndex = firstIndex; - visualIndex < lastIndex; - visualIndex += 2) { + glColor4f(m_signalColor_r, m_signalColor_g, m_signalColor_b, alpha); + for (int visualIndex = firstIndex; + visualIndex < lastIndex; + visualIndex += 2) { - GLfloat maxAll0 = data[visualIndex].filtered.all; - GLfloat maxAll1 = data[visualIndex+1].filtered.all; - glVertex2f(visualIndex, maxAll0); - glVertex2f(visualIndex, -1.f * maxAll1); + GLfloat maxAll0 = data[visualIndex].filtered.all; + GLfloat maxAll1 = data[visualIndex+1].filtered.all; + glVertex2f(visualIndex, maxAll0); + glVertex2f(visualIndex, -1.f * maxAll1); + } } - } - glEnd(); - } else { //top || bottom - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - if (m_orientation == Qt::Vertical) { - glRotatef(90.0f, 0.0f, 0.0f, 1.0f); - glScalef(-1.0f, 1.0f, 1.0f); - } - if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignRight) - 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, allGain, 1.f); - - glLineWidth(lineWidth); - glEnable(GL_LINE_SMOOTH); - - glBegin(GL_LINES); { - int firstIndex = math_max(static_cast(firstVisualIndex), 0); - int lastIndex = math_min(static_cast(lastVisualIndex), dataSize); - - glColor4f(m_signalColor_r, m_signalColor_g, m_signalColor_b, 0.8); - for (int visualIndex = firstIndex; - visualIndex < lastIndex; - visualIndex += 2) { - - GLfloat maxAll = math_max( - data[visualIndex].filtered.all, - data[visualIndex+1].filtered.all); - glVertex2f(float(visualIndex), 0.f); - glVertex2f(float(visualIndex), maxAll); + glEnd(); + } else { //top || bottom + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + if (m_orientation == Qt::Vertical) { + glRotatef(90.0f, 0.0f, 0.0f, 1.0f); + glScalef(-1.0f, 1.0f, 1.0f); + } + if (m_alignment == Qt::AlignBottom || m_alignment == Qt::AlignRight) + 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, allGain, 1.f); + + glLineWidth(lineWidth); + glEnable(GL_LINE_SMOOTH); + + glBegin(GL_LINES); { + int firstIndex = math_max(static_cast(firstVisualIndex), 0); + int lastIndex = math_min(static_cast(lastVisualIndex), dataSize); + + glColor4f(m_signalColor_r, m_signalColor_g, m_signalColor_b, alpha); + for (int visualIndex = firstIndex; + visualIndex < lastIndex; + visualIndex += 2) { + + GLfloat maxAll = math_max( + data[visualIndex].filtered.all, + data[visualIndex+1].filtered.all); + glVertex2f(float(visualIndex), 0.f); + glVertex2f(float(visualIndex), maxAll); + } } + glEnd(); } - glEnd(); } glPopMatrix(); glMatrixMode(GL_PROJECTION); diff --git a/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp b/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp index 2552db397994..759532eea923 100644 --- a/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp +++ b/src/waveform/renderers/qtwaveformrendererfilteredsignal.cpp @@ -20,6 +20,9 @@ QtWaveformRendererFilteredSignal::~QtWaveformRendererFilteredSignal() { } void QtWaveformRendererFilteredSignal::onSetup(const QDomNode& /*node*/) { +} + +void QtWaveformRendererFilteredSignal::configure() { QColor low = m_pColors->getLowColor(); QColor mid = m_pColors->getMidColor(); QColor high = m_pColors->getHighColor(); @@ -27,14 +30,15 @@ void QtWaveformRendererFilteredSignal::onSetup(const QDomNode& /*node*/) { QColor lowCenter = low; QColor midCenter = mid; QColor highCenter = high; + double alpha = m_pAlphaControlObject->get(); - low.setAlphaF(0.9); - mid.setAlphaF(0.9); - high.setAlphaF(0.9); + low.setAlphaF(alpha); + mid.setAlphaF(alpha); + high.setAlphaF(alpha); - lowCenter.setAlphaF(0.5); - midCenter.setAlphaF(0.5); - highCenter.setAlphaF(0.5); + lowCenter.setAlphaF(qMax(alpha-0.4, 0.0)); + midCenter.setAlphaF(qMax(alpha-0.4, 0.0)); + highCenter.setAlphaF(qMax(alpha-0.4, 0.0)); QLinearGradient gradientLow(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0)); gradientLow.setColorAt(0.0, low); @@ -60,9 +64,10 @@ void QtWaveformRendererFilteredSignal::onSetup(const QDomNode& /*node*/) { gradientHigh.setColorAt(1.0, high); m_highBrush = QBrush(gradientHigh); - low.setAlphaF(0.3); - mid.setAlphaF(0.3); - high.setAlphaF(0.3); + alpha = m_pAlphaPrefilterControlObject->get(); + low.setAlphaF(alpha); + mid.setAlphaF(alpha); + high.setAlphaF(alpha); QLinearGradient gradientKilledLow(QPointF(0.0,-255.0/2.0),QPointF(0.0,255.0/2.0)); gradientKilledLow.setColorAt(0.0,low.darker(80)); @@ -139,6 +144,7 @@ int QtWaveformRendererFilteredSignal::buildPolygon() { const double gain = (lastVisualIndex - firstVisualIndex) / (double)m_waveformRenderer->getLength(); + float lowGain(1.0), midGain(1.0), highGain(1.0); getGains(NULL, &lowGain, &midGain, &highGain); @@ -276,6 +282,8 @@ void QtWaveformRendererFilteredSignal::draw(QPainter* painter, QPaintEvent* /*ev if (!pTrack) return; + configure(); + PainterScope PainterScope(painter); painter->setRenderHint(QPainter::Antialiasing); diff --git a/src/waveform/renderers/qtwaveformrendererfilteredsignal.h b/src/waveform/renderers/qtwaveformrendererfilteredsignal.h index e3a685445e09..794e92fd2ba2 100644 --- a/src/waveform/renderers/qtwaveformrendererfilteredsignal.h +++ b/src/waveform/renderers/qtwaveformrendererfilteredsignal.h @@ -19,6 +19,7 @@ class QtWaveformRendererFilteredSignal : public WaveformRendererSignalBase { protected: virtual void onResize(); int buildPolygon(); + void configure(); protected: QBrush m_lowBrush; diff --git a/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp b/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp index 0669422b844a..3b0c9ed0d8d7 100644 --- a/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp +++ b/src/waveform/renderers/qtwaveformrenderersimplesignal.cpp @@ -26,10 +26,6 @@ void QtWaveformRendererSimpleSignal::onSetup(const QDomNode& node) { borderColor.setAlphaF(0.5); m_borderPen.setColor(borderColor); m_borderPen.setWidthF(1.25); - - QColor signalColor = m_pColors->getSignalColor(); - signalColor.setAlphaF(0.8); - m_brush = QBrush(signalColor); } inline void setPoint(QPointF& point, qreal x, qreal y) { @@ -69,7 +65,7 @@ void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even painter->setTransform(QTransform(0, 1, -1, 0, m_waveformRenderer->getWidth(), 0)); } - float allGain(1.0); + float allGain(1.0), alpha(1.0); getGains(&allGain, NULL, NULL, NULL); double heightGain = allGain * (double)m_waveformRenderer->getBreadth()/255.0; @@ -206,15 +202,34 @@ void QtWaveformRendererSimpleSignal::draw(QPainter* painter, QPaintEvent* /*even } } + //If channel are not displayed separately we need to close the loop properly if (channelSeparation == 1) { m_polygon.append(QPointF(m_waveformRenderer->getLength(), 0.0)); } - painter->setPen(m_borderPen); - painter->setBrush(m_brush); + // draw filtered and then unfiltered polygon + for (int i = 0; i < 2; i++) { + if (i == 0) { + // first pass in the unfiltered value, only master gain is added + alpha = m_pAlphaPrefilterControlObject->get(); + } else { + // now the filtered value is overdrawn + alpha = m_pAlphaControlObject->get(); + } + if (alpha <= 0.0) { + continue; + } - painter->drawPolygon(&m_polygon[0], m_polygon.size()); + painter->setPen(m_borderPen); + + QColor signalColor = m_pColors->getSignalColor(); + signalColor.setAlphaF(alpha); + QBrush brush = QBrush(signalColor); + painter->setBrush(brush); + + painter->drawPolygon(&m_polygon[0], m_polygon.size()); + } } void QtWaveformRendererSimpleSignal::onResize() { diff --git a/src/waveform/renderers/qtwaveformrenderersimplesignal.h b/src/waveform/renderers/qtwaveformrenderersimplesignal.h index a041fc9ca135..e80936c3d3a7 100644 --- a/src/waveform/renderers/qtwaveformrenderersimplesignal.h +++ b/src/waveform/renderers/qtwaveformrenderersimplesignal.h @@ -22,7 +22,6 @@ class QtWaveformRendererSimpleSignal : public WaveformRendererSignalBase { virtual void onResize(); private: - QBrush m_brush; QPen m_borderPen; QVector m_polygon; }; diff --git a/src/waveform/renderers/waveformrenderersignalbase.cpp b/src/waveform/renderers/waveformrenderersignalbase.cpp index f14d7edcec33..2eef0b78be44 100644 --- a/src/waveform/renderers/waveformrenderersignalbase.cpp +++ b/src/waveform/renderers/waveformrenderersignalbase.cpp @@ -19,6 +19,8 @@ WaveformRendererSignalBase::WaveformRendererSignalBase( m_pLowKillControlObject(NULL), m_pMidKillControlObject(NULL), m_pHighKillControlObject(NULL), + m_pAlphaControlObject(NULL), + m_pAlphaPrefilterControlObject(NULL), m_alignment(Qt::AlignCenter), m_orientation(Qt::Horizontal), m_pColors(NULL), @@ -68,6 +70,10 @@ void WaveformRendererSignalBase::deleteControls() { delete m_pMidKillControlObject; if (m_pHighKillControlObject) delete m_pHighKillControlObject; + if (m_pAlphaControlObject) + delete m_pAlphaControlObject; + if (m_pAlphaPrefilterControlObject) + delete m_pAlphaPrefilterControlObject; } bool WaveformRendererSignalBase::init() { @@ -88,6 +94,10 @@ bool WaveformRendererSignalBase::init() { m_waveformRenderer->getGroup(), "filterMidKill"); m_pHighKillControlObject = new ControlProxy( m_waveformRenderer->getGroup(), "filterHighKill"); + m_pAlphaControlObject = new ControlProxy( + "[Controls]", "waveform_alpha"); + m_pAlphaPrefilterControlObject = new ControlProxy( + "[Controls]", "waveform_alpha_prefilter"); return onInit(); } diff --git a/src/waveform/renderers/waveformrenderersignalbase.h b/src/waveform/renderers/waveformrenderersignalbase.h index ab47b753d94e..f4f78ce81bd7 100644 --- a/src/waveform/renderers/waveformrenderersignalbase.h +++ b/src/waveform/renderers/waveformrenderersignalbase.h @@ -33,6 +33,8 @@ class WaveformRendererSignalBase : public WaveformRendererAbstract { ControlProxy* m_pLowKillControlObject; ControlProxy* m_pMidKillControlObject; ControlProxy* m_pHighKillControlObject; + ControlProxy* m_pAlphaControlObject; + ControlProxy* m_pAlphaPrefilterControlObject; Qt::Alignment m_alignment; Qt::Orientation m_orientation;