diff --git a/src/panel/WaterfallPanel.cpp b/src/panel/WaterfallPanel.cpp index 5de721a..4720b4f 100644 --- a/src/panel/WaterfallPanel.cpp +++ b/src/panel/WaterfallPanel.cpp @@ -91,15 +91,46 @@ void WaterfallPanel::step() { waterfall_slice[i] = (unsigned char) floor(wv * 255.0); } + int newBufSize = (half_fft_size*lines_buffered+half_fft_size); + if (lineBuffer[j].size() < newBufSize) { + lineBuffer[j].resize(newBufSize); + rLineBuffer[j].resize(newBufSize); + } + memcpy(&(lineBuffer[j][half_fft_size*lines_buffered]), waterfall_slice, sizeof(unsigned char) * half_fft_size); + } + lines_buffered++; + } +} + +void WaterfallPanel::update() { + int half_fft_size = fft_size / 2; + + for (int i = 0; i < lines_buffered; i++) { + for (int j = 0; j < 2; j++) { + memcpy(&(rLineBuffer[j][i*half_fft_size]), + &(lineBuffer[j][((lines_buffered-1)*half_fft_size)-(i*half_fft_size)]), sizeof(unsigned char) * half_fft_size); + } + } + + int run_ofs = 0; + while (lines_buffered) { + int run_lines = lines_buffered; + if (run_lines > waterfall_ofs[0]) { + run_lines = waterfall_ofs[0]; + } + for (int j = 0; j < 2; j++) { glBindTexture(GL_TEXTURE_2D, waterfall[j]); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, waterfall_ofs[j], half_fft_size, 1, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, (GLvoid *) waterfall_slice); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, waterfall_ofs[j]-run_lines, half_fft_size, run_lines, + GL_COLOR_INDEX, GL_UNSIGNED_BYTE, (GLvoid *) &(rLineBuffer[j][run_ofs])); + + waterfall_ofs[j]-=run_lines; if (waterfall_ofs[j] == 0) { waterfall_ofs[j] = waterfall_lines; } - - waterfall_ofs[j]--; } + run_ofs += run_lines*half_fft_size; + lines_buffered-=run_lines; } } diff --git a/src/panel/WaterfallPanel.h b/src/panel/WaterfallPanel.h index 65c664a..faa566a 100644 --- a/src/panel/WaterfallPanel.h +++ b/src/panel/WaterfallPanel.h @@ -9,7 +9,8 @@ public: void refreshTheme(); void setPoints(std::vector &points); void step(); - + void update(); + protected: void drawPanelContents(); @@ -21,6 +22,9 @@ private: int fft_size; int waterfall_lines; unsigned char *waterfall_slice; + std::vector lineBuffer[2]; + std::vector rLineBuffer[2]; + int lines_buffered; ColorTheme *activeTheme; }; diff --git a/src/visual/WaterfallCanvas.cpp b/src/visual/WaterfallCanvas.cpp index f64845a..5b5cbe8 100644 --- a/src/visual/WaterfallCanvas.cpp +++ b/src/visual/WaterfallCanvas.cpp @@ -100,6 +100,7 @@ void WaterfallCanvas::processInputQueue() { break; } } + waterfallPanel.update(); tex_update.unlock(); } }}