| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							| 
									
										
										
										
											2016-03-04 18:51:03 +01:00
										 |  |  | // Copyright (C) 2016 F4EXB                                                      //
 | 
					
						
							|  |  |  | // written by Edouard Griffiths                                                  //
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // This program is free software; you can redistribute it and/or modify          //
 | 
					
						
							|  |  |  | // it under the terms of the GNU General Public License as published by          //
 | 
					
						
							|  |  |  | // the Free Software Foundation as version 3 of the License, or                  //
 | 
					
						
							| 
									
										
										
										
											2019-04-11 14:43:33 +02:00
										 |  |  | // (at your option) any later version.                                           //
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful,               //
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of                //
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                  //
 | 
					
						
							|  |  |  | // GNU General Public License V3 for more details.                               //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License             //
 | 
					
						
							|  |  |  | // along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-06 04:37:43 +02:00
										 |  |  | #if 0 //def USE_SSE2
 | 
					
						
							| 
									
										
										
										
											2016-11-07 00:42:57 +01:00
										 |  |  | #include <emmintrin.h>
 | 
					
						
							| 
									
										
										
										
											2015-07-05 17:08:06 +02:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-02-28 10:53:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | #include <QMouseEvent>
 | 
					
						
							| 
									
										
										
										
											2016-03-02 03:09:50 +01:00
										 |  |  | #include <QOpenGLShaderProgram>
 | 
					
						
							| 
									
										
										
										
											2016-03-02 08:32:43 +01:00
										 |  |  | #include <QOpenGLFunctions>
 | 
					
						
							| 
									
										
										
										
											2016-03-05 16:44:29 +01:00
										 |  |  | #include <QPainter>
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | #include <QFontDatabase>
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | #include "gui/glspectrum.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-01 20:48:30 +02:00
										 |  |  | #include "util/messagequeue.h"
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-09 10:33:04 +02:00
										 |  |  | #include <QDebug>
 | 
					
						
							| 
									
										
										
										
											2015-05-11 03:27:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-01 20:48:30 +02:00
										 |  |  | MESSAGE_CLASS_DEFINITION(GLSpectrum::MsgReportSampleRate, Message) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | GLSpectrum::GLSpectrum(QWidget* parent) : | 
					
						
							| 
									
										
										
										
											2016-03-05 21:54:24 +01:00
										 |  |  | 	QGLWidget(parent), | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_cursorState(CSNormal), | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |     m_cursorChannel(0), | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_mouseInside(false), | 
					
						
							|  |  |  | 	m_changesPending(true), | 
					
						
							|  |  |  | 	m_centerFrequency(100000000), | 
					
						
							|  |  |  | 	m_referenceLevel(0), | 
					
						
							|  |  |  | 	m_powerRange(100), | 
					
						
							| 
									
										
										
										
											2018-07-06 01:34:05 +02:00
										 |  |  | 	m_linear(false), | 
					
						
							| 
									
										
										
										
											2018-10-19 00:40:14 +02:00
										 |  |  | 	m_decay(1), | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_sampleRate(500000), | 
					
						
							| 
									
										
										
										
											2018-07-01 03:11:36 +02:00
										 |  |  | 	m_timingRate(1), | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_fftSize(512), | 
					
						
							|  |  |  | 	m_displayGrid(true), | 
					
						
							| 
									
										
										
										
											2015-05-12 15:49:03 +02:00
										 |  |  | 	m_displayGridIntensity(5), | 
					
						
							| 
									
										
										
										
											2015-07-18 17:53:57 +02:00
										 |  |  | 	m_displayTraceIntensity(50), | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_invertedWaterfall(false), | 
					
						
							|  |  |  | 	m_displayMaxHold(false), | 
					
						
							| 
									
										
										
										
											2015-07-16 08:38:33 +02:00
										 |  |  | 	m_currentSpectrum(0), | 
					
						
							| 
									
										
										
										
											2015-07-16 04:55:14 +02:00
										 |  |  | 	m_displayCurrent(false), | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  |     m_leftMargin(0), | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |     m_rightMargin(0), | 
					
						
							|  |  |  |     m_topMargin(0), | 
					
						
							|  |  |  |     m_histogramHeight(20), | 
					
						
							|  |  |  |     m_waterfallHeight(0), | 
					
						
							|  |  |  |     m_frequencyScaleHeight(0), | 
					
						
							|  |  |  |     m_bottomMargin(0), | 
					
						
							| 
									
										
										
										
											2018-10-19 00:40:14 +02:00
										 |  |  | 	m_waterfallBuffer(0), | 
					
						
							| 
									
										
										
										
											2017-05-05 10:40:45 +02:00
										 |  |  | 	m_waterfallBufferPos(0), | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |     m_waterfallTextureHeight(-1), | 
					
						
							|  |  |  |     m_waterfallTexturePos(0), | 
					
						
							|  |  |  |     m_displayWaterfall(true), | 
					
						
							|  |  |  |     m_ssbSpectrum(false), | 
					
						
							| 
									
										
										
										
											2017-07-22 04:23:10 +02:00
										 |  |  |     m_lsbDisplay(false), | 
					
						
							| 
									
										
										
										
											2018-10-19 00:40:14 +02:00
										 |  |  |     m_histogramBuffer(0), | 
					
						
							|  |  |  |     m_histogram(0), | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |     m_displayHistogram(true), | 
					
						
							|  |  |  |     m_displayChanged(false), | 
					
						
							| 
									
										
										
										
											2019-05-30 18:38:10 +02:00
										 |  |  |     m_displaySourceOrSink(true), | 
					
						
							|  |  |  |     m_displayStreamIndex(0), | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  |     m_matrixLoc(0), | 
					
						
							| 
									
										
										
										
											2018-07-01 20:48:30 +02:00
										 |  |  |     m_colorLoc(0), | 
					
						
							|  |  |  |     m_messageQueueToGUI(0) | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | { | 
					
						
							|  |  |  | 	setAutoFillBackground(false); | 
					
						
							|  |  |  | 	setAttribute(Qt::WA_OpaquePaintEvent, true); | 
					
						
							|  |  |  | 	setAttribute(Qt::WA_NoSystemBackground, true); | 
					
						
							|  |  |  | 	setMouseTracking(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setMinimumSize(200, 200); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	m_waterfallShare = 0.66; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-06 04:08:08 +02:00
										 |  |  | 	for (int i = 0; i <= 239; i++) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | 	    QColor c; | 
					
						
							|  |  |  | 	    c.setHsv(239 - i, 255, 15 + i); | 
					
						
							|  |  |  | 	    ((quint8*)&m_waterfallPalette[i])[0] = c.red(); | 
					
						
							|  |  |  | 	    ((quint8*)&m_waterfallPalette[i])[1] = c.green(); | 
					
						
							|  |  |  | 	    ((quint8*)&m_waterfallPalette[i])[2] = c.blue(); | 
					
						
							|  |  |  | 	    ((quint8*)&m_waterfallPalette[i])[3] = c.alpha(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-06 04:08:08 +02:00
										 |  |  | 	m_waterfallPalette[239] = 0xffffffff; | 
					
						
							| 
									
										
										
										
											2018-10-19 00:40:14 +02:00
										 |  |  | 	m_histogramPalette[0] = 0; | 
					
						
							| 
									
										
										
										
											2018-10-20 19:20:11 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for (int i = 1; i < 240; i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	    QColor c; | 
					
						
							| 
									
										
										
										
											2018-10-24 08:29:49 +02:00
										 |  |  | 	    int light = i < 60 ? 128 + (60-i) : 128; | 
					
						
							|  |  |  | 	    int sat   = i < 60 ? 140 + i : i < 180 ? 200 : 200 - (i-180); | 
					
						
							|  |  |  | 	    c.setHsl(239 - i, sat, light); | 
					
						
							| 
									
										
										
										
											2018-10-20 19:20:11 +02:00
										 |  |  |         ((quint8*)&m_histogramPalette[i])[0] = c.red(); | 
					
						
							|  |  |  |         ((quint8*)&m_histogramPalette[i])[1] = c.green(); | 
					
						
							|  |  |  |         ((quint8*)&m_histogramPalette[i])[2] = c.blue(); | 
					
						
							|  |  |  |         ((quint8*)&m_histogramPalette[i])[3] = c.alpha(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-16 04:55:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-24 01:05:49 +02:00
										 |  |  | 	// 4.2.3 palette
 | 
					
						
							|  |  |  | //    for (int i = 1; i < 240; i++)
 | 
					
						
							|  |  |  | //    {
 | 
					
						
							|  |  |  | //        QColor c;
 | 
					
						
							|  |  |  | //        int val = i < 60 ? 255 : 200;
 | 
					
						
							|  |  |  | //        int sat = i < 60 ? 128 : i < 180 ? 255 : 180;
 | 
					
						
							|  |  |  | //        c.setHsv(239 - i, sat, val);
 | 
					
						
							|  |  |  | //        ((quint8*)&m_histogramPalette[i])[0] = c.red();
 | 
					
						
							|  |  |  | //        ((quint8*)&m_histogramPalette[i])[1] = c.green();
 | 
					
						
							|  |  |  | //        ((quint8*)&m_histogramPalette[i])[2] = c.blue();
 | 
					
						
							|  |  |  | //        ((quint8*)&m_histogramPalette[i])[3] = c.alpha();
 | 
					
						
							|  |  |  | //    }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Original palette:
 | 
					
						
							| 
									
										
										
										
											2018-10-20 19:20:11 +02:00
										 |  |  | //	for(int i = 16; i < 240; i++) {
 | 
					
						
							|  |  |  | //		 QColor c;
 | 
					
						
							|  |  |  | //		 c.setHsv(239 - i, 255 - ((i < 200) ? 0 : (i - 200) * 3), 150 + ((i < 100) ? i : 100));
 | 
					
						
							|  |  |  | //		 ((quint8*)&m_histogramPalette[i])[0] = c.red();
 | 
					
						
							|  |  |  | //		 ((quint8*)&m_histogramPalette[i])[1] = c.green();
 | 
					
						
							|  |  |  | //		 ((quint8*)&m_histogramPalette[i])[2] = c.blue();
 | 
					
						
							|  |  |  | //		 ((quint8*)&m_histogramPalette[i])[3] = c.alpha();
 | 
					
						
							|  |  |  | //	}
 | 
					
						
							|  |  |  | //	for(int i = 1; i < 16; i++) {
 | 
					
						
							|  |  |  | //		QColor c;
 | 
					
						
							|  |  |  | //		c.setHsv(255, 128, 48 + i * 4);
 | 
					
						
							|  |  |  | //		((quint8*)&m_histogramPalette[i])[0] = c.red();
 | 
					
						
							|  |  |  | //		((quint8*)&m_histogramPalette[i])[1] = c.green();
 | 
					
						
							|  |  |  | //		((quint8*)&m_histogramPalette[i])[2] = c.blue();
 | 
					
						
							|  |  |  | //		((quint8*)&m_histogramPalette[i])[3] = c.alpha();
 | 
					
						
							|  |  |  | //	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-19 00:40:14 +02:00
										 |  |  | 	m_decayDivisor = 1; | 
					
						
							|  |  |  | 	m_decayDivisorCount = m_decayDivisor; | 
					
						
							|  |  |  | 	m_histogramStroke = 30; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	m_timeScale.setFont(font()); | 
					
						
							|  |  |  | 	m_timeScale.setOrientation(Qt::Vertical); | 
					
						
							|  |  |  | 	m_timeScale.setRange(Unit::Time, 0, 1); | 
					
						
							|  |  |  | 	m_powerScale.setFont(font()); | 
					
						
							|  |  |  | 	m_powerScale.setOrientation(Qt::Vertical); | 
					
						
							|  |  |  | 	m_frequencyScale.setFont(font()); | 
					
						
							|  |  |  | 	m_frequencyScale.setOrientation(Qt::Horizontal); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |     m_textOverlayFont = font(); // QFontDatabase::systemFont(QFontDatabase::FixedFont);
 | 
					
						
							|  |  |  |     m_textOverlayFont.setBold(true); | 
					
						
							|  |  |  |     // m_textOverlayFont.setPointSize(font().pointSize() - 1);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	connect(&m_timer, SIGNAL(timeout()), this, SLOT(tick())); | 
					
						
							|  |  |  | 	m_timer.start(50); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GLSpectrum::~GLSpectrum() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-03-06 09:40:07 +01:00
										 |  |  | 	cleanup(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	QMutexLocker mutexLocker(&m_mutex); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 	if (m_waterfallBuffer) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		delete m_waterfallBuffer; | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 		m_waterfallBuffer = nullptr; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (m_histogramBuffer) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		delete m_histogramBuffer; | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 		m_histogramBuffer = nullptr; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (m_histogram) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		delete[] m_histogram; | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 		m_histogram = nullptr; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-22 04:23:10 +02:00
										 |  |  | void GLSpectrum::setCenterFrequency(qint64 frequency) | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.lock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_centerFrequency = frequency; | 
					
						
							|  |  |  | 	m_changesPending = true; | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::setReferenceLevel(Real referenceLevel) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.lock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_referenceLevel = referenceLevel; | 
					
						
							|  |  |  | 	m_changesPending = true; | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::setPowerRange(Real powerRange) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.lock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_powerRange = powerRange; | 
					
						
							|  |  |  | 	m_changesPending = true; | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::setDecay(int decay) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-17 14:21:25 +02:00
										 |  |  | 	m_decay = decay < 0 ? 0 : decay > 20 ? 20 : decay; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-19 00:40:14 +02:00
										 |  |  | void GLSpectrum::setDecayDivisor(int decayDivisor) | 
					
						
							| 
									
										
										
										
											2015-07-16 04:55:14 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-19 00:40:14 +02:00
										 |  |  | 	m_decayDivisor = decayDivisor < 1 ? 1 : decayDivisor > 20 ? 20 : decayDivisor; | 
					
						
							| 
									
										
										
										
											2015-07-16 04:55:14 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::setHistoStroke(int stroke) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-19 00:40:14 +02:00
										 |  |  | 	m_histogramStroke = stroke < 1 ? 1 : stroke > 60 ? 60 : stroke; | 
					
						
							| 
									
										
										
										
											2015-07-16 04:55:14 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | void GLSpectrum::setSampleRate(qint32 sampleRate) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  |     m_mutex.lock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_sampleRate = sampleRate; | 
					
						
							| 
									
										
										
										
											2018-07-01 20:48:30 +02:00
										 |  |  | 	if (m_messageQueueToGUI) { | 
					
						
							|  |  |  | 	    m_messageQueueToGUI->push(new MsgReportSampleRate(m_sampleRate)); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_changesPending = true; | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-01 03:11:36 +02:00
										 |  |  | void GLSpectrum::setTimingRate(qint32 timingRate) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  |     m_mutex.lock(); | 
					
						
							| 
									
										
										
										
											2018-07-01 03:11:36 +02:00
										 |  |  |     m_timingRate = timingRate; | 
					
						
							|  |  |  |     m_changesPending = true; | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2018-07-01 03:11:36 +02:00
										 |  |  |     update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | void GLSpectrum::setDisplayWaterfall(bool display) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  |     m_mutex.lock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_displayWaterfall = display; | 
					
						
							| 
									
										
										
										
											2020-07-06 03:20:08 +02:00
										 |  |  |     if (!display) { | 
					
						
							|  |  |  |         m_waterfallMarkers.clear(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_changesPending = true; | 
					
						
							|  |  |  | 	stopDrag(); | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | void GLSpectrum::setSsbSpectrum(bool ssbSpectrum) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	m_ssbSpectrum = ssbSpectrum; | 
					
						
							|  |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-22 04:23:10 +02:00
										 |  |  | void GLSpectrum::setLsbDisplay(bool lsbDisplay) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_lsbDisplay = lsbDisplay; | 
					
						
							|  |  |  |     update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | void GLSpectrum::setInvertedWaterfall(bool inv) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  |     m_mutex.lock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_invertedWaterfall = inv; | 
					
						
							|  |  |  | 	m_changesPending = true; | 
					
						
							|  |  |  | 	stopDrag(); | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::setDisplayMaxHold(bool display) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  |     m_mutex.lock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_displayMaxHold = display; | 
					
						
							| 
									
										
										
										
											2020-07-06 03:20:08 +02:00
										 |  |  |     if (!m_displayMaxHold && !m_displayCurrent && !m_displayHistogram) { | 
					
						
							|  |  |  |         m_histogramMarkers.clear(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_changesPending = true; | 
					
						
							|  |  |  | 	stopDrag(); | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-16 04:55:14 +02:00
										 |  |  | void GLSpectrum::setDisplayCurrent(bool display) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  |     m_mutex.lock(); | 
					
						
							| 
									
										
										
										
											2015-07-16 04:55:14 +02:00
										 |  |  | 	m_displayCurrent = display; | 
					
						
							| 
									
										
										
										
											2020-07-06 03:20:08 +02:00
										 |  |  |     if (!m_displayMaxHold && !m_displayCurrent && !m_displayHistogram) { | 
					
						
							|  |  |  |         m_histogramMarkers.clear(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-07-16 04:55:14 +02:00
										 |  |  | 	m_changesPending = true; | 
					
						
							|  |  |  | 	stopDrag(); | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2015-07-16 04:55:14 +02:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | void GLSpectrum::setDisplayHistogram(bool display) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  |     m_mutex.lock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_displayHistogram = display; | 
					
						
							| 
									
										
										
										
											2020-07-06 03:20:08 +02:00
										 |  |  |     if (!m_displayMaxHold && !m_displayCurrent && !m_displayHistogram) { | 
					
						
							|  |  |  |         m_histogramMarkers.clear(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_changesPending = true; | 
					
						
							|  |  |  | 	stopDrag(); | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::setDisplayGrid(bool display) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	m_displayGrid = display; | 
					
						
							|  |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 15:49:03 +02:00
										 |  |  | void GLSpectrum::setDisplayGridIntensity(int intensity) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	m_displayGridIntensity = intensity; | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 15:49:03 +02:00
										 |  |  | 	if (m_displayGridIntensity > 100) { | 
					
						
							|  |  |  | 		m_displayGridIntensity = 100; | 
					
						
							| 
									
										
										
										
											2015-07-18 17:53:57 +02:00
										 |  |  | 	} else if (m_displayGridIntensity < 0) { | 
					
						
							|  |  |  | 		m_displayGridIntensity = 0; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     update(); | 
					
						
							| 
									
										
										
										
											2015-07-18 17:53:57 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::setDisplayTraceIntensity(int intensity) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	m_displayTraceIntensity = intensity; | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-18 17:53:57 +02:00
										 |  |  | 	if (m_displayTraceIntensity > 100) { | 
					
						
							|  |  |  | 		m_displayTraceIntensity = 100; | 
					
						
							|  |  |  | 	} else if (m_displayTraceIntensity < 0) { | 
					
						
							|  |  |  | 		m_displayTraceIntensity = 0; | 
					
						
							| 
									
										
										
										
											2015-05-12 15:49:03 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     update(); | 
					
						
							| 
									
										
										
										
											2015-05-12 15:49:03 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-06 01:34:05 +02:00
										 |  |  | void GLSpectrum::setLinear(bool linear) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.lock(); | 
					
						
							| 
									
										
										
										
											2018-07-06 01:34:05 +02:00
										 |  |  |     m_linear = linear; | 
					
						
							|  |  |  |     m_changesPending = true; | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2018-07-06 01:34:05 +02:00
										 |  |  |     update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | void GLSpectrum::addChannelMarker(ChannelMarker* channelMarker) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.lock(); | 
					
						
							| 
									
										
										
										
											2017-11-14 00:06:42 +01:00
										 |  |  | 	connect(channelMarker, SIGNAL(changedByAPI()), this, SLOT(channelMarkerChanged())); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	connect(channelMarker, SIGNAL(destroyed(QObject*)), this, SLOT(channelMarkerDestroyed(QObject*))); | 
					
						
							|  |  |  | 	m_channelMarkerStates.append(new ChannelMarkerState(channelMarker)); | 
					
						
							|  |  |  | 	m_changesPending = true; | 
					
						
							|  |  |  | 	stopDrag(); | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::removeChannelMarker(ChannelMarker* channelMarker) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	m_mutex.lock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	for (int i = 0; i < m_channelMarkerStates.size(); ++i) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (m_channelMarkerStates[i]->m_channelMarker == channelMarker) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			channelMarker->disconnect(this); | 
					
						
							|  |  |  | 			delete m_channelMarkerStates.takeAt(i); | 
					
						
							|  |  |  | 			m_changesPending = true; | 
					
						
							|  |  |  | 			stopDrag(); | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 			m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			update(); | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	m_mutex.unlock(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::newSpectrum(const std::vector<Real>& spectrum, int fftSize) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	QMutexLocker mutexLocker(&m_mutex); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	m_displayChanged = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 	if (m_changesPending) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		m_fftSize = fftSize; | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 	if (fftSize != m_fftSize) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		m_fftSize = fftSize; | 
					
						
							|  |  |  | 		m_changesPending = true; | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	updateWaterfall(spectrum); | 
					
						
							|  |  |  | 	updateHistogram(spectrum); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::updateWaterfall(const std::vector<Real>& spectrum) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 	if (m_waterfallBufferPos < m_waterfallBuffer->height()) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		quint32* pix = (quint32*)m_waterfallBuffer->scanLine(m_waterfallBufferPos); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 		for (int i = 0; i < m_fftSize; i++) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2014-06-10 12:24:52 +01:00
										 |  |  | 			int v = (int)((spectrum[i] - m_referenceLevel) * 2.4 * 100.0 / m_powerRange + 240.0); | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (v > 239) { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 				v = 239; | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  |             } else if (v < 0) { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 				v = 0; | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			*pix++ = m_waterfallPalette[(int)v]; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		m_waterfallBufferPos++; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::updateHistogram(const std::vector<Real>& spectrum) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	quint8* b = m_histogram; | 
					
						
							| 
									
										
										
										
											2015-10-09 03:59:28 +02:00
										 |  |  | 	int fftMulSize = 100 * m_fftSize; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-19 08:19:12 +02:00
										 |  |  | 	if ((m_displayHistogram || m_displayMaxHold) && (m_decay != 0)) | 
					
						
							| 
									
										
										
										
											2015-10-09 08:45:29 +02:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-10-19 00:40:14 +02:00
										 |  |  | 		m_decayDivisorCount--; | 
					
						
							| 
									
										
										
										
											2015-10-09 08:45:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-19 00:40:14 +02:00
										 |  |  | 		if ((m_decay > 1) || (m_decayDivisorCount <= 0)) | 
					
						
							| 
									
										
										
										
											2015-10-09 08:45:29 +02:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-10-17 13:35:04 +02:00
										 |  |  | 			for (int i = 0; i < fftMulSize; i++) | 
					
						
							| 
									
										
										
										
											2015-10-09 08:45:29 +02:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2018-10-19 00:40:14 +02:00
										 |  |  | 				if (*b > m_decay) { | 
					
						
							|  |  |  | 					*b = *b - m_decay; | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 				    *b = 0; | 
					
						
							| 
									
										
										
										
											2015-10-09 08:45:29 +02:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				b++; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-10-09 08:45:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-19 00:40:14 +02:00
										 |  |  | 			m_decayDivisorCount = m_decayDivisor; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-16 08:53:55 +02:00
										 |  |  | 	m_currentSpectrum = &spectrum; // Store spectrum for current spectrum line display
 | 
					
						
							| 
									
										
										
										
											2015-07-16 04:55:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-06 04:37:43 +02:00
										 |  |  | #if 0 //def USE_SSE2
 | 
					
						
							| 
									
										
										
										
											2016-11-07 00:42:57 +01:00
										 |  |  |     if(m_decay >= 0) { // normal
 | 
					
						
							|  |  |  |         const __m128 refl = {m_referenceLevel, m_referenceLevel, m_referenceLevel, m_referenceLevel}; | 
					
						
							|  |  |  |         const __m128 power = {m_powerRange, m_powerRange, m_powerRange, m_powerRange}; | 
					
						
							|  |  |  |         const __m128 mul = {100.0f, 100.0f, 100.0f, 100.0f}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for(int i = 0; i < m_fftSize; i += 4) { | 
					
						
							|  |  |  |             __m128 abc = _mm_loadu_ps (&spectrum[i]); | 
					
						
							|  |  |  |             abc = _mm_sub_ps(abc, refl); | 
					
						
							|  |  |  |             abc = _mm_mul_ps(abc, mul); | 
					
						
							|  |  |  |             abc = _mm_div_ps(abc, power); | 
					
						
							|  |  |  |             abc =  _mm_add_ps(abc, mul); | 
					
						
							|  |  |  |             __m128i result = _mm_cvtps_epi32(abc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for(int j = 0; j < 4; j++) { | 
					
						
							|  |  |  |                 int v = ((int*)&result)[j]; | 
					
						
							|  |  |  |                 if((v >= 0) && (v <= 99)) { | 
					
						
							|  |  |  |                     b = m_histogram + (i + j) * 100 + v; | 
					
						
							|  |  |  |                     if(*b < 220) | 
					
						
							|  |  |  |                         *b += m_histogramStroke; // was 4
 | 
					
						
							|  |  |  |                     else if(*b < 239) | 
					
						
							|  |  |  |                         *b += 1; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } else { // draw double pixels
 | 
					
						
							|  |  |  |         int add = -m_decay * 4; | 
					
						
							|  |  |  |         const __m128 refl = {m_referenceLevel, m_referenceLevel, m_referenceLevel, m_referenceLevel}; | 
					
						
							|  |  |  |         const __m128 power = {m_powerRange, m_powerRange, m_powerRange, m_powerRange}; | 
					
						
							|  |  |  |         const __m128 mul = {100.0f, 100.0f, 100.0f, 100.0f}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for(int i = 0; i < m_fftSize; i += 4) { | 
					
						
							|  |  |  |             __m128 abc = _mm_loadu_ps (&spectrum[i]); | 
					
						
							|  |  |  |             abc = _mm_sub_ps(abc, refl); | 
					
						
							|  |  |  |             abc = _mm_mul_ps(abc, mul); | 
					
						
							|  |  |  |             abc = _mm_div_ps(abc, power); | 
					
						
							|  |  |  |             abc =  _mm_add_ps(abc, mul); | 
					
						
							|  |  |  |             __m128i result = _mm_cvtps_epi32(abc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for(int j = 0; j < 4; j++) { | 
					
						
							|  |  |  |                 int v = ((int*)&result)[j]; | 
					
						
							|  |  |  |                 if((v >= 1) && (v <= 98)) { | 
					
						
							|  |  |  |                     b = m_histogram + (i + j) * 100 + v; | 
					
						
							|  |  |  |                     if(b[-1] < 220) | 
					
						
							|  |  |  |                         b[-1] += add; | 
					
						
							|  |  |  |                     else if(b[-1] < 239) | 
					
						
							|  |  |  |                         b[-1] += 1; | 
					
						
							|  |  |  |                     if(b[0] < 220) | 
					
						
							|  |  |  |                         b[0] += add; | 
					
						
							|  |  |  |                     else if(b[0] < 239) | 
					
						
							|  |  |  |                         b[0] += 1; | 
					
						
							|  |  |  |                     if(b[1] < 220) | 
					
						
							|  |  |  |                         b[1] += add; | 
					
						
							|  |  |  |                     else if(b[1] < 239) | 
					
						
							|  |  |  |                         b[1] += 1; | 
					
						
							|  |  |  |                 } else if((v >= 0) && (v <= 99)) { | 
					
						
							|  |  |  |                     b = m_histogram + (i + j) * 100 + v; | 
					
						
							|  |  |  |                     if(*b < 220) | 
					
						
							|  |  |  |                         *b += add; | 
					
						
							|  |  |  |                     else if(*b < 239) | 
					
						
							|  |  |  |                         *b += 1; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2018-10-17 15:28:53 +02:00
										 |  |  |     for (int i = 0; i < m_fftSize; i++) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-11-07 00:42:57 +01:00
										 |  |  |         int v = (int)((spectrum[i] - m_referenceLevel) * 100.0 / m_powerRange + 100.0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-17 15:28:53 +02:00
										 |  |  |         if ((v >= 0) && (v <= 99)) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2016-11-07 00:42:57 +01:00
										 |  |  |             b = m_histogram + i * 100 + v; | 
					
						
							| 
									
										
										
										
											2018-10-17 15:28:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             // capping to 239 as palette values are [0..239]
 | 
					
						
							|  |  |  |             if (*b + m_histogramStroke <= 239) { | 
					
						
							| 
									
										
										
										
											2016-11-07 00:42:57 +01:00
										 |  |  |                 *b += m_histogramStroke; // was 4
 | 
					
						
							| 
									
										
										
										
											2018-10-17 15:28:53 +02:00
										 |  |  |             } else { | 
					
						
							|  |  |  |                 *b = 239; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-11-07 00:42:57 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::initializeGL() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-03-02 08:32:43 +01:00
										 |  |  | 	QOpenGLContext *glCurrentContext =  QOpenGLContext::currentContext(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 	if (glCurrentContext) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-03-02 08:32:43 +01:00
										 |  |  | 		if (QOpenGLContext::currentContext()->isValid()) { | 
					
						
							|  |  |  | 			qDebug() << "GLSpectrum::initializeGL: context:" | 
					
						
							|  |  |  | 				<< " major: " << (QOpenGLContext::currentContext()->format()).majorVersion() | 
					
						
							|  |  |  | 				<< " minor: " << (QOpenGLContext::currentContext()->format()).minorVersion() | 
					
						
							|  |  |  | 				<< " ES: " << (QOpenGLContext::currentContext()->isOpenGLES() ? "yes" : "no"); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			qDebug() << "GLSpectrum::initializeGL: current context is invalid"; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-03-02 08:32:43 +01:00
										 |  |  | 		qCritical() << "GLSpectrum::initializeGL: no current context"; | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	connect(glCurrentContext, &QOpenGLContext::aboutToBeDestroyed, this, &GLSpectrum::cleanup); // TODO: when migrating to QOpenGLWidget
 | 
					
						
							| 
									
										
										
										
											2016-03-06 12:15:40 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	QOpenGLFunctions *glFunctions = QOpenGLContext::currentContext()->functions(); | 
					
						
							|  |  |  | 	glFunctions->initializeOpenGLFunctions(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 10:00:13 +01:00
										 |  |  | 	//glDisable(GL_DEPTH_TEST);
 | 
					
						
							| 
									
										
										
										
											2016-03-03 01:09:55 +01:00
										 |  |  | 	m_glShaderSimple.initializeGL(); | 
					
						
							| 
									
										
										
										
											2016-03-05 06:45:05 +01:00
										 |  |  | 	m_glShaderLeftScale.initializeGL(); | 
					
						
							| 
									
										
										
										
											2016-03-05 08:53:56 +01:00
										 |  |  | 	m_glShaderFrequencyScale.initializeGL(); | 
					
						
							| 
									
										
										
										
											2016-03-05 11:57:53 +01:00
										 |  |  | 	m_glShaderWaterfall.initializeGL(); | 
					
						
							| 
									
										
										
										
											2016-03-05 14:28:55 +01:00
										 |  |  | 	m_glShaderHistogram.initializeGL(); | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |     m_glShaderTextOverlay.initializeGL(); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::resizeGL(int width, int height) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-12 10:35:20 +02:00
										 |  |  |     QMutexLocker mutexLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2016-03-06 12:15:40 +01:00
										 |  |  | 	QOpenGLFunctions *glFunctions = QOpenGLContext::currentContext()->functions(); | 
					
						
							|  |  |  | 	glFunctions->glViewport(0, 0, width, height); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_changesPending = true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-24 01:09:03 +02:00
										 |  |  | void GLSpectrum::clearSpectrumHistogram() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	if (!m_mutex.tryLock(2)) { | 
					
						
							| 
									
										
										
										
											2015-07-24 01:09:03 +02:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-24 01:09:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	memset(m_histogram, 0x00, 100 * m_fftSize); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	m_mutex.unlock(); | 
					
						
							|  |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | void GLSpectrum::paintGL() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	if (!m_mutex.tryLock(2)) { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	if (m_changesPending) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		applyChanges(); | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 		m_changesPending = false; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	if (m_fftSize <= 0) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		m_mutex.unlock(); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 12:15:40 +01:00
										 |  |  | 	QOpenGLFunctions *glFunctions = QOpenGLContext::currentContext()->functions(); | 
					
						
							|  |  |  | 	glFunctions->glClearColor(0.0f, 0.0f, 0.0f, 0.0f); | 
					
						
							|  |  |  | 	glFunctions->glClear(GL_COLOR_BUFFER_BIT); | 
					
						
							| 
									
										
										
										
											2016-02-29 23:29:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	// paint waterfall
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 	if (m_displayWaterfall) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			GLfloat vtx1[] = { | 
					
						
							|  |  |  | 					0, m_invertedWaterfall ? 0.0f : 1.0f, | 
					
						
							|  |  |  | 		    		1, m_invertedWaterfall ? 0.0f : 1.0f, | 
					
						
							|  |  |  | 		    		1, m_invertedWaterfall ? 1.0f : 0.0f, | 
					
						
							|  |  |  | 		    		0, m_invertedWaterfall ? 1.0f : 0.0f | 
					
						
							|  |  |  | 		    }; | 
					
						
							| 
									
										
										
										
											2016-03-05 11:57:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-05 12:12:55 +01:00
										 |  |  | 			if (m_waterfallTexturePos + m_waterfallBufferPos < m_waterfallTextureHeight) | 
					
						
							| 
									
										
										
										
											2016-03-05 11:57:53 +01:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2016-03-05 12:12:55 +01:00
										 |  |  | 				m_glShaderWaterfall.subTexture(0, m_waterfallTexturePos, m_fftSize, m_waterfallBufferPos,  m_waterfallBuffer->scanLine(0)); | 
					
						
							|  |  |  | 				m_waterfallTexturePos += m_waterfallBufferPos; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				int breakLine = m_waterfallTextureHeight - m_waterfallTexturePos; | 
					
						
							|  |  |  | 				int linesLeft = m_waterfallTexturePos + m_waterfallBufferPos - m_waterfallTextureHeight; | 
					
						
							|  |  |  | 				m_glShaderWaterfall.subTexture(0, m_waterfallTexturePos, m_fftSize, breakLine,  m_waterfallBuffer->scanLine(0)); | 
					
						
							|  |  |  | 				m_glShaderWaterfall.subTexture(0, 0, m_fftSize, linesLeft,  m_waterfallBuffer->scanLine(breakLine)); | 
					
						
							|  |  |  | 				m_waterfallTexturePos = linesLeft; | 
					
						
							| 
									
										
										
										
											2016-03-05 11:57:53 +01:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			m_waterfallBufferPos = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			float prop_y = m_waterfallTexturePos / (m_waterfallTextureHeight - 1.0); | 
					
						
							|  |  |  | 			float off = 1.0 / (m_waterfallTextureHeight - 1.0); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 			GLfloat tex1[] = { | 
					
						
							|  |  |  | 		    		0, prop_y + 1 - off, | 
					
						
							|  |  |  | 					1, prop_y + 1 - off, | 
					
						
							|  |  |  | 					1, prop_y, | 
					
						
							|  |  |  | 					0, prop_y | 
					
						
							|  |  |  | 		    }; | 
					
						
							| 
									
										
										
										
											2016-02-29 03:04:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-05 11:57:53 +01:00
										 |  |  | 			m_glShaderWaterfall.drawSurface(m_glWaterfallBoxMatrix, tex1, vtx1, 4); | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		// paint channels
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 		if (m_mouseInside) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			for (int i = 0; i < m_channelMarkerStates.size(); ++i) | 
					
						
							|  |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 				ChannelMarkerState* dv = m_channelMarkerStates[i]; | 
					
						
							| 
									
										
										
										
											2019-05-30 18:38:10 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				if (dv->m_channelMarker->getVisible() | 
					
						
							|  |  |  |                     && (dv->m_channelMarker->getSourceOrSinkStream() == m_displaySourceOrSink) | 
					
						
							| 
									
										
										
										
											2019-09-09 00:58:26 +02:00
										 |  |  |                     && dv->m_channelMarker->streamIndexApplies(m_displayStreamIndex)) | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 					{ | 
					
						
							|  |  |  | 						GLfloat q3[] { | 
					
						
							|  |  |  | 							0, 0, | 
					
						
							|  |  |  | 							1, 0, | 
					
						
							|  |  |  | 							1, 1, | 
					
						
							| 
									
										
										
										
											2016-03-04 03:45:34 +01:00
										 |  |  | 							0, 1, | 
					
						
							|  |  |  | 							0.5, 0, | 
					
						
							|  |  |  | 							0.5, 1, | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 						}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-04 01:30:29 +01:00
										 |  |  | 						QVector4D color(dv->m_channelMarker->getColor().redF(), dv->m_channelMarker->getColor().greenF(), dv->m_channelMarker->getColor().blueF(), 0.3f); | 
					
						
							|  |  |  | 						m_glShaderSimple.drawSurface(dv->m_glMatrixWaterfall, color, q3, 4); | 
					
						
							| 
									
										
										
										
											2016-03-04 03:45:34 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 						QVector4D colorLine(0.8f, 0.8f, 0.6f, 1.0f); | 
					
						
							|  |  |  | 						m_glShaderSimple.drawSegments(dv->m_glMatrixDsbWaterfall, colorLine, &q3[8], 2); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:57:34 +01:00
										 |  |  | 		// draw rect around
 | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			GLfloat q3[] { | 
					
						
							|  |  |  | 				1, 1, | 
					
						
							|  |  |  | 				0, 1, | 
					
						
							|  |  |  | 				0, 0, | 
					
						
							|  |  |  | 				1, 0 | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:57:34 +01:00
										 |  |  | 			QVector4D color(1.0f, 1.0f, 1.0f, 0.5f); | 
					
						
							|  |  |  | 			m_glShaderSimple.drawContour(m_glWaterfallBoxMatrix, color, q3, 4); | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// paint histogram
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	if (m_displayHistogram || m_displayMaxHold || m_displayCurrent) | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		if (m_displayHistogram) | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2016-03-05 14:28:55 +01:00
										 |  |  | 				// import new lines into the texture
 | 
					
						
							|  |  |  | 				quint32* pix; | 
					
						
							|  |  |  | 				quint8* bs = m_histogram; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				for (int y = 0; y < 100; y++) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					quint8* b = bs; | 
					
						
							|  |  |  | 					pix = (quint32*)m_histogramBuffer->scanLine(99 - y); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					for (int x = 0; x < m_fftSize; x++) | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						*pix = m_histogramPalette[*b]; | 
					
						
							|  |  |  | 						pix++; | 
					
						
							|  |  |  | 						b += 100; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					bs++; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 				GLfloat vtx1[] = { | 
					
						
							|  |  |  | 						0, 0, | 
					
						
							|  |  |  | 			    		1, 0, | 
					
						
							|  |  |  | 			    		1, 1, | 
					
						
							|  |  |  | 			    		0, 1 | 
					
						
							|  |  |  | 			    }; | 
					
						
							|  |  |  | 				GLfloat tex1[] = { | 
					
						
							|  |  |  | 						0, 0, | 
					
						
							|  |  |  | 			    		1, 0, | 
					
						
							|  |  |  | 			    		1, 1, | 
					
						
							|  |  |  | 			    		0, 1 | 
					
						
							|  |  |  | 			    }; | 
					
						
							| 
									
										
										
										
											2016-03-05 14:28:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				m_glShaderHistogram.subTexture(0, 0, m_fftSize, 100,  m_histogramBuffer->scanLine(0)); | 
					
						
							|  |  |  | 				m_glShaderHistogram.drawSurface(m_glHistogramBoxMatrix, tex1, vtx1, 4); | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		// paint channels
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		if (m_mouseInside) | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2015-05-12 21:50:02 +02:00
										 |  |  | 			// Effective BW overlays
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			for (int i = 0; i < m_channelMarkerStates.size(); ++i) | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 				ChannelMarkerState* dv = m_channelMarkerStates[i]; | 
					
						
							| 
									
										
										
										
											2019-05-30 18:38:10 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				if (dv->m_channelMarker->getVisible() | 
					
						
							|  |  |  |                     && (dv->m_channelMarker->getSourceOrSinkStream() == m_displaySourceOrSink) | 
					
						
							| 
									
										
										
										
											2019-09-09 00:58:26 +02:00
										 |  |  |                     && dv->m_channelMarker->streamIndexApplies(m_displayStreamIndex)) | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 					{ | 
					
						
							|  |  |  | 						GLfloat q3[] { | 
					
						
							|  |  |  | 							0, 0, | 
					
						
							|  |  |  | 							1, 0, | 
					
						
							|  |  |  | 							1, 1, | 
					
						
							| 
									
										
										
										
											2016-03-04 03:45:34 +01:00
										 |  |  | 							0, 1, | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 							0.5, 0, | 
					
						
							|  |  |  | 							0.5, 1 | 
					
						
							|  |  |  | 						}; | 
					
						
							| 
									
										
										
										
											2016-03-04 03:45:34 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 						QVector4D color(dv->m_channelMarker->getColor().redF(), dv->m_channelMarker->getColor().greenF(), dv->m_channelMarker->getColor().blueF(), 0.3f); | 
					
						
							|  |  |  | 						m_glShaderSimple.drawSurface(dv->m_glMatrixHistogram, color, q3, 4); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						QVector4D colorLine(0.8f, 0.8f, 0.6f, 1.0f); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						if (dv->m_channelMarker->getSidebands() != ChannelMarker::dsb) { | 
					
						
							|  |  |  | 							q3[6] = 0.5; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-16 15:19:45 +01:00
										 |  |  |                         m_glShaderSimple.drawSegments(dv->m_glMatrixDsbHistogram, colorLine, &q3[8], 2); | 
					
						
							|  |  |  |                         m_glShaderSimple.drawSegments(dv->m_glMatrixFreqScale, colorLine, q3, 2); | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// draw rect around
 | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			GLfloat q3[] { | 
					
						
							|  |  |  | 				1, 1, | 
					
						
							|  |  |  | 				0, 1, | 
					
						
							|  |  |  | 				0, 0, | 
					
						
							|  |  |  | 				1, 0 | 
					
						
							|  |  |  | 			}; | 
					
						
							| 
									
										
										
										
											2016-03-03 01:41:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			QVector4D color(1.0f, 1.0f, 1.0f, 0.5f); | 
					
						
							|  |  |  | 			m_glShaderSimple.drawContour(m_glHistogramBoxMatrix, color, q3, 4); | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// paint left scales (time and power)
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 	if (m_displayWaterfall || m_displayMaxHold || m_displayCurrent || m_displayHistogram ) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			GLfloat vtx1[] = { | 
					
						
							|  |  |  | 					0, 1, | 
					
						
							|  |  |  | 		    		1, 1, | 
					
						
							|  |  |  | 		    		1, 0, | 
					
						
							|  |  |  | 		    		0, 0 | 
					
						
							|  |  |  | 		    }; | 
					
						
							|  |  |  | 			GLfloat tex1[] = { | 
					
						
							|  |  |  | 					0, 1, | 
					
						
							|  |  |  | 		    		1, 1, | 
					
						
							|  |  |  | 		    		1, 0, | 
					
						
							|  |  |  | 		    		0, 0 | 
					
						
							|  |  |  | 		    }; | 
					
						
							| 
									
										
										
										
											2016-03-05 06:45:05 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			m_glShaderLeftScale.drawSurface(m_glLeftScaleBoxMatrix, tex1, vtx1, 4); | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// paint frequency scale
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 	if (m_displayWaterfall || m_displayMaxHold || m_displayCurrent || m_displayHistogram ) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			GLfloat vtx1[] = { | 
					
						
							|  |  |  | 					0, 1, | 
					
						
							|  |  |  | 		    		1, 1, | 
					
						
							|  |  |  | 		    		1, 0, | 
					
						
							|  |  |  | 		    		0, 0 | 
					
						
							|  |  |  | 		    }; | 
					
						
							|  |  |  | 			GLfloat tex1[] = { | 
					
						
							|  |  |  | 					0, 1, | 
					
						
							|  |  |  | 		    		1, 1, | 
					
						
							|  |  |  | 		    		1, 0, | 
					
						
							|  |  |  | 		    		0, 0 | 
					
						
							|  |  |  | 		    }; | 
					
						
							| 
									
										
										
										
											2016-03-05 08:53:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			m_glShaderFrequencyScale.drawSurface(m_glFrequencyScaleBoxMatrix, tex1, vtx1, 4); | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// paint channels
 | 
					
						
							| 
									
										
										
										
											2015-05-12 21:50:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// Effective bandwidth overlays
 | 
					
						
							| 
									
										
										
										
											2020-07-06 04:08:08 +02:00
										 |  |  | 		for (int i = 0; i < m_channelMarkerStates.size(); ++i) | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			ChannelMarkerState* dv = m_channelMarkerStates[i]; | 
					
						
							| 
									
										
										
										
											2016-03-04 02:24:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			// frequency scale channel overlay
 | 
					
						
							| 
									
										
										
										
											2019-05-30 18:38:10 +02:00
										 |  |  |             if (dv->m_channelMarker->getVisible() | 
					
						
							|  |  |  |                 && (dv->m_channelMarker->getSourceOrSinkStream() == m_displaySourceOrSink) | 
					
						
							| 
									
										
										
										
											2019-09-09 00:58:26 +02:00
										 |  |  |                 && dv->m_channelMarker->streamIndexApplies(m_displayStreamIndex)) | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 				{ | 
					
						
							|  |  |  | 					GLfloat q3[] { | 
					
						
							| 
									
										
										
										
											2016-03-05 12:20:15 +01:00
										 |  |  | 						1, 0.2, | 
					
						
							|  |  |  | 						0, 0.2, | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 						0, 0, | 
					
						
							|  |  |  | 						1, 0, | 
					
						
							| 
									
										
										
										
											2016-03-04 03:45:34 +01:00
										 |  |  | 						0.5, 0, | 
					
						
							|  |  |  | 						0.5, 1 | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 					}; | 
					
						
							| 
									
										
										
										
											2016-03-04 02:24:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					QVector4D color(dv->m_channelMarker->getColor().redF(), dv->m_channelMarker->getColor().greenF(), dv->m_channelMarker->getColor().blueF(), 0.5f); | 
					
						
							|  |  |  | 					m_glShaderSimple.drawSurface(dv->m_glMatrixFreqScale, color, q3, 4); | 
					
						
							| 
									
										
										
										
											2015-05-11 11:03:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-04 03:45:34 +01:00
										 |  |  | 					if (dv->m_channelMarker->getHighlighted()) | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 					{ | 
					
						
							| 
									
										
										
										
											2017-03-17 14:13:09 +01:00
										 |  |  | 	                    QVector4D colorLine(0.8f, 0.8f, 0.6f, 1.0f); | 
					
						
							|  |  |  |                         m_glShaderSimple.drawSegments(dv->m_glMatrixDsbFreqScale, colorLine, &q3[8], 2); | 
					
						
							| 
									
										
										
										
											2017-03-16 15:19:45 +01:00
										 |  |  | 	                    m_glShaderSimple.drawSegments(dv->m_glMatrixFreqScale, colorLine, &q3[4], 2); | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2015-05-11 11:03:01 +02:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// paint max hold lines on top of histogram
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 	if (m_displayMaxHold) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-10-23 22:38:16 +02:00
										 |  |  | 		if (m_maxHold.size() < (uint) m_fftSize) { | 
					
						
							|  |  |  | 		    m_maxHold.resize(m_fftSize); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-23 22:38:16 +02:00
										 |  |  | 		for (int i = 0; i < m_fftSize; i++) | 
					
						
							| 
									
										
										
										
											2016-03-03 22:45:43 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			int j; | 
					
						
							|  |  |  | 			quint8* bs = m_histogram + i * 100; | 
					
						
							| 
									
										
										
										
											2018-10-19 08:19:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-23 22:38:16 +02:00
										 |  |  | 			for (j = 99; j >= 0; j--) | 
					
						
							| 
									
										
										
										
											2018-10-19 08:19:12 +02:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2018-10-23 22:38:16 +02:00
										 |  |  | 				if (bs[j] > 0) { | 
					
						
							| 
									
										
										
										
											2018-10-19 08:19:12 +02:00
										 |  |  | 				    break; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-10-19 08:19:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-23 22:38:16 +02:00
										 |  |  | 			// m_referenceLevel : top
 | 
					
						
							|  |  |  | 			// m_referenceLevel - m_powerRange : bottom
 | 
					
						
							|  |  |  | 			m_maxHold[i] = ((j - 99) * m_powerRange) / 99.0 + m_referenceLevel; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-03-01 02:19:52 +01:00
										 |  |  | 		    GLfloat *q3 = m_q3FFT.m_array; | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-23 22:38:16 +02:00
										 |  |  | 			for (int i = 0; i < m_fftSize; i++) | 
					
						
							| 
									
										
										
										
											2018-10-19 08:19:12 +02:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 				Real v = m_maxHold[i] - m_referenceLevel; | 
					
						
							| 
									
										
										
										
											2018-10-19 08:19:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-23 22:38:16 +02:00
										 |  |  | 				if (v >= 0) { | 
					
						
							| 
									
										
										
										
											2018-10-19 08:19:12 +02:00
										 |  |  | 				    v = 0; | 
					
						
							| 
									
										
										
										
											2018-10-23 22:38:16 +02:00
										 |  |  | 				} else if (v < -m_powerRange) { | 
					
						
							|  |  |  | 				    v = -m_powerRange; | 
					
						
							| 
									
										
										
										
											2018-10-19 08:19:12 +02:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 				q3[2*i] = (Real) i; | 
					
						
							|  |  |  | 				q3[2*i+1] = v; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-03-03 00:19:18 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			QVector4D color(1.0f, 0.0f, 0.0f, (float) m_displayTraceIntensity / 100.0f); | 
					
						
							| 
									
										
										
										
											2016-03-03 01:41:30 +01:00
										 |  |  | 			m_glShaderSimple.drawPolyline(m_glHistogramSpectrumMatrix, color, q3, m_fftSize); | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-16 04:55:14 +02:00
										 |  |  | 	// paint current spectrum line on top of histogram
 | 
					
						
							| 
									
										
										
										
											2016-03-06 16:39:28 +01:00
										 |  |  | 	if ((m_displayCurrent) && m_currentSpectrum) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2016-03-02 08:32:43 +01:00
										 |  |  | 			Real bottom = -m_powerRange; | 
					
						
							| 
									
										
										
										
											2018-03-01 02:19:52 +01:00
										 |  |  | 			GLfloat *q3 = m_q3FFT.m_array; | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-06 04:08:08 +02:00
										 |  |  | 			for (int i = 0; i < m_fftSize; i++) | 
					
						
							| 
									
										
										
										
											2018-10-19 08:19:12 +02:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 				Real v = (*m_currentSpectrum)[i] - m_referenceLevel; | 
					
						
							| 
									
										
										
										
											2018-10-19 08:19:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-06 04:08:08 +02:00
										 |  |  | 				if (v > 0) { | 
					
						
							| 
									
										
										
										
											2018-10-19 08:19:12 +02:00
										 |  |  | 				    v = 0; | 
					
						
							| 
									
										
										
										
											2020-07-06 04:08:08 +02:00
										 |  |  | 				} else if (v < bottom) { | 
					
						
							| 
									
										
										
										
											2018-10-19 08:19:12 +02:00
										 |  |  | 				    v = bottom; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 				q3[2*i] = (Real) i; | 
					
						
							|  |  |  | 				q3[2*i+1] = v; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2016-03-02 08:32:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			QVector4D color(1.0f, 1.0f, 0.25f, (float) m_displayTraceIntensity / 100.0f); | 
					
						
							| 
									
										
										
										
											2016-03-03 01:41:30 +01:00
										 |  |  | 			m_glShaderSimple.drawPolyline(m_glHistogramSpectrumMatrix, color, q3, m_fftSize); | 
					
						
							| 
									
										
										
										
											2016-02-28 22:03:37 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-07-16 04:55:14 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-06 04:08:08 +02:00
										 |  |  |     drawMarkers(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// paint waterfall grid
 | 
					
						
							|  |  |  | 	if (m_displayWaterfall && m_displayGrid) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		const ScaleEngine::TickList* tickList; | 
					
						
							|  |  |  | 		const ScaleEngine::Tick* tick; | 
					
						
							|  |  |  | 		tickList = &m_timeScale.getTickList(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			GLfloat *q3 = m_q3TickTime.m_array; | 
					
						
							|  |  |  | 			int effectiveTicks = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			for (int i= 0; i < tickList->count(); i++) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				tick = &(*tickList)[i]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (tick->major) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					if (tick->textSize > 0) | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						float y = tick->pos / m_timeScale.getSize(); | 
					
						
							|  |  |  | 						q3[4*effectiveTicks] = 0; | 
					
						
							|  |  |  | 						q3[4*effectiveTicks+1] = y; | 
					
						
							|  |  |  | 						q3[4*effectiveTicks+2] = 1; | 
					
						
							|  |  |  | 						q3[4*effectiveTicks+3] = y; | 
					
						
							|  |  |  | 						effectiveTicks++; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			QVector4D color(1.0f, 1.0f, 1.0f, (float) m_displayGridIntensity / 100.0f); | 
					
						
							|  |  |  | 			m_glShaderSimple.drawSegments(m_glWaterfallBoxMatrix, color, q3, 2*effectiveTicks); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		tickList = &m_frequencyScale.getTickList(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			GLfloat *q3 = m_q3TickFrequency.m_array; | 
					
						
							|  |  |  | 			int effectiveTicks = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			for (int i= 0; i < tickList->count(); i++) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				tick = &(*tickList)[i]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (tick->major) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					if (tick->textSize > 0) | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						float x = tick->pos / m_frequencyScale.getSize(); | 
					
						
							|  |  |  | 						q3[4*effectiveTicks] = x; | 
					
						
							|  |  |  | 						q3[4*effectiveTicks+1] = 0; | 
					
						
							|  |  |  | 						q3[4*effectiveTicks+2] = x; | 
					
						
							|  |  |  | 						q3[4*effectiveTicks+3] = 1; | 
					
						
							|  |  |  | 						effectiveTicks++; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			QVector4D color(1.0f, 1.0f, 1.0f, (float) m_displayGridIntensity / 100.0f); | 
					
						
							|  |  |  | 			m_glShaderSimple.drawSegments(m_glWaterfallBoxMatrix, color, q3, 2*effectiveTicks); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// paint histogram grid
 | 
					
						
							|  |  |  | 	if ((m_displayHistogram || m_displayMaxHold || m_displayCurrent) && (m_displayGrid)) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		const ScaleEngine::TickList* tickList; | 
					
						
							|  |  |  | 		const ScaleEngine::Tick* tick; | 
					
						
							|  |  |  | 		tickList = &m_powerScale.getTickList(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		    GLfloat *q3 = m_q3TickPower.m_array; | 
					
						
							|  |  |  | 			int effectiveTicks = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			for (int i= 0; i < tickList->count(); i++) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				tick = &(*tickList)[i]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (tick->major) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					if (tick->textSize > 0) | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						float y = tick->pos / m_powerScale.getSize(); | 
					
						
							|  |  |  | 						q3[4*effectiveTicks] = 0; | 
					
						
							|  |  |  | 						q3[4*effectiveTicks+1] = 1-y; | 
					
						
							|  |  |  | 						q3[4*effectiveTicks+2] = 1; | 
					
						
							|  |  |  | 						q3[4*effectiveTicks+3] = 1-y; | 
					
						
							|  |  |  | 						effectiveTicks++; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			QVector4D color(1.0f, 1.0f, 1.0f, (float) m_displayGridIntensity / 100.0f); | 
					
						
							|  |  |  | 			m_glShaderSimple.drawSegments(m_glHistogramBoxMatrix, color, q3, 2*effectiveTicks); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		tickList = &m_frequencyScale.getTickList(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			GLfloat *q3 = m_q3TickFrequency.m_array; | 
					
						
							|  |  |  | 			int effectiveTicks = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			for (int i= 0; i < tickList->count(); i++) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				tick = &(*tickList)[i]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (tick->major) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					if (tick->textSize > 0) | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						float x = tick->pos / m_frequencyScale.getSize(); | 
					
						
							|  |  |  | 						q3[4*effectiveTicks] = x; | 
					
						
							|  |  |  | 						q3[4*effectiveTicks+1] = 0; | 
					
						
							|  |  |  | 						q3[4*effectiveTicks+2] = x; | 
					
						
							|  |  |  | 						q3[4*effectiveTicks+3] = 1; | 
					
						
							|  |  |  | 						effectiveTicks++; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			QVector4D color(1.0f, 1.0f, 1.0f, (float) m_displayGridIntensity / 100.0f); | 
					
						
							|  |  |  | 			m_glShaderSimple.drawSegments(m_glHistogramBoxMatrix, color, q3, 2*effectiveTicks); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	m_mutex.unlock(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::drawMarkers() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QVector4D markerColor(1.0f, 1.0f, 1.0f, 0.3f); | 
					
						
							|  |  |  |     QVector4D markerTextColor(1.0f, 1.0f, 1.0f, 0.8f); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |     // paint histogram markers
 | 
					
						
							|  |  |  |     if (m_histogramMarkers.size() > 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // crosshairs
 | 
					
						
							|  |  |  |         for (int i = 0; i < m_histogramMarkers.size(); i++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             GLfloat h[] { | 
					
						
							|  |  |  |                 (float) m_histogramMarkers.at(i).m_point.x(), 0, | 
					
						
							|  |  |  |                 (float) m_histogramMarkers.at(i).m_point.x(), 1 | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |             m_glShaderSimple.drawSegments(m_glHistogramBoxMatrix, markerColor, h, 2); | 
					
						
							|  |  |  |             GLfloat v[] { | 
					
						
							|  |  |  |                 0, (float) m_histogramMarkers.at(i).m_point.y(), | 
					
						
							|  |  |  |                 1, (float) m_histogramMarkers.at(i).m_point.y() | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |             m_glShaderSimple.drawSegments(m_glHistogramBoxMatrix, markerColor, v, 2); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // text
 | 
					
						
							|  |  |  |         for (int i = 0; i < m_histogramMarkers.size(); i++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (i == 0) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 drawTextOverlay( | 
					
						
							|  |  |  |                     m_histogramMarkers.at(i).m_frequencyStr, | 
					
						
							|  |  |  |                     QColor(255, 255, 255, 192), | 
					
						
							|  |  |  |                     m_textOverlayFont, | 
					
						
							|  |  |  |                     m_histogramMarkers.at(i).m_point.x() * m_histogramRect.width(), | 
					
						
							|  |  |  |                     (m_invertedWaterfall || (m_waterfallHeight == 0)) ? m_histogramRect.height() : 0, | 
					
						
							|  |  |  |                     m_histogramMarkers.at(i).m_point.x() < 0.5f, | 
					
						
							|  |  |  |                     !m_invertedWaterfall && (m_waterfallHeight != 0), | 
					
						
							|  |  |  |                     m_histogramRect); | 
					
						
							|  |  |  |                 drawTextOverlay( | 
					
						
							|  |  |  |                     m_histogramMarkers.at(i).m_powerStr, | 
					
						
							|  |  |  |                     QColor(255, 255, 255, 192), | 
					
						
							|  |  |  |                     m_textOverlayFont, | 
					
						
							|  |  |  |                     0, | 
					
						
							|  |  |  |                     m_histogramMarkers.at(i).m_point.y() * m_histogramRect.height(), | 
					
						
							|  |  |  |                     true, | 
					
						
							|  |  |  |                     m_histogramMarkers.at(i).m_point.y() < 0.5f, | 
					
						
							|  |  |  |                     m_histogramRect); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 drawTextOverlay( | 
					
						
							|  |  |  |                     m_histogramMarkers.at(i).m_deltaFrequencyStr, | 
					
						
							|  |  |  |                     QColor(255, 255, 255, 192), | 
					
						
							|  |  |  |                     m_textOverlayFont, | 
					
						
							|  |  |  |                     m_histogramMarkers.at(i).m_point.x() * m_histogramRect.width(), | 
					
						
							|  |  |  |                     (m_invertedWaterfall || (m_waterfallHeight == 0)) ? 0 : m_histogramRect.height(), | 
					
						
							|  |  |  |                     m_histogramMarkers.at(i).m_point.x() < 0.5f, | 
					
						
							|  |  |  |                     (m_invertedWaterfall || (m_waterfallHeight == 0)), | 
					
						
							|  |  |  |                     m_histogramRect); | 
					
						
							|  |  |  |                 drawTextOverlay( | 
					
						
							|  |  |  |                     m_histogramMarkers.at(i).m_deltaPowerStr, | 
					
						
							|  |  |  |                     QColor(255, 255, 255, 192), | 
					
						
							|  |  |  |                     m_textOverlayFont, | 
					
						
							|  |  |  |                     m_histogramRect.width(), | 
					
						
							|  |  |  |                     m_histogramMarkers.at(i).m_point.y() * m_histogramRect.height(), | 
					
						
							|  |  |  |                     false, | 
					
						
							|  |  |  |                     m_histogramMarkers.at(i).m_point.y() < 0.5f, | 
					
						
							|  |  |  |                     m_histogramRect); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // paint waterfall markers
 | 
					
						
							|  |  |  |     if (m_waterfallMarkers.size() > 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // crosshairs
 | 
					
						
							|  |  |  |         for (int i = 0; i < m_waterfallMarkers.size(); i++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             GLfloat h[] { | 
					
						
							|  |  |  |                 (float) m_waterfallMarkers.at(i).m_point.x(), 0, | 
					
						
							|  |  |  |                 (float) m_waterfallMarkers.at(i).m_point.x(), 1 | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |             m_glShaderSimple.drawSegments(m_glWaterfallBoxMatrix, markerColor, h, 2); | 
					
						
							|  |  |  |             GLfloat v[] { | 
					
						
							|  |  |  |                 0, (float) m_waterfallMarkers.at(i).m_point.y(), | 
					
						
							|  |  |  |                 1, (float) m_waterfallMarkers.at(i).m_point.y() | 
					
						
							|  |  |  |             }; | 
					
						
							|  |  |  |             m_glShaderSimple.drawSegments(m_glWaterfallBoxMatrix, markerColor, v, 2); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // text
 | 
					
						
							|  |  |  |         for (int i = 0; i < m_waterfallMarkers.size(); i++) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (i == 0) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 drawTextOverlay( | 
					
						
							|  |  |  |                     m_waterfallMarkers.at(i).m_frequencyStr, | 
					
						
							|  |  |  |                     QColor(255, 255, 255, 192), | 
					
						
							|  |  |  |                     m_textOverlayFont, | 
					
						
							|  |  |  |                     m_waterfallMarkers.at(i).m_point.x() * m_waterfallRect.width(), | 
					
						
							|  |  |  |                     (!m_invertedWaterfall || (m_histogramHeight == 0)) ? m_waterfallRect.height() : 0, | 
					
						
							|  |  |  |                     m_waterfallMarkers.at(i).m_point.x() < 0.5f, | 
					
						
							|  |  |  |                     m_invertedWaterfall && (m_histogramHeight != 0), | 
					
						
							|  |  |  |                     m_waterfallRect); | 
					
						
							|  |  |  |                 drawTextOverlay( | 
					
						
							|  |  |  |                     m_waterfallMarkers.at(i).m_timeStr, | 
					
						
							|  |  |  |                     QColor(255, 255, 255, 192), | 
					
						
							|  |  |  |                     m_textOverlayFont, | 
					
						
							|  |  |  |                     0, | 
					
						
							|  |  |  |                     m_waterfallMarkers.at(i).m_point.y() * m_waterfallRect.height(), | 
					
						
							|  |  |  |                     true, | 
					
						
							|  |  |  |                     m_waterfallMarkers.at(i).m_point.y() < 0.5f, | 
					
						
							|  |  |  |                     m_waterfallRect); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 drawTextOverlay( | 
					
						
							|  |  |  |                     m_waterfallMarkers.at(i).m_deltaFrequencyStr, | 
					
						
							|  |  |  |                     QColor(255, 255, 255, 192), | 
					
						
							|  |  |  |                     m_textOverlayFont, | 
					
						
							|  |  |  |                     m_waterfallMarkers.at(i).m_point.x() * m_waterfallRect.width(), | 
					
						
							|  |  |  |                     (!m_invertedWaterfall || (m_histogramHeight == 0)) ? 0 : m_waterfallRect.height(), | 
					
						
							|  |  |  |                     m_waterfallMarkers.at(i).m_point.x() < 0.5f, | 
					
						
							|  |  |  |                     !m_invertedWaterfall || (m_histogramHeight == 0), | 
					
						
							|  |  |  |                     m_waterfallRect); | 
					
						
							|  |  |  |                 drawTextOverlay( | 
					
						
							|  |  |  |                     m_waterfallMarkers.at(i).m_deltaTimeStr, | 
					
						
							|  |  |  |                     QColor(255, 255, 255, 192), | 
					
						
							|  |  |  |                     m_textOverlayFont, | 
					
						
							|  |  |  |                     m_waterfallRect.width(), | 
					
						
							|  |  |  |                     m_waterfallMarkers.at(i).m_point.y() * m_waterfallRect.height(), | 
					
						
							|  |  |  |                     false, | 
					
						
							|  |  |  |                     m_waterfallMarkers.at(i).m_point.y() < 0.5f, | 
					
						
							|  |  |  |                     m_waterfallRect); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::stopDrag() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	if (m_cursorState != CSNormal) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | 		if ((m_cursorState == CSSplitterMoving) || (m_cursorState == CSChannelMoving)) { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			releaseMouse(); | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		setCursor(Qt::ArrowCursor); | 
					
						
							|  |  |  | 		m_cursorState = CSNormal; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::applyChanges() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	if (m_fftSize <= 0) { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2019-08-23 13:23:19 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	QFontMetrics fm(font()); | 
					
						
							|  |  |  | 	int M = fm.width("-"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	m_topMargin = fm.ascent() * 1.5; | 
					
						
							|  |  |  | 	m_bottomMargin = fm.ascent() * 1.5; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 15:41:58 +00:00
										 |  |  | 	int waterfallTop = 0; | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	m_frequencyScaleHeight = fm.height() * 3; // +1 line for marker frequency scale
 | 
					
						
							| 
									
										
										
										
											2017-05-25 20:13:34 +02:00
										 |  |  | 	int frequencyScaleTop = 0; | 
					
						
							| 
									
										
										
										
											2014-11-21 15:41:58 +00:00
										 |  |  | 	int histogramTop = 0; | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 	//int m_leftMargin;
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	m_rightMargin = fm.width("000"); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 	// displays both histogram and waterfall
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	if (m_displayWaterfall && (m_displayHistogram | m_displayMaxHold | m_displayCurrent)) | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		m_waterfallHeight = height() * m_waterfallShare - 1; | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		if (m_waterfallHeight < 0) { | 
					
						
							|  |  |  | 			m_waterfallHeight = 0; | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		if (!m_invertedWaterfall) | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			waterfallTop = m_topMargin; | 
					
						
							|  |  |  | 			frequencyScaleTop = waterfallTop + m_waterfallHeight + 1; | 
					
						
							|  |  |  | 			histogramTop = waterfallTop + m_waterfallHeight + m_frequencyScaleHeight + 1; | 
					
						
							|  |  |  | 			m_histogramHeight = height() - m_topMargin - m_waterfallHeight - m_frequencyScaleHeight - m_bottomMargin; | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			histogramTop = m_topMargin; | 
					
						
							|  |  |  | 			m_histogramHeight = height() - m_topMargin - m_waterfallHeight - m_frequencyScaleHeight - m_bottomMargin; | 
					
						
							|  |  |  | 			waterfallTop = histogramTop + m_histogramHeight + m_frequencyScaleHeight + 1; | 
					
						
							|  |  |  | 			frequencyScaleTop = histogramTop + m_histogramHeight + 1; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		m_timeScale.setSize(m_waterfallHeight); | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		if (m_sampleRate > 0) | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-07-01 03:11:36 +02:00
										 |  |  | 			float scaleDiv = ((float)m_sampleRate / (float)m_timingRate) * (m_ssbSpectrum ? 2 : 1); | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			if (!m_invertedWaterfall) { | 
					
						
							|  |  |  | 				m_timeScale.setRange(m_timingRate > 1 ? Unit::TimeHMS : Unit::Time, (m_waterfallHeight * m_fftSize) / scaleDiv, 0); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				m_timeScale.setRange(m_timingRate > 1 ? Unit::TimeHMS : Unit::Time, 0, (m_waterfallHeight * m_fftSize) / scaleDiv); | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			m_timeScale.setRange(Unit::Time, 0, 1); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		m_powerScale.setSize(m_histogramHeight); | 
					
						
							| 
									
										
										
										
											2018-07-06 01:34:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (m_linear) { | 
					
						
							|  |  |  |             m_powerScale.setRange(Unit::Scientific, m_referenceLevel - m_powerRange, m_referenceLevel); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 		    m_powerScale.setRange(Unit::Decibel, m_referenceLevel - m_powerRange, m_referenceLevel); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 		m_leftMargin = m_timeScale.getScaleWidth(); | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		if (m_powerScale.getScaleWidth() > m_leftMargin) { | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			m_leftMargin = m_powerScale.getScaleWidth(); | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 		m_leftMargin += 2 * M; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		m_frequencyScale.setSize(width() - m_leftMargin - m_rightMargin); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		m_frequencyScale.setRange(Unit::Frequency, m_centerFrequency - m_sampleRate / 2, m_centerFrequency + m_sampleRate / 2); | 
					
						
							| 
									
										
										
										
											2017-07-22 04:23:10 +02:00
										 |  |  | 		m_frequencyScale.setMakeOpposite(m_lsbDisplay); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		m_glWaterfallBoxMatrix.setToIdentity(); | 
					
						
							|  |  |  | 		m_glWaterfallBoxMatrix.translate( | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			-1.0f + ((float)(2*m_leftMargin)   / (float) width()), | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 			 1.0f - ((float)(2*waterfallTop) / (float) height()) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		m_glWaterfallBoxMatrix.scale( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			((float) 2 * (width() - m_leftMargin - m_rightMargin)) / (float) width(), | 
					
						
							|  |  |  | 			(float) (-2*m_waterfallHeight) / (float) height() | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2016-03-06 16:39:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 01:41:30 +01:00
										 |  |  | 		m_glHistogramBoxMatrix.setToIdentity(); | 
					
						
							|  |  |  | 		m_glHistogramBoxMatrix.translate( | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			-1.0f + ((float)(2*m_leftMargin)   / (float) width()), | 
					
						
							| 
									
										
										
										
											2016-03-03 01:41:30 +01:00
										 |  |  | 			 1.0f - ((float)(2*histogramTop) / (float) height()) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		m_glHistogramBoxMatrix.scale( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			((float) 2 * (width() - m_leftMargin - m_rightMargin)) / (float) width(), | 
					
						
							|  |  |  | 			(float) (-2*m_histogramHeight) / (float) height() | 
					
						
							| 
									
										
										
										
											2016-03-03 01:41:30 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		m_glHistogramSpectrumMatrix.setToIdentity(); | 
					
						
							|  |  |  | 		m_glHistogramSpectrumMatrix.translate( | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			-1.0f + ((float)(2*m_leftMargin)   / (float) width()), | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 			 1.0f - ((float)(2*histogramTop) / (float) height()) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		m_glHistogramSpectrumMatrix.scale( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			((float) 2 * (width() - m_leftMargin - m_rightMargin)) / ((float) width() * (float)(m_fftSize - 1)), | 
					
						
							|  |  |  | 			((float) 2*m_histogramHeight / height()) / m_powerRange | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		// m_frequencyScaleRect = QRect(
 | 
					
						
							|  |  |  | 		// 	0,
 | 
					
						
							|  |  |  | 		// 	frequencyScaleTop,
 | 
					
						
							|  |  |  | 		// 	width(),
 | 
					
						
							|  |  |  | 		// 	m_frequencyScaleHeight
 | 
					
						
							|  |  |  | 		// );
 | 
					
						
							| 
									
										
										
										
											2016-03-06 16:39:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		m_glFrequencyScaleBoxMatrix.setToIdentity(); | 
					
						
							|  |  |  | 		m_glFrequencyScaleBoxMatrix.translate ( | 
					
						
							|  |  |  | 			-1.0f, | 
					
						
							|  |  |  | 			 1.0f - ((float) 2*frequencyScaleTop / (float) height()) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		m_glFrequencyScaleBoxMatrix.scale ( | 
					
						
							|  |  |  | 			2.0f, | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			(float) -2*m_frequencyScaleHeight / (float) height() | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		m_glLeftScaleBoxMatrix.setToIdentity(); | 
					
						
							|  |  |  | 		m_glLeftScaleBoxMatrix.translate(-1.0f, 1.0f); | 
					
						
							|  |  |  | 		m_glLeftScaleBoxMatrix.scale( | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			(float)(2*(m_leftMargin - 1)) / (float) width(), | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 			-2.0f | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 	// displays waterfall only
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	else if (m_displayWaterfall) | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |         m_histogramHeight = 0; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		histogramTop = 0; | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		m_bottomMargin = m_frequencyScaleHeight; | 
					
						
							|  |  |  | 		m_waterfallHeight = height() - m_topMargin - m_frequencyScaleHeight; | 
					
						
							|  |  |  | 		waterfallTop = m_topMargin; | 
					
						
							|  |  |  | 		frequencyScaleTop = m_topMargin + m_waterfallHeight + 1; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		m_timeScale.setSize(m_waterfallHeight); | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		if (m_sampleRate > 0) | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-07-01 04:10:36 +02:00
										 |  |  | 			float scaleDiv = ((float)m_sampleRate / (float)m_timingRate) * (m_ssbSpectrum ? 2 : 1); | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			if (!m_invertedWaterfall) { | 
					
						
							|  |  |  | 				m_timeScale.setRange(m_timingRate > 1 ? Unit::TimeHMS : Unit::Time, (m_waterfallHeight * m_fftSize) / scaleDiv, 0); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				m_timeScale.setRange(m_timingRate > 1 ? Unit::TimeHMS : Unit::Time, 0, (m_waterfallHeight * m_fftSize) / scaleDiv); | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			if (!m_invertedWaterfall) { | 
					
						
							| 
									
										
										
										
											2018-07-01 04:10:36 +02:00
										 |  |  | 				m_timeScale.setRange(m_timingRate > 1 ? Unit::TimeHMS : Unit::Time, 10, 0); | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2018-07-01 04:10:36 +02:00
										 |  |  | 				m_timeScale.setRange(m_timingRate > 1 ? Unit::TimeHMS : Unit::Time, 0, 10); | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 		m_leftMargin = m_timeScale.getScaleWidth(); | 
					
						
							|  |  |  | 		m_leftMargin += 2 * M; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		m_frequencyScale.setSize(width() - m_leftMargin - m_rightMargin); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		m_frequencyScale.setRange(Unit::Frequency, m_centerFrequency - m_sampleRate / 2.0, m_centerFrequency + m_sampleRate / 2.0); | 
					
						
							| 
									
										
										
										
											2017-07-22 04:23:10 +02:00
										 |  |  | 		m_frequencyScale.setMakeOpposite(m_lsbDisplay); | 
					
						
							| 
									
										
										
										
											2016-03-06 16:39:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		m_glWaterfallBoxMatrix.setToIdentity(); | 
					
						
							|  |  |  | 		m_glWaterfallBoxMatrix.translate( | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			-1.0f + ((float)(2*m_leftMargin)   / (float) width()), | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			 1.0f - ((float)(2*m_topMargin) / (float) height()) | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 		m_glWaterfallBoxMatrix.scale( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			((float) 2 * (width() - m_leftMargin - m_rightMargin)) / (float) width(), | 
					
						
							|  |  |  | 			(float) (-2*m_waterfallHeight) / (float) height() | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		// m_frequencyScaleRect = QRect(
 | 
					
						
							|  |  |  | 		// 	0,
 | 
					
						
							|  |  |  | 		// 	frequencyScaleTop,
 | 
					
						
							|  |  |  | 		// 	width(),
 | 
					
						
							|  |  |  | 		// 	m_frequencyScaleHeight
 | 
					
						
							|  |  |  | 		// );
 | 
					
						
							| 
									
										
										
										
											2016-03-06 16:39:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		m_glFrequencyScaleBoxMatrix.setToIdentity(); | 
					
						
							|  |  |  | 		m_glFrequencyScaleBoxMatrix.translate ( | 
					
						
							|  |  |  | 			-1.0f, | 
					
						
							|  |  |  | 			 1.0f - ((float) 2*frequencyScaleTop / (float) height()) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		m_glFrequencyScaleBoxMatrix.scale ( | 
					
						
							|  |  |  | 			2.0f, | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			(float) -2*m_frequencyScaleHeight / (float) height() | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		m_glLeftScaleBoxMatrix.setToIdentity(); | 
					
						
							|  |  |  | 		m_glLeftScaleBoxMatrix.translate(-1.0f, 1.0f); | 
					
						
							|  |  |  | 		m_glLeftScaleBoxMatrix.scale( | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			(float)(2*(m_leftMargin - 1)) / (float) width(), | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 			-2.0f | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 	// displays histogram only
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	else if (m_displayHistogram || m_displayMaxHold || m_displayCurrent) | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		m_bottomMargin = m_frequencyScaleHeight; | 
					
						
							|  |  |  | 		frequencyScaleTop = height() - m_bottomMargin; | 
					
						
							|  |  |  | 		histogramTop = m_topMargin - 1; | 
					
						
							|  |  |  | 		m_waterfallHeight = 0; | 
					
						
							|  |  |  | 		m_histogramHeight = height() - m_topMargin - m_frequencyScaleHeight; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		m_powerScale.setSize(m_histogramHeight); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		m_powerScale.setRange(Unit::Decibel, m_referenceLevel - m_powerRange, m_referenceLevel); | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 		m_leftMargin = m_powerScale.getScaleWidth(); | 
					
						
							|  |  |  | 		m_leftMargin += 2 * M; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		m_frequencyScale.setSize(width() - m_leftMargin - m_rightMargin); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		m_frequencyScale.setRange(Unit::Frequency, m_centerFrequency - m_sampleRate / 2, m_centerFrequency + m_sampleRate / 2); | 
					
						
							| 
									
										
										
										
											2017-07-22 04:23:10 +02:00
										 |  |  | 		m_frequencyScale.setMakeOpposite(m_lsbDisplay); | 
					
						
							| 
									
										
										
										
											2016-03-06 16:39:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		m_glHistogramSpectrumMatrix.setToIdentity(); | 
					
						
							|  |  |  | 		m_glHistogramSpectrumMatrix.translate( | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			-1.0f + ((float)(2*m_leftMargin)   / (float) width()), | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 			 1.0f - ((float)(2*histogramTop) / (float) height()) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		m_glHistogramSpectrumMatrix.scale( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			((float) 2 * (width() - m_leftMargin - m_rightMargin)) / ((float) width() * (float)(m_fftSize - 1)), | 
					
						
							|  |  |  | 			((float) 2*(height() - m_topMargin - m_frequencyScaleHeight)) / (height()*m_powerRange) | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		m_glHistogramBoxMatrix.setToIdentity(); | 
					
						
							|  |  |  | 		m_glHistogramBoxMatrix.translate( | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			-1.0f + ((float)(2*m_leftMargin)   / (float) width()), | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 			 1.0f - ((float)(2*histogramTop) / (float) height()) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		m_glHistogramBoxMatrix.scale( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			((float) 2 * (width() - m_leftMargin - m_rightMargin)) / (float) width(), | 
					
						
							|  |  |  | 			(float) (-2*(height() - m_topMargin - m_frequencyScaleHeight)) / (float) height() | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		// m_frequencyScaleRect = QRect(
 | 
					
						
							|  |  |  | 		// 	0,
 | 
					
						
							|  |  |  | 		// 	frequencyScaleTop,
 | 
					
						
							|  |  |  | 		// 	width(),
 | 
					
						
							|  |  |  | 		// 	m_frequencyScaleHeight
 | 
					
						
							|  |  |  | 		// );
 | 
					
						
							| 
									
										
										
										
											2016-03-06 16:39:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		m_glFrequencyScaleBoxMatrix.setToIdentity(); | 
					
						
							|  |  |  | 		m_glFrequencyScaleBoxMatrix.translate ( | 
					
						
							|  |  |  | 			-1.0f, | 
					
						
							|  |  |  | 			 1.0f - ((float) 2*frequencyScaleTop / (float) height()) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		m_glFrequencyScaleBoxMatrix.scale ( | 
					
						
							|  |  |  | 			2.0f, | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			(float) -2*m_frequencyScaleHeight / (float) height() | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		m_glLeftScaleBoxMatrix.setToIdentity(); | 
					
						
							|  |  |  | 		m_glLeftScaleBoxMatrix.translate(-1.0f, 1.0f); | 
					
						
							|  |  |  | 		m_glLeftScaleBoxMatrix.scale( | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			(float)(2*(m_leftMargin - 1)) / (float) width(), | 
					
						
							| 
									
										
										
										
											2016-03-03 19:56:54 +01:00
										 |  |  | 			-2.0f | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2015-06-12 02:49:29 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 		m_leftMargin = 2; | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		m_waterfallHeight = 0; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |     // bounding boxes
 | 
					
						
							|  |  |  |     m_frequencyScaleRect = QRect( | 
					
						
							|  |  |  |         0, | 
					
						
							|  |  |  |         frequencyScaleTop, | 
					
						
							|  |  |  |         width(), | 
					
						
							|  |  |  |         m_frequencyScaleHeight | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ((m_invertedWaterfall) || (m_waterfallHeight == 0)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_histogramRect = QRectF( | 
					
						
							|  |  |  |             (float) m_leftMargin / (float) width(), | 
					
						
							|  |  |  |             (float) m_topMargin / (float) height(), | 
					
						
							|  |  |  |             (float) (width() - m_leftMargin - m_rightMargin) / (float) width(), | 
					
						
							|  |  |  |             (float) (m_histogramHeight) / (float) height() | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_histogramRect = QRectF( | 
					
						
							|  |  |  |             (float) m_leftMargin / (float) width(), | 
					
						
							|  |  |  |             (float) (waterfallTop + m_waterfallHeight + m_frequencyScaleHeight) / (float) height(), | 
					
						
							|  |  |  |             (float) (width() - m_leftMargin - m_rightMargin) / (float) width(), | 
					
						
							|  |  |  |             (float) m_histogramHeight / (float) height() | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!m_invertedWaterfall || (m_histogramHeight == 0)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_waterfallRect = QRectF( | 
					
						
							|  |  |  |             (float) m_leftMargin / (float) width(), | 
					
						
							|  |  |  |             (float) m_topMargin / (float) height(), | 
					
						
							|  |  |  |             (float) (width() - m_leftMargin - m_rightMargin) / (float) width(), | 
					
						
							|  |  |  |             (float) m_waterfallHeight / (float) height() | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_waterfallRect = QRectF( | 
					
						
							|  |  |  |             (float) m_leftMargin / (float) width(), | 
					
						
							|  |  |  |             (float) (m_topMargin + m_histogramHeight + m_frequencyScaleHeight) / (float) height(), | 
					
						
							|  |  |  |             (float) (width() - m_leftMargin - m_rightMargin) / (float) width(), | 
					
						
							|  |  |  |             (float) (m_waterfallHeight) / (float) height() | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	// channel overlays
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	for (int i = 0; i < m_channelMarkerStates.size(); ++i) | 
					
						
							| 
									
										
										
										
											2016-03-04 01:30:29 +01:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		ChannelMarkerState* dv = m_channelMarkerStates[i]; | 
					
						
							| 
									
										
										
										
											2015-05-11 03:27:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 21:50:02 +02:00
										 |  |  | 		qreal xc, pw, nw, dsbw; | 
					
						
							| 
									
										
										
										
											2015-05-11 03:27:31 +02:00
										 |  |  | 		ChannelMarker::sidebands_t sidebands = dv->m_channelMarker->getSidebands(); | 
					
						
							|  |  |  | 		xc = m_centerFrequency + dv->m_channelMarker->getCenterFrequency(); // marker center frequency
 | 
					
						
							| 
									
										
										
										
											2015-05-12 21:50:02 +02:00
										 |  |  | 		dsbw = dv->m_channelMarker->getBandwidth(); | 
					
						
							| 
									
										
										
										
											2015-05-11 03:27:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (sidebands == ChannelMarker::usb) { | 
					
						
							| 
									
										
										
										
											2015-05-12 21:50:02 +02:00
										 |  |  | 			nw = dv->m_channelMarker->getLowCutoff();     // negative bandwidth
 | 
					
						
							| 
									
										
										
										
											2018-02-24 10:29:27 +01:00
										 |  |  | 			int bw = dv->m_channelMarker->getBandwidth() / 2; | 
					
						
							|  |  |  | 			pw = (qreal) bw; // positive bandwidth
 | 
					
						
							| 
									
										
										
										
											2015-05-11 03:27:31 +02:00
										 |  |  | 		} else if (sidebands == ChannelMarker::lsb) { | 
					
						
							| 
									
										
										
										
											2015-05-12 21:50:02 +02:00
										 |  |  | 			pw = dv->m_channelMarker->getLowCutoff(); | 
					
						
							| 
									
										
										
										
											2018-02-24 10:29:27 +01:00
										 |  |  | 			int bw = dv->m_channelMarker->getBandwidth() / 2; | 
					
						
							|  |  |  | 			nw = (qreal) bw; | 
					
						
							| 
									
										
										
										
											2017-03-16 11:49:14 +01:00
										 |  |  | 		} else if (sidebands == ChannelMarker::vusb) { | 
					
						
							| 
									
										
										
										
											2017-03-16 12:01:46 +01:00
										 |  |  |             nw = -dv->m_channelMarker->getOppositeBandwidth(); // negative bandwidth
 | 
					
						
							| 
									
										
										
										
											2017-03-16 11:49:14 +01:00
										 |  |  |             pw = dv->m_channelMarker->getBandwidth(); // positive bandwidth
 | 
					
						
							|  |  |  |         } else if (sidebands == ChannelMarker::vlsb) { | 
					
						
							| 
									
										
										
										
											2017-03-16 12:01:46 +01:00
										 |  |  |             pw = dv->m_channelMarker->getOppositeBandwidth(); // positive bandwidth
 | 
					
						
							| 
									
										
										
										
											2017-03-16 11:49:14 +01:00
										 |  |  |             nw = -dv->m_channelMarker->getBandwidth(); // negative bandwidth
 | 
					
						
							| 
									
										
										
										
											2015-05-11 03:27:31 +02:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2015-05-12 21:50:02 +02:00
										 |  |  | 			pw = dsbw / 2; | 
					
						
							| 
									
										
										
										
											2015-05-11 03:27:31 +02:00
										 |  |  | 			nw = -pw; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-12 21:50:02 +02:00
										 |  |  | 		// draw the DSB rectangle
 | 
					
						
							| 
									
										
										
										
											2016-03-06 16:39:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-04 01:30:29 +01:00
										 |  |  | 		QMatrix4x4 glMatrixDsb; | 
					
						
							|  |  |  | 		glMatrixDsb.setToIdentity(); | 
					
						
							|  |  |  | 		glMatrixDsb.translate( | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			-1.0f + 2.0f * ((m_leftMargin + m_frequencyScale.getPosFromValue(xc - (dsbw/2))) / (float) width()), | 
					
						
							| 
									
										
										
										
											2016-03-04 01:30:29 +01:00
										 |  |  | 			 1.0f | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		glMatrixDsb.scale( | 
					
						
							|  |  |  | 			2.0f * (dsbw / (float)m_sampleRate), | 
					
						
							|  |  |  | 			-2.0f | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		dv->m_glMatrixDsbWaterfall = glMatrixDsb; | 
					
						
							|  |  |  | 		dv->m_glMatrixDsbWaterfall.translate( | 
					
						
							|  |  |  | 			 0.0f, | 
					
						
							|  |  |  | 			 (float) waterfallTop / (float) height() | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		dv->m_glMatrixDsbWaterfall.scale( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			(float) (width() - m_leftMargin - m_rightMargin) / (float) width(), | 
					
						
							|  |  |  | 			(float) m_waterfallHeight / (float) height() | 
					
						
							| 
									
										
										
										
											2016-03-04 01:30:29 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-04 03:45:34 +01:00
										 |  |  | 		dv->m_glMatrixDsbHistogram = glMatrixDsb; | 
					
						
							|  |  |  | 		dv->m_glMatrixDsbHistogram.translate( | 
					
						
							|  |  |  | 			 0.0f, | 
					
						
							|  |  |  | 			 (float) histogramTop / (float) height() | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		dv->m_glMatrixDsbHistogram.scale( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			(float) (width() - m_leftMargin - m_rightMargin) / (float) width(), | 
					
						
							|  |  |  | 			(float) m_histogramHeight / (float) height() | 
					
						
							| 
									
										
										
										
											2016-03-04 03:45:34 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		dv->m_glMatrixDsbFreqScale = glMatrixDsb; | 
					
						
							|  |  |  | 		dv->m_glMatrixDsbFreqScale.translate( | 
					
						
							|  |  |  | 			 0.0f, | 
					
						
							|  |  |  | 			 (float) frequencyScaleTop / (float) height() | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		dv->m_glMatrixDsbFreqScale.scale( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			(float) (width() - m_leftMargin - m_rightMargin) / (float) width(), | 
					
						
							|  |  |  | 			(float) m_frequencyScaleHeight / (float) height() | 
					
						
							| 
									
										
										
										
											2016-03-04 03:45:34 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-05 07:02:06 +01:00
										 |  |  | 		// draw the effective BW rectangle
 | 
					
						
							| 
									
										
										
										
											2016-03-06 16:39:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-04 01:30:29 +01:00
										 |  |  | 		QMatrix4x4 glMatrix; | 
					
						
							|  |  |  | 		glMatrix.setToIdentity(); | 
					
						
							|  |  |  | 		glMatrix.translate( | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			-1.0f + 2.0f * ((m_leftMargin + m_frequencyScale.getPosFromValue(xc + nw)) / (float) width()), | 
					
						
							| 
									
										
										
										
											2016-03-04 01:30:29 +01:00
										 |  |  | 			 1.0f | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		glMatrix.scale( | 
					
						
							|  |  |  | 			2.0f * ((pw-nw) / (float)m_sampleRate), | 
					
						
							|  |  |  | 			-2.0f | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		dv->m_glMatrixWaterfall = glMatrix; | 
					
						
							|  |  |  | 		dv->m_glMatrixWaterfall.translate( | 
					
						
							|  |  |  | 			 0.0f, | 
					
						
							|  |  |  | 			 (float) waterfallTop / (float) height() | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		dv->m_glMatrixWaterfall.scale( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			(float) (width() - m_leftMargin - m_rightMargin) / (float) width(), | 
					
						
							|  |  |  | 			(float) m_waterfallHeight / (float) height() | 
					
						
							| 
									
										
										
										
											2016-03-04 01:30:29 +01:00
										 |  |  | 		); | 
					
						
							| 
									
										
										
										
											2015-05-11 03:27:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-04 03:45:34 +01:00
										 |  |  | 		dv->m_glMatrixHistogram = glMatrix; | 
					
						
							|  |  |  | 		dv->m_glMatrixHistogram.translate( | 
					
						
							|  |  |  | 			 0.0f, | 
					
						
							|  |  |  | 			 (float) histogramTop / (float) height() | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		dv->m_glMatrixHistogram.scale( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			(float) (width() - m_leftMargin - m_rightMargin) / (float) width(), | 
					
						
							|  |  |  | 			(float) m_histogramHeight / (float) height() | 
					
						
							| 
									
										
										
										
											2016-03-04 03:45:34 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-04 02:24:08 +01:00
										 |  |  | 		dv->m_glMatrixFreqScale = glMatrix; | 
					
						
							|  |  |  | 		dv->m_glMatrixFreqScale.translate( | 
					
						
							|  |  |  | 			 0.0f, | 
					
						
							|  |  |  | 			 (float) frequencyScaleTop / (float) height() | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		dv->m_glMatrixFreqScale.scale( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			(float) (width() - m_leftMargin - m_rightMargin) / (float) width(), | 
					
						
							|  |  |  | 			(float) m_frequencyScaleHeight / (float) height() | 
					
						
							| 
									
										
										
										
											2016-03-04 02:24:08 +01:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-11 03:27:31 +02:00
										 |  |  | 		/*
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		dv->m_glRect.setRect( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			m_frequencyScale.getPosFromValue(m_centerFrequency + dv->m_channelMarker->getCenterFrequency() - dv->m_channelMarker->getBandwidth() / 2) / (float)(width() - m_leftMargin - m_rightMargin), | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			0, | 
					
						
							|  |  |  | 			(dv->m_channelMarker->getBandwidth() / (float)m_sampleRate), | 
					
						
							|  |  |  | 			1); | 
					
						
							| 
									
										
										
										
											2015-05-11 03:27:31 +02:00
										 |  |  | 		*/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		if (m_displayHistogram || m_displayMaxHold || m_displayCurrent || m_displayWaterfall) | 
					
						
							| 
									
										
										
										
											2016-03-04 01:30:29 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			dv->m_rect.setRect(m_frequencyScale.getPosFromValue(xc) + m_leftMargin - 1, | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			m_topMargin, | 
					
						
							| 
									
										
										
										
											2015-05-11 03:27:31 +02:00
										 |  |  | 			5, | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			height() - m_topMargin - m_bottomMargin); | 
					
						
							| 
									
										
										
										
											2015-05-11 03:27:31 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/*
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		if(m_displayHistogram || m_displayMaxHold || m_displayWaterfall) { | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 			dv->m_rect.setRect(m_frequencyScale.getPosFromValue(m_centerFrequency + dv->m_channelMarker->getCenterFrequency()) + m_leftMargin - 1, | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			m_topMargin, | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			5, | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			height() - m_topMargin - m_bottomMargin); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-11 03:27:31 +02:00
										 |  |  | 		*/ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// prepare left scales (time and power)
 | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 		m_leftMarginPixmap = QPixmap(m_leftMargin - 1, height()); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		m_leftMarginPixmap.fill(Qt::black); | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			QPainter painter(&m_leftMarginPixmap); | 
					
						
							|  |  |  | 			painter.setPen(QColor(0xf0, 0xf0, 0xff)); | 
					
						
							| 
									
										
										
										
											2015-07-07 02:50:26 +02:00
										 |  |  | 			painter.setFont(font()); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			const ScaleEngine::TickList* tickList; | 
					
						
							|  |  |  | 			const ScaleEngine::Tick* tick; | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			if (m_displayWaterfall) { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 				tickList = &m_timeScale.getTickList(); | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 				for (int i = 0; i < tickList->count(); i++) { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 					tick = &(*tickList)[i]; | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 					if (tick->major) { | 
					
						
							|  |  |  | 						if (tick->textSize > 0) | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 							painter.drawText(QPointF(m_leftMargin - M - tick->textSize, waterfallTop + fm.ascent() + tick->textPos), tick->text); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			if (m_displayHistogram || m_displayMaxHold || m_displayCurrent) { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 				tickList = &m_powerScale.getTickList(); | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 				for (int i = 0; i < tickList->count(); i++) { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 					tick = &(*tickList)[i]; | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 					if (tick->major) { | 
					
						
							|  |  |  | 						if (tick->textSize > 0) | 
					
						
							|  |  |  | 							painter.drawText(QPointF(m_leftMargin - M - tick->textSize, histogramTop + m_histogramHeight - tick->textPos - 1), tick->text); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-03-06 16:39:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-05 06:45:05 +01:00
										 |  |  | 		m_glShaderLeftScale.initTexture(m_leftMarginPixmap.toImage()); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	// prepare frequency scale
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	if (m_displayWaterfall || m_displayHistogram || m_displayMaxHold || m_displayCurrent){ | 
					
						
							|  |  |  | 		m_frequencyPixmap = QPixmap(width(), m_frequencyScaleHeight); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		m_frequencyPixmap.fill(Qt::transparent); | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			QPainter painter(&m_frequencyPixmap); | 
					
						
							|  |  |  | 			painter.setPen(Qt::NoPen); | 
					
						
							|  |  |  | 			painter.setBrush(Qt::black); | 
					
						
							|  |  |  | 			painter.setBrush(Qt::transparent); | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			painter.drawRect(m_leftMargin, 0, width() - m_leftMargin, m_frequencyScaleHeight); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			painter.setPen(QColor(0xf0, 0xf0, 0xff)); | 
					
						
							| 
									
										
										
										
											2015-07-07 02:50:26 +02:00
										 |  |  | 			painter.setFont(font()); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			const ScaleEngine::TickList* tickList = &m_frequencyScale.getTickList(); | 
					
						
							|  |  |  | 			const ScaleEngine::Tick* tick; | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			for (int i = 0; i < tickList->count(); i++) { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 				tick = &(*tickList)[i]; | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 				if (tick->major) { | 
					
						
							|  |  |  | 					if (tick->textSize > 0) | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 						painter.drawText(QPointF(m_leftMargin + tick->textPos, fm.height() + fm.ascent() / 2 - 1), tick->text); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-11 13:37:46 +02:00
										 |  |  | 			// Frequency overlay on highlighted marker
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			for (int i = 0; i < m_channelMarkerStates.size(); ++i) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2015-05-11 13:37:46 +02:00
										 |  |  | 				ChannelMarkerState* dv = m_channelMarkerStates[i]; | 
					
						
							| 
									
										
										
										
											2019-05-30 18:38:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-02 01:37:12 +02:00
										 |  |  | 				if (dv->m_channelMarker->getHighlighted() | 
					
						
							| 
									
										
										
										
											2019-05-30 18:38:10 +02:00
										 |  |  |                     && (dv->m_channelMarker->getSourceOrSinkStream() == m_displaySourceOrSink) | 
					
						
							| 
									
										
										
										
											2019-09-09 00:58:26 +02:00
										 |  |  |                     && dv->m_channelMarker->streamIndexApplies(m_displayStreamIndex)) | 
					
						
							| 
									
										
										
										
											2015-05-11 13:37:46 +02:00
										 |  |  | 				{ | 
					
						
							|  |  |  | 					qreal xc; | 
					
						
							| 
									
										
										
										
											2015-05-11 17:46:59 +02:00
										 |  |  | 					int shift; | 
					
						
							| 
									
										
										
										
											2015-05-11 13:37:46 +02:00
										 |  |  | 					//ChannelMarker::sidebands_t sidebands = dv->m_channelMarker->getSidebands();
 | 
					
						
							|  |  |  | 					xc = m_centerFrequency + dv->m_channelMarker->getCenterFrequency(); // marker center frequency
 | 
					
						
							| 
									
										
										
										
											2017-08-26 06:38:28 +02:00
										 |  |  | 					QString ftext; | 
					
						
							|  |  |  | 					switch (dv->m_channelMarker->getFrequencyScaleDisplayType()) | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 					case ChannelMarker::FScaleDisplay_freq: | 
					
						
							| 
									
										
										
										
											2017-11-14 00:06:42 +01:00
										 |  |  | 	                    ftext = QString::number((m_centerFrequency + dv->m_channelMarker->getCenterFrequency())/1e6, 'f', 6); | 
					
						
							| 
									
										
										
										
											2017-08-26 06:38:28 +02:00
										 |  |  | 	                    break; | 
					
						
							|  |  |  |                     case ChannelMarker::FScaleDisplay_title: | 
					
						
							|  |  |  |                         ftext = dv->m_channelMarker->getTitle(); | 
					
						
							|  |  |  |                         break; | 
					
						
							|  |  |  |                     case ChannelMarker::FScaleDisplay_addressSend: | 
					
						
							|  |  |  |                         ftext = dv->m_channelMarker->getDisplayAddressSend(); | 
					
						
							|  |  |  |                         break; | 
					
						
							|  |  |  |                     case ChannelMarker::FScaleDisplay_addressReceive: | 
					
						
							|  |  |  |                         ftext = dv->m_channelMarker->getDisplayAddressReceive(); | 
					
						
							|  |  |  |                         break; | 
					
						
							|  |  |  | 					default: | 
					
						
							|  |  |  |                         ftext = QString::number((m_centerFrequency + dv->m_channelMarker->getCenterFrequency())/1e6, 'f', 6); | 
					
						
							|  |  |  |                         break; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2015-05-11 17:46:59 +02:00
										 |  |  | 					if (dv->m_channelMarker->getCenterFrequency() < 0) { // left half of scale
 | 
					
						
							|  |  |  | 						ftext = " " + ftext; | 
					
						
							|  |  |  | 						shift = 0; | 
					
						
							|  |  |  | 					} else { // right half of scale
 | 
					
						
							|  |  |  | 						ftext = ftext + " "; | 
					
						
							|  |  |  | 						shift = - fm.width(ftext); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | 					painter.drawText(QPointF(m_leftMargin + m_frequencyScale.getPosFromValue(xc) + shift, 2*fm.height() + fm.ascent() / 2 - 1), ftext); | 
					
						
							| 
									
										
										
										
											2015-05-11 13:37:46 +02:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 16:39:28 +01:00
										 |  |  | 		m_glShaderFrequencyScale.initTexture(m_frequencyPixmap.toImage()); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bool fftSizeChanged = true; | 
					
						
							| 
									
										
										
										
											2016-03-05 11:57:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 	if (m_waterfallBuffer) { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		fftSizeChanged = m_waterfallBuffer->width() != m_fftSize; | 
					
						
							| 
									
										
										
										
											2016-03-05 11:57:53 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	bool windowSizeChanged = m_waterfallTextureHeight != m_waterfallHeight; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-05 11:57:53 +01:00
										 |  |  | 	if (fftSizeChanged || windowSizeChanged) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 		if (m_waterfallBuffer) { | 
					
						
							| 
									
										
										
										
											2016-03-05 11:57:53 +01:00
										 |  |  | 			delete m_waterfallBuffer; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		m_waterfallBuffer = new QImage(m_fftSize, m_waterfallHeight, QImage::Format_ARGB32); | 
					
						
							| 
									
										
										
										
											2016-03-05 11:57:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-18 11:06:41 +01:00
										 |  |  |         m_waterfallBuffer->fill(qRgb(0x00, 0x00, 0x00)); | 
					
						
							|  |  |  |         m_glShaderWaterfall.initTexture(*m_waterfallBuffer); | 
					
						
							|  |  |  |         m_waterfallBufferPos = 0; | 
					
						
							| 
									
										
										
										
											2016-03-05 11:57:53 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	if (fftSizeChanged) | 
					
						
							| 
									
										
										
										
											2016-03-06 16:39:28 +01:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 		if (m_histogramBuffer) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			delete m_histogramBuffer; | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 			m_histogramBuffer = nullptr; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (m_histogram) { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 			delete[] m_histogram; | 
					
						
							| 
									
										
										
										
											2020-04-28 18:44:03 +02:00
										 |  |  | 			m_histogram = nullptr; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		m_histogramBuffer = new QImage(m_fftSize, 100, QImage::Format_RGB32); | 
					
						
							| 
									
										
										
										
											2016-03-05 14:28:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-18 11:06:41 +01:00
										 |  |  |         m_histogramBuffer->fill(qRgb(0x00, 0x00, 0x00)); | 
					
						
							|  |  |  |         m_glShaderHistogram.initTexture(*m_histogramBuffer, QOpenGLTexture::ClampToEdge); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		m_histogram = new quint8[100 * m_fftSize]; | 
					
						
							|  |  |  | 		memset(m_histogram, 0x00, 100 * m_fftSize); | 
					
						
							| 
									
										
										
										
											2018-03-01 01:40:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 02:19:52 +01:00
										 |  |  | 		m_q3FFT.allocate(2*m_fftSize); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	if (fftSizeChanged || windowSizeChanged) | 
					
						
							| 
									
										
										
										
											2016-03-06 16:39:28 +01:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		m_waterfallTextureHeight = m_waterfallHeight; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		m_waterfallTexturePos = 0; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-03-01 01:40:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 02:19:52 +01:00
										 |  |  | 	m_q3TickTime.allocate(4*m_timeScale.getTickList().count()); | 
					
						
							|  |  |  |     m_q3TickFrequency.allocate(4*m_frequencyScale.getTickList().count()); | 
					
						
							|  |  |  |     m_q3TickPower.allocate(4*m_powerScale.getTickList().count()); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::mouseMoveEvent(QMouseEvent* event) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-02-22 03:04:42 +01:00
										 |  |  | 	if (m_displayWaterfall || m_displayHistogram || m_displayMaxHold || m_displayCurrent) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 		if (m_frequencyScaleRect.contains(event->pos())) | 
					
						
							| 
									
										
										
										
											2018-02-22 03:04:42 +01:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			if (m_cursorState == CSNormal) | 
					
						
							| 
									
										
										
										
											2018-02-22 03:04:42 +01:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 				setCursor(Qt::SizeVerCursor); | 
					
						
							|  |  |  | 				m_cursorState = CSSplitter; | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-22 03:04:42 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 			if (m_cursorState == CSSplitter) | 
					
						
							| 
									
										
										
										
											2018-02-22 03:04:42 +01:00
										 |  |  | 			{ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 				setCursor(Qt::ArrowCursor); | 
					
						
							|  |  |  | 				m_cursorState = CSNormal; | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-14 00:06:42 +01:00
										 |  |  |     if (m_cursorState == CSSplitterMoving) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-08-12 10:35:20 +02:00
										 |  |  |         QMutexLocker mutexLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2017-11-14 00:06:42 +01:00
										 |  |  |         float newShare; | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-14 00:06:42 +01:00
										 |  |  |         if (!m_invertedWaterfall) { | 
					
						
							|  |  |  |             newShare = (float) (event->y() - m_frequencyScaleRect.height()) / (float) height(); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             newShare = 1.0 - (float) (event->y() + m_frequencyScaleRect.height()) / (float) height(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (newShare < 0.1) { | 
					
						
							|  |  |  |             newShare = 0.1f; | 
					
						
							|  |  |  |         } else if (newShare > 0.8) { | 
					
						
							|  |  |  |             newShare = 0.8f; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         m_waterfallShare = newShare; | 
					
						
							|  |  |  |         m_changesPending = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         update(); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else if (m_cursorState == CSChannelMoving) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         Real freq = m_frequencyScale.getValueFromPos(event->x() - m_leftMarginPixmap.width() - 1) - m_centerFrequency; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-30 18:38:10 +02:00
										 |  |  |         if (m_channelMarkerStates[m_cursorChannel]->m_channelMarker->getMovable() | 
					
						
							|  |  |  |             && (m_channelMarkerStates[m_cursorChannel]->m_channelMarker->getSourceOrSinkStream() == m_displaySourceOrSink) | 
					
						
							| 
									
										
										
										
											2019-09-09 00:58:26 +02:00
										 |  |  |             && m_channelMarkerStates[m_cursorChannel]->m_channelMarker->streamIndexApplies(m_displayStreamIndex)) | 
					
						
							| 
									
										
										
										
											2017-11-14 00:06:42 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |             m_channelMarkerStates[m_cursorChannel]->m_channelMarker->setCenterFrequencyByCursor(freq); | 
					
						
							|  |  |  |             channelMarkerChanged(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_displayWaterfall || m_displayHistogram || m_displayMaxHold || m_displayCurrent) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for (int i = 0; i < m_channelMarkerStates.size(); ++i) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2019-05-30 18:38:10 +02:00
										 |  |  |             if ((m_channelMarkerStates[i]->m_channelMarker->getSourceOrSinkStream() != m_displaySourceOrSink) | 
					
						
							| 
									
										
										
										
											2019-09-09 00:58:26 +02:00
										 |  |  |                 || !m_channelMarkerStates[i]->m_channelMarker->streamIndexApplies(m_displayStreamIndex)) | 
					
						
							| 
									
										
										
										
											2019-05-30 18:38:10 +02:00
										 |  |  |             { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-14 00:06:42 +01:00
										 |  |  |             if (m_channelMarkerStates[i]->m_rect.contains(event->pos())) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (m_cursorState == CSNormal) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     setCursor(Qt::SizeHorCursor); | 
					
						
							|  |  |  |                     m_cursorState = CSChannel; | 
					
						
							|  |  |  |                     m_cursorChannel = i; | 
					
						
							|  |  |  |                     m_channelMarkerStates[i]->m_channelMarker->setHighlightedByCursor(true); | 
					
						
							|  |  |  |                     channelMarkerChanged(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     return; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 else if (m_cursorState == CSChannel) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     return; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else if (m_channelMarkerStates[i]->m_channelMarker->getHighlighted()) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 m_channelMarkerStates[i]->m_channelMarker->setHighlightedByCursor(false); | 
					
						
							|  |  |  |                 channelMarkerChanged(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	if (m_cursorState == CSChannel) | 
					
						
							| 
									
										
										
										
											2017-11-14 00:06:42 +01:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		setCursor(Qt::ArrowCursor); | 
					
						
							|  |  |  | 		m_cursorState = CSNormal; | 
					
						
							| 
									
										
										
										
											2017-11-14 00:06:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::mousePressEvent(QMouseEvent* event) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |     const QPointF& ep = event->localPos(); | 
					
						
							|  |  |  |     float waterfallShiftY = m_topMargin + m_frequencyScaleHeight + (m_waterfallHeight == 0 ? 0 : m_waterfallHeight + m_bottomMargin); | 
					
						
							|  |  |  |     float histogramShiftY = m_topMargin + m_frequencyScaleHeight + (m_histogramHeight == 0 ? 0 : m_histogramHeight + m_bottomMargin); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |     if (event->button() == Qt::RightButton) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         QPointF pHis = ep; | 
					
						
							| 
									
										
										
										
											2020-07-06 03:20:08 +02:00
										 |  |  |         bool doUpdate = false; | 
					
						
							| 
									
										
										
										
											2020-07-06 04:08:08 +02:00
										 |  |  |         pHis.rx() = (ep.x()/width() - m_histogramRect.left()) / m_histogramRect.width(); | 
					
						
							|  |  |  |         pHis.ry() = (ep.y()/height() - m_histogramRect.top()) / m_histogramRect.height(); | 
					
						
							| 
									
										
										
										
											2017-11-14 00:06:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-06 03:20:08 +02:00
										 |  |  |         if (event->modifiers() & Qt::ShiftModifier) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if ((pHis.x() >= 0) && (pHis.x() <= 1) && (pHis.y() >= 0) && (pHis.y() <= 1)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 m_histogramMarkers.clear(); | 
					
						
							|  |  |  |                 doUpdate = true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if ((m_histogramMarkers.size() > 0) && (pHis.x() >= 0) && (pHis.x() <= 1) && (pHis.y() >= 0) && (pHis.y() <= 1)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 m_histogramMarkers.pop_back(); | 
					
						
							|  |  |  |                 doUpdate = true; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-11-14 00:06:42 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |         QPointF pWat = ep; | 
					
						
							| 
									
										
										
										
											2020-07-06 04:08:08 +02:00
										 |  |  |         pWat.rx() = (ep.x()/width() - m_waterfallRect.left()) / m_waterfallRect.width(); | 
					
						
							|  |  |  |         pWat.ry() = (ep.y()/height() - m_waterfallRect.top()) / m_waterfallRect.height(); | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-06 03:20:08 +02:00
										 |  |  |         if (event->modifiers() & Qt::ShiftModifier) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if ((pWat.x() >= 0) && (pWat.x() <= 1) && (pWat.y() >= 0) && (pWat.y() <= 1)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 m_waterfallMarkers.clear(); | 
					
						
							|  |  |  |                 doUpdate = true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if ((m_waterfallMarkers.size() > 0) && (pWat.x() >= 0) && (pWat.x() <= 1) && (pWat.y() >= 0) && (pWat.y() <= 1)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 m_waterfallMarkers.pop_back(); | 
					
						
							|  |  |  |                 doUpdate = true; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-07-05 10:03:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-06 03:20:08 +02:00
										 |  |  |         if (doUpdate) { | 
					
						
							|  |  |  |             update(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 	else if (event->button() == Qt::LeftButton) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (event->modifiers() & Qt::ShiftModifier) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QPointF pHis = ep; | 
					
						
							| 
									
										
										
										
											2020-07-06 03:20:08 +02:00
										 |  |  |             bool doUpdate = false; | 
					
						
							| 
									
										
										
										
											2020-07-06 04:08:08 +02:00
										 |  |  |             pHis.rx() = (ep.x()/width() - m_histogramRect.left()) / m_histogramRect.width(); | 
					
						
							|  |  |  |             pHis.ry() = (ep.y()/height() - m_histogramRect.top()) / m_histogramRect.height(); | 
					
						
							|  |  |  |             float frequency = m_frequencyScale.getRangeMin() + pHis.x()*m_frequencyScale.getRange(); | 
					
						
							|  |  |  |             float power = m_powerScale.getRangeMax() - pHis.y()*m_powerScale.getRange(); | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if ((pHis.x() >= 0) && (pHis.x() <= 1) && (pHis.y() >= 0) && (pHis.y() <= 1)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (m_histogramMarkers.size() < 2) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     m_histogramMarkers.push_back(HistogramMarker()); | 
					
						
							|  |  |  |                     m_histogramMarkers.back().m_point = pHis; | 
					
						
							|  |  |  |                     m_histogramMarkers.back().m_frequency = frequency; | 
					
						
							|  |  |  |                     m_histogramMarkers.back().m_frequencyStr = displayScaled( | 
					
						
							|  |  |  |                         frequency, | 
					
						
							|  |  |  |                         'f', | 
					
						
							|  |  |  |                         getPrecision(m_centerFrequency/m_sampleRate), | 
					
						
							|  |  |  |                         false); | 
					
						
							|  |  |  |                     m_histogramMarkers.back().m_power = power; | 
					
						
							|  |  |  |                     m_histogramMarkers.back().m_powerStr = displayScaledF( | 
					
						
							|  |  |  |                         power, | 
					
						
							|  |  |  |                         m_linear ? 'e' : 'f', | 
					
						
							|  |  |  |                         m_linear ? 3 : 1, | 
					
						
							|  |  |  |                         false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     if (m_histogramMarkers.size() > 1) | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         int64_t deltaFrequency = frequency - m_histogramMarkers.at(0).m_frequency; | 
					
						
							|  |  |  |                         m_histogramMarkers.back().m_deltaFrequencyStr = displayScaled( | 
					
						
							|  |  |  |                             deltaFrequency, | 
					
						
							|  |  |  |                             'f', | 
					
						
							|  |  |  |                             getPrecision(deltaFrequency/m_sampleRate), | 
					
						
							|  |  |  |                             true); | 
					
						
							|  |  |  |                         m_histogramMarkers.back().m_deltaPowerStr = displayScaledF( | 
					
						
							|  |  |  |                             power - m_histogramMarkers.at(0).m_power, | 
					
						
							|  |  |  |                             m_linear ? 'e' : 'f', | 
					
						
							|  |  |  |                             m_linear ? 3 : 1, | 
					
						
							|  |  |  |                             false); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2020-07-06 03:20:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     doUpdate = true; | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             QPointF pWat = ep; | 
					
						
							| 
									
										
										
										
											2020-07-06 04:08:08 +02:00
										 |  |  |             pWat.rx() = (ep.x()/width() - m_waterfallRect.left()) / m_waterfallRect.width(); | 
					
						
							|  |  |  |             pWat.ry() = (ep.y()/height() - m_waterfallRect.top()) / m_waterfallRect.height(); | 
					
						
							|  |  |  |             frequency = m_frequencyScale.getRangeMin() + pWat.x()*m_frequencyScale.getRange(); | 
					
						
							|  |  |  |             float time = m_timeScale.getRangeMin() + pWat.y()*m_timeScale.getRange(); | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if ((pWat.x() >= 0) && (pWat.x() <= 1) && (pWat.y() >= 0) && (pWat.y() <= 1)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (m_waterfallMarkers.size() < 2) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     m_waterfallMarkers.push_back(WaterfallMarker()); | 
					
						
							|  |  |  |                     m_waterfallMarkers.back().m_point = pWat; | 
					
						
							|  |  |  |                     m_waterfallMarkers.back().m_frequency = frequency; | 
					
						
							|  |  |  |                     m_waterfallMarkers.back().m_frequencyStr = displayScaled( | 
					
						
							|  |  |  |                         frequency, | 
					
						
							|  |  |  |                         'f', | 
					
						
							|  |  |  |                         getPrecision(m_centerFrequency/m_sampleRate), | 
					
						
							|  |  |  |                         false); | 
					
						
							|  |  |  |                     m_waterfallMarkers.back().m_time = time; | 
					
						
							| 
									
										
										
										
											2020-07-06 10:57:58 +02:00
										 |  |  |                     m_waterfallMarkers.back().m_timeStr = displayScaledF( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |                         time, | 
					
						
							|  |  |  |                         'f', | 
					
						
							|  |  |  |                         3, | 
					
						
							|  |  |  |                         true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     if (m_waterfallMarkers.size() > 1) | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         int64_t deltaFrequency = frequency - m_waterfallMarkers.at(0).m_frequency; | 
					
						
							|  |  |  |                         m_waterfallMarkers.back().m_deltaFrequencyStr = displayScaled( | 
					
						
							|  |  |  |                             deltaFrequency, | 
					
						
							|  |  |  |                             'f', | 
					
						
							|  |  |  |                             getPrecision(deltaFrequency/m_sampleRate), | 
					
						
							|  |  |  |                             true); | 
					
						
							| 
									
										
										
										
											2020-07-06 10:57:58 +02:00
										 |  |  |                         m_waterfallMarkers.back().m_deltaTimeStr = displayScaledF( | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |                             time - m_waterfallMarkers.at(0).m_time, | 
					
						
							|  |  |  |                             'f', | 
					
						
							|  |  |  |                             3, | 
					
						
							|  |  |  |                             true); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2020-07-06 03:20:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     doUpdate = true; | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-07-05 10:03:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-06 03:20:08 +02:00
										 |  |  |             if (doUpdate) { | 
					
						
							|  |  |  |                 update(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if  (m_cursorState == CSSplitter) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             grabMouse(); | 
					
						
							|  |  |  |             m_cursorState = CSSplitterMoving; | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else if (m_cursorState == CSChannel) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             grabMouse(); | 
					
						
							|  |  |  |             m_cursorState = CSChannelMoving; | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else if ((m_cursorState == CSNormal) && (m_channelMarkerStates.size() == 1) && !(event->modifiers() & Qt::ShiftModifier)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             grabMouse(); | 
					
						
							|  |  |  |             setCursor(Qt::SizeHorCursor); | 
					
						
							|  |  |  |             m_cursorState = CSChannelMoving; | 
					
						
							|  |  |  |             m_cursorChannel = 0; | 
					
						
							|  |  |  |             Real freq = m_frequencyScale.getValueFromPos(event->x() - m_leftMarginPixmap.width() - 1) - m_centerFrequency; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (m_channelMarkerStates[m_cursorChannel]->m_channelMarker->getMovable() | 
					
						
							|  |  |  |                 && (m_channelMarkerStates[m_cursorChannel]->m_channelMarker->getSourceOrSinkStream() == m_displaySourceOrSink) | 
					
						
							|  |  |  |                 && m_channelMarkerStates[m_cursorChannel]->m_channelMarker->streamIndexApplies(m_displayStreamIndex)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 m_channelMarkerStates[m_cursorChannel]->m_channelMarker->setCenterFrequencyByCursor(freq); | 
					
						
							|  |  |  |                 channelMarkerChanged(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::mouseReleaseEvent(QMouseEvent*) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	if (m_cursorState == CSSplitterMoving) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		releaseMouse(); | 
					
						
							|  |  |  | 		m_cursorState = CSSplitter; | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-07-06 04:08:08 +02:00
										 |  |  |     else if (m_cursorState == CSChannelMoving) | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		releaseMouse(); | 
					
						
							|  |  |  | 		m_cursorState = CSChannel; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  | void GLSpectrum::wheelEvent(QWheelEvent *event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int mul; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (event->modifiers() & Qt::ShiftModifier) { | 
					
						
							|  |  |  |         mul = 100; | 
					
						
							|  |  |  |     } else if (event->modifiers() & Qt::ControlModifier) { | 
					
						
							|  |  |  |         mul = 10; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         mul = 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (int i = 0; i < m_channelMarkerStates.size(); ++i) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-05-30 18:38:10 +02:00
										 |  |  |         if ((m_channelMarkerStates[i]->m_channelMarker->getSourceOrSinkStream() != m_displaySourceOrSink) | 
					
						
							| 
									
										
										
										
											2019-09-09 00:58:26 +02:00
										 |  |  |             || !m_channelMarkerStates[i]->m_channelMarker->streamIndexApplies(m_displayStreamIndex)) | 
					
						
							| 
									
										
										
										
											2019-05-30 18:38:10 +02:00
										 |  |  |         { | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-12 00:46:31 +02:00
										 |  |  |         if (m_channelMarkerStates[i]->m_rect.contains(event->pos())) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             int freq = m_channelMarkerStates[i]->m_channelMarker->getCenterFrequency(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (event->delta() > 0) { | 
					
						
							|  |  |  |                 freq += 10 * mul; | 
					
						
							|  |  |  |             } else if (event->delta() < 0) { | 
					
						
							|  |  |  |                 freq -= 10 * mul; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // calculate scale relative cursor position for new frequency
 | 
					
						
							|  |  |  |             float x_pos = m_frequencyScale.getPosFromValue(m_centerFrequency + freq); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if ((x_pos >= 0.0) && (x_pos < m_frequencyScale.getSize())) // cursor must be in scale
 | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 m_channelMarkerStates[i]->m_channelMarker->setCenterFrequencyByCursor(freq); | 
					
						
							|  |  |  |                 m_channelMarkerStates[i]->m_channelMarker->setCenterFrequency(freq); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 // cursor follow-up
 | 
					
						
							|  |  |  |                 int xd = x_pos + m_leftMargin; | 
					
						
							|  |  |  |                 QCursor c = cursor(); | 
					
						
							|  |  |  |                 QPoint cp_a = c.pos(); | 
					
						
							|  |  |  |                 QPoint cp_w = mapFromGlobal(cp_a); | 
					
						
							|  |  |  |                 cp_w.setX(xd); | 
					
						
							|  |  |  |                 cp_a = mapToGlobal(cp_w); | 
					
						
							|  |  |  |                 c.setPos(cp_a); | 
					
						
							|  |  |  |                 setCursor(c); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | void GLSpectrum::enterEvent(QEvent* event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	m_mouseInside = true; | 
					
						
							|  |  |  | 	update(); | 
					
						
							| 
									
										
										
										
											2016-03-05 21:54:24 +01:00
										 |  |  | 	QGLWidget::enterEvent(event); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::leaveEvent(QEvent* event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	m_mouseInside = false; | 
					
						
							|  |  |  | 	update(); | 
					
						
							| 
									
										
										
										
											2016-03-05 21:54:24 +01:00
										 |  |  | 	QGLWidget::enterEvent(event); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::tick() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	if (m_displayChanged) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 		m_displayChanged = false; | 
					
						
							|  |  |  | 		update(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::channelMarkerChanged() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-12 10:35:20 +02:00
										 |  |  |     QMutexLocker mutexLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2014-05-18 16:52:39 +01:00
										 |  |  | 	m_changesPending = true; | 
					
						
							|  |  |  | 	update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::channelMarkerDestroyed(QObject* object) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	removeChannelMarker((ChannelMarker*)object); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-07-24 01:30:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::setWaterfallShare(Real waterfallShare) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-12 10:35:20 +02:00
										 |  |  |     QMutexLocker mutexLocker(&m_mutex); | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (waterfallShare < 0.1f) { | 
					
						
							| 
									
										
										
										
											2015-07-24 01:30:00 +02:00
										 |  |  | 		m_waterfallShare = 0.1f; | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 	} else if (waterfallShare > 0.8f) { | 
					
						
							| 
									
										
										
										
											2015-07-24 01:30:00 +02:00
										 |  |  | 		m_waterfallShare = 0.8f; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		m_waterfallShare = waterfallShare; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     m_changesPending = true; | 
					
						
							| 
									
										
										
										
											2015-07-24 01:30:00 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-08-01 03:33:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::connectTimer(const QTimer& timer) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-08-09 10:33:04 +02:00
										 |  |  | 	qDebug() << "GLSpectrum::connectTimer"; | 
					
						
							| 
									
										
										
										
											2015-08-01 03:33:07 +02:00
										 |  |  | 	disconnect(&m_timer, SIGNAL(timeout()), this, SLOT(tick())); | 
					
						
							|  |  |  | 	connect(&timer, SIGNAL(timeout()), this, SLOT(tick())); | 
					
						
							| 
									
										
										
										
											2015-08-01 04:07:09 +02:00
										 |  |  | 	m_timer.stop(); | 
					
						
							| 
									
										
										
										
											2015-08-01 03:33:07 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-03-02 03:09:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::cleanup() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-03-06 12:15:40 +01:00
										 |  |  | 	//makeCurrent();
 | 
					
						
							| 
									
										
										
										
											2016-03-03 01:09:55 +01:00
										 |  |  | 	m_glShaderSimple.cleanup(); | 
					
						
							| 
									
										
										
										
											2016-03-06 09:33:10 +01:00
										 |  |  | 	m_glShaderFrequencyScale.cleanup(); | 
					
						
							|  |  |  | 	m_glShaderHistogram.cleanup(); | 
					
						
							|  |  |  | 	m_glShaderLeftScale.cleanup(); | 
					
						
							|  |  |  | 	m_glShaderWaterfall.cleanup(); | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |     m_glShaderTextOverlay.cleanup(); | 
					
						
							| 
									
										
										
										
											2016-03-06 12:15:40 +01:00
										 |  |  |     //doneCurrent();
 | 
					
						
							| 
									
										
										
										
											2016-03-02 03:09:50 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | QString GLSpectrum::displayScaled(int64_t value, char type, int precision, bool showMult) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int64_t posValue = (value < 0) ? -value : value; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (posValue < 1000) { | 
					
						
							|  |  |  |         return tr("%1").arg(QString::number(value, type, precision)); | 
					
						
							|  |  |  |     } else if (posValue < 1000000) { | 
					
						
							|  |  |  |         return tr("%1%2").arg(QString::number(value / 1000.0, type, precision)).arg(showMult ? "k" : ""); | 
					
						
							|  |  |  |     } else if (posValue < 1000000000) { | 
					
						
							|  |  |  |         return tr("%1%2").arg(QString::number(value / 1000000.0, type, precision)).arg(showMult ? "M" : ""); | 
					
						
							|  |  |  |     } else if (posValue < 1000000000000) { | 
					
						
							|  |  |  |         return tr("%1%2").arg(QString::number(value / 1000000000.0, type, precision)).arg(showMult ? "G" : ""); | 
					
						
							| 
									
										
										
										
											2020-08-02 19:52:17 +02:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         return tr("%1").arg(QString::number(value, 'e', precision)); | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QString GLSpectrum::displayScaledF(float value, char type, int precision, bool showMult) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     float posValue = (value < 0) ? -value : value; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-06 10:57:58 +02:00
										 |  |  |     if (posValue == 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return tr("%1").arg(QString::number(value, 'f', precision)); | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-07-06 10:57:58 +02:00
										 |  |  |     else if (posValue < 1) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (posValue > 0.001) { | 
					
						
							|  |  |  |             return tr("%1%2").arg(QString::number(value * 1000.0, type, precision)).arg(showMult ? "m" : ""); | 
					
						
							|  |  |  |         } else if (posValue > 0.000001) { | 
					
						
							|  |  |  |             return tr("%1%2").arg(QString::number(value * 1000000.0, type, precision)).arg(showMult ? "u" : ""); | 
					
						
							|  |  |  |         } else if (posValue > 1e-9) { | 
					
						
							|  |  |  |             return tr("%1%2").arg(QString::number(value * 1e9, type, precision)).arg(showMult ? "n" : ""); | 
					
						
							|  |  |  |         } else if (posValue > 1e-12) { | 
					
						
							|  |  |  |             return tr("%1%2").arg(QString::number(value * 1e12, type, precision)).arg(showMult ? "p" : ""); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return tr("%1").arg(QString::number(value, 'e', precision)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (posValue < 1000) { | 
					
						
							|  |  |  |             return tr("%1").arg(QString::number(value, type, precision)); | 
					
						
							|  |  |  |         } else if (posValue < 1000000) { | 
					
						
							|  |  |  |             return tr("%1%2").arg(QString::number(value / 1000.0, type, precision)).arg(showMult ? "k" : ""); | 
					
						
							|  |  |  |         } else if (posValue < 1000000000) { | 
					
						
							|  |  |  |             return tr("%1%2").arg(QString::number(value / 1000000.0, type, precision)).arg(showMult ? "M" : ""); | 
					
						
							|  |  |  |         } else if (posValue < 1000000000000) { | 
					
						
							|  |  |  |             return tr("%1%2").arg(QString::number(value / 1000000000.0, type, precision)).arg(showMult ? "G" : ""); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return tr("%1").arg(QString::number(value, 'e', precision)); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-07-05 03:25:44 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int GLSpectrum::getPrecision(int value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int posValue = (value < 0) ? -value : value; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (posValue < 1000) { | 
					
						
							|  |  |  |         return 3; | 
					
						
							|  |  |  |     } else if (posValue < 10000) { | 
					
						
							|  |  |  |         return 4; | 
					
						
							|  |  |  |     } else if (posValue < 100000) { | 
					
						
							|  |  |  |         return 5; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         return 6; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void GLSpectrum::drawTextOverlay( | 
					
						
							|  |  |  |     const QString &text, | 
					
						
							|  |  |  |     const QColor &color, | 
					
						
							|  |  |  |     const QFont& font, | 
					
						
							|  |  |  |     float shiftX, | 
					
						
							|  |  |  |     float shiftY, | 
					
						
							|  |  |  |     bool leftHalf, | 
					
						
							|  |  |  |     bool topHalf, | 
					
						
							|  |  |  |     const QRectF &glRect) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (text.isEmpty()) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QFontMetricsF metrics(font); | 
					
						
							|  |  |  |     QRectF textRect = metrics.boundingRect(text); | 
					
						
							|  |  |  |     QRectF overlayRect(0, 0, textRect.width() * 1.05f + 4.0f, textRect.height()); | 
					
						
							|  |  |  |     QPixmap channelOverlayPixmap = QPixmap(overlayRect.width(), overlayRect.height()); | 
					
						
							|  |  |  |     channelOverlayPixmap.fill(Qt::transparent); | 
					
						
							|  |  |  |     QPainter painter(&channelOverlayPixmap); | 
					
						
							|  |  |  |     painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing, false); | 
					
						
							|  |  |  |     painter.fillRect(overlayRect, QColor(0, 0, 0, 0x80)); | 
					
						
							|  |  |  |     QColor textColor(color); | 
					
						
							|  |  |  |     textColor.setAlpha(0xC0); | 
					
						
							|  |  |  |     painter.setPen(textColor); | 
					
						
							|  |  |  |     painter.setFont(font); | 
					
						
							|  |  |  |     painter.drawText(QPointF(2.0f, overlayRect.height() - 4.0f), text); | 
					
						
							|  |  |  |     painter.end(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_glShaderTextOverlay.initTexture(channelOverlayPixmap.toImage()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         GLfloat vtx1[] = { | 
					
						
							|  |  |  |             0, 1, | 
					
						
							|  |  |  |             1, 1, | 
					
						
							|  |  |  |             1, 0, | 
					
						
							|  |  |  |             0, 0}; | 
					
						
							|  |  |  |         GLfloat tex1[] = { | 
					
						
							|  |  |  |             0, 1, | 
					
						
							|  |  |  |             1, 1, | 
					
						
							|  |  |  |             1, 0, | 
					
						
							|  |  |  |             0, 0}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // float shiftX = glRect.width() - ((overlayRect.width() + 4.0f) / width());
 | 
					
						
							|  |  |  |         // float shiftY = 4.0f / height();
 | 
					
						
							|  |  |  |         float rectX = glRect.x() + shiftX - (leftHalf ? 0 : (overlayRect.width()+1)/width()); | 
					
						
							|  |  |  |         float rectY = glRect.y() + shiftY + (4.0f / height()) - (topHalf ? 0 : (overlayRect.height()+5)/height()); | 
					
						
							|  |  |  |         float rectW = overlayRect.width() / (float) width(); | 
					
						
							|  |  |  |         float rectH = overlayRect.height() / (float) height(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         QMatrix4x4 mat; | 
					
						
							|  |  |  |         mat.setToIdentity(); | 
					
						
							|  |  |  |         mat.translate(-1.0f + 2.0f * rectX, 1.0f - 2.0f * rectY); | 
					
						
							|  |  |  |         mat.scale(2.0f * rectW, -2.0f * rectH); | 
					
						
							|  |  |  |         m_glShaderTextOverlay.drawSurface(mat, tex1, vtx1, 4); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |