From c9fd26f661a79402a2ef05ccc3a25888f815595d Mon Sep 17 00:00:00 2001 From: f4exb Date: Thu, 1 Mar 2018 02:19:52 +0100 Subject: [PATCH] GLSpectrum: suppress VLAs templatized version --- sdrbase/util/incrementalarray.h | 59 ++++++++++++++++++++++++ sdrgui/gui/glspectrum.cpp | 20 ++++---- sdrgui/gui/glspectrum.h | 82 ++------------------------------- 3 files changed, 74 insertions(+), 87 deletions(-) create mode 100644 sdrbase/util/incrementalarray.h diff --git a/sdrbase/util/incrementalarray.h b/sdrbase/util/incrementalarray.h new file mode 100644 index 000000000..ffe142a9e --- /dev/null +++ b/sdrbase/util/incrementalarray.h @@ -0,0 +1,59 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2016 Edouard Griffiths, F4EXB // +// // +// 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 // +// // +// 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 . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef SDRBASE_UTIL_INCREMENTALARRAY_H_ +#define SDRBASE_UTIL_INCREMENTALARRAY_H_ + +#include + +template +class IncrementalArray +{ +public: + T *m_array; + + IncrementalArray(); + ~IncrementalArray(); + + void allocate(uint32_t size); + +private: + uint32_t m_size; +}; + +template +IncrementalArray::IncrementalArray() : + m_array(0), + m_size(0) +{ +} + +template +IncrementalArray::~IncrementalArray() +{ + if (m_array) { delete[] m_array; } +} + +template +void IncrementalArray::allocate(uint32_t size) +{ + if (size <= m_size) { return; } + if (m_array) { delete[] m_array; } + m_array = new T[size]; + m_size = size; +} + +#endif /* SDRBASE_UTIL_INCREMENTALARRAY_H_ */ diff --git a/sdrgui/gui/glspectrum.cpp b/sdrgui/gui/glspectrum.cpp index 44e80184f..9a511628f 100644 --- a/sdrgui/gui/glspectrum.cpp +++ b/sdrgui/gui/glspectrum.cpp @@ -813,7 +813,7 @@ void GLSpectrum::paintGL() } { //GLfloat q3[2*m_fftSize]; - GLfloat *q3 = m_shaderArrays.m_q3FFT; + GLfloat *q3 = m_q3FFT.m_array; Real bottom = -m_powerRange; for(int i = 0; i < m_fftSize; i++) { @@ -837,7 +837,7 @@ void GLSpectrum::paintGL() { Real bottom = -m_powerRange; //GLfloat q3[2*m_fftSize]; - GLfloat *q3 = m_shaderArrays.m_q3FFT; + GLfloat *q3 = m_q3FFT.m_array; for(int i = 0; i < m_fftSize; i++) { Real v = (*m_currentSpectrum)[i] - m_referenceLevel; @@ -863,7 +863,7 @@ void GLSpectrum::paintGL() { //GLfloat q3[4*tickList->count()]; - GLfloat *q3 = m_shaderArrays.m_q3TickTime; + GLfloat *q3 = m_q3TickTime.m_array; int effectiveTicks = 0; for (int i= 0; i < tickList->count(); i++) @@ -891,7 +891,7 @@ void GLSpectrum::paintGL() { //GLfloat q3[4*tickList->count()]; - GLfloat *q3 = m_shaderArrays.m_q3TickFrequency; + GLfloat *q3 = m_q3TickFrequency.m_array; int effectiveTicks = 0; for (int i= 0; i < tickList->count(); i++) @@ -925,7 +925,7 @@ void GLSpectrum::paintGL() { //GLfloat q3[4*tickList->count()]; - GLfloat *q3 = m_shaderArrays.m_q3TickPower; + GLfloat *q3 = m_q3TickPower.m_array; int effectiveTicks = 0; for(int i= 0; i < tickList->count(); i++) @@ -953,7 +953,7 @@ void GLSpectrum::paintGL() { //GLfloat q3[4*tickList->count()]; - GLfloat *q3 = m_shaderArrays.m_q3TickFrequency; + GLfloat *q3 = m_q3TickFrequency.m_array; int effectiveTicks = 0; for(int i= 0; i < tickList->count(); i++) @@ -1579,7 +1579,7 @@ void GLSpectrum::applyChanges() m_histogramHoldoff = new quint8[100 * m_fftSize]; memset(m_histogramHoldoff, 0x07, 100 * m_fftSize); - m_shaderArrays.allocFFT(2*m_fftSize); + m_q3FFT.allocate(2*m_fftSize); } if(fftSizeChanged || windowSizeChanged) @@ -1588,9 +1588,9 @@ void GLSpectrum::applyChanges() m_waterfallTexturePos = 0; } - m_shaderArrays.allocTickTime(4*m_timeScale.getTickList().count()); - m_shaderArrays.allocTickFrequency(4*m_frequencyScale.getTickList().count()); - m_shaderArrays.allocTickPower(4*m_powerScale.getTickList().count()); + m_q3TickTime.allocate(4*m_timeScale.getTickList().count()); + m_q3TickFrequency.allocate(4*m_frequencyScale.getTickList().count()); + m_q3TickPower.allocate(4*m_powerScale.getTickList().count()); } void GLSpectrum::mouseMoveEvent(QMouseEvent* event) diff --git a/sdrgui/gui/glspectrum.h b/sdrgui/gui/glspectrum.h index dcc4d8c65..f00da8249 100644 --- a/sdrgui/gui/glspectrum.h +++ b/sdrgui/gui/glspectrum.h @@ -33,6 +33,7 @@ #include "gui/glshadertextured.h" #include "dsp/channelmarker.h" #include "util/export.h" +#include "util/incrementalarray.h" class QOpenGLShaderProgram; @@ -72,82 +73,6 @@ public: void connectTimer(const QTimer& timer); private: - struct ShaderArrays - { - GLfloat *m_q3TickTime; - GLfloat *m_q3TickFrequency; - GLfloat *m_q3TickPower; - GLfloat *m_q3FFT; - - uint32_t m_q3TickTimeSize; - uint32_t m_q3TickTimeFrequencySize; - uint32_t m_q3TickPowerSize; - uint32_t m_q3FFTSize; - - ShaderArrays() : - m_q3TickTime(0), - m_q3TickFrequency(0), - m_q3TickPower(0), - m_q3FFT(0), - m_q3TickTimeSize(0), - m_q3TickTimeFrequencySize(0), - m_q3TickPowerSize(0), - m_q3FFTSize(0) - {} - - ~ShaderArrays() - { - if (m_q3TickTime) { delete[] m_q3TickTime; } - if (m_q3TickFrequency) { delete[] m_q3TickFrequency; } - if (m_q3TickPower) { delete[] m_q3TickPower; } - if (m_q3FFT) { delete[] m_q3FFT; } - } - - void allocTickTime(uint32_t size) - { - if (size <= m_q3TickTimeSize) { - return; - } - - if (m_q3TickTime) { delete[] m_q3TickTime; } - m_q3TickTime = new GLfloat[size]; - m_q3TickTimeSize = size; - } - - void allocTickFrequency(uint32_t size) - { - if (size <= m_q3TickTimeFrequencySize) { - return; - } - - if (m_q3TickFrequency) { delete[] m_q3TickFrequency; } - m_q3TickFrequency = new GLfloat[size]; - m_q3TickTimeFrequencySize = size; - } - - void allocTickPower(uint32_t size) - { - if (size <= m_q3TickPowerSize) { - return; - } - - if (m_q3TickPower) { delete[] m_q3TickPower; } - m_q3TickPower = new GLfloat[size]; - m_q3TickPowerSize = size; - } - - void allocFFT(uint32_t size) - { - if (size <= m_q3FFTSize) { - return; - } - - if (m_q3FFT) { delete[] m_q3FFT; } - m_q3FFT = new GLfloat[size]; - m_q3FFTSize = size; - } - }; - struct ChannelMarkerState { ChannelMarker* m_channelMarker; QMatrix4x4 m_glMatrixWaterfall; @@ -240,7 +165,10 @@ private: GLShaderTextured m_glShaderHistogram; int m_matrixLoc; int m_colorLoc; - ShaderArrays m_shaderArrays; + IncrementalArray m_q3TickTime; + IncrementalArray m_q3TickFrequency; + IncrementalArray m_q3TickPower; + IncrementalArray m_q3FFT; static const int m_waterfallBufferHeight = 256;