diff --git a/plotview.cpp b/plotview.cpp index 9f7abe4..fb66335 100644 --- a/plotview.cpp +++ b/plotview.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -238,6 +239,9 @@ void PlotView::tunerMoved() plotFilter->set_center_freq(centre); plotFilter->set_taps(lp_taps); + // TODO: for invalidating traceplot cache, this shouldn't really go here + QPixmapCache::clear(); + viewport()->update(); } diff --git a/traceplot.cpp b/traceplot.cpp index 42af4bb..265c76f 100644 --- a/traceplot.cpp +++ b/traceplot.cpp @@ -17,6 +17,8 @@ * along with this program. If not, see . */ +#include +#include #include "samplesource.h" #include "traceplot.h" @@ -33,7 +35,7 @@ void TracePlot::paintMid(QPainter &painter, QRect &rect, range_t sampleRa int xOffset = tileOffset / samplesPerColumn; // Number of columns to skip from first image tile // Paint first (possibly partial) tile - painter.drawImage( + painter.drawPixmap( QRect(rect.x(), rect.y(), tileWidth - xOffset, height()), getTile(tileID++, samplesPerTile), QRect(xOffset, 0, tileWidth - xOffset, height()) @@ -41,16 +43,25 @@ void TracePlot::paintMid(QPainter &painter, QRect &rect, range_t sampleRa // Paint remaining tiles for (int x = tileWidth - xOffset; x < rect.right(); x += tileWidth) { - painter.drawImage( + painter.drawPixmap( QRect(x, rect.y(), tileWidth, height()), getTile(tileID++, samplesPerTile) ); } } -QImage TracePlot::getTile(off_t tileID, off_t sampleCount) +QPixmap TracePlot::getTile(off_t tileID, off_t sampleCount) { - return drawTile(QRect(0, 0, tileWidth, height()), {tileID * sampleCount, (tileID + 1) * sampleCount}); + QPixmap pixmap; + QString key; + QTextStream(&key) << "traceplot_" << this << "_" << tileID << "_" << sampleCount; + if (QPixmapCache::find(key, &pixmap)) + return pixmap; + + auto image = drawTile(QRect(0, 0, tileWidth, height()), {tileID * sampleCount, (tileID + 1) * sampleCount}); + pixmap = QPixmap::fromImage(image); + QPixmapCache::insert(key, pixmap); + return pixmap; } QImage TracePlot::drawTile(const QRect &rect, range_t sampleRange) diff --git a/traceplot.h b/traceplot.h index 1ea5e33..2b1bd6d 100644 --- a/traceplot.h +++ b/traceplot.h @@ -37,7 +37,7 @@ private: const int tileWidth = 1000; std::shared_ptr sampleSource; - QImage getTile(off_t tileID, off_t sampleCount); + QPixmap getTile(off_t tileID, off_t sampleCount); QImage drawTile(const QRect &rect, range_t sampleRange); void plotTrace(QPainter &painter, const QRect &rect, float *samples, off_t count, int step); };