# HG changeset patch # User Chris Cannam # Date 1453737146 0 # Node ID 3bce4c45b681c1b0f02b1e417ef0e422eefc920c # Parent 74755fa6ea9e12df2161de1aa7e5c51eee3022ba Rearrange cache update calculations so as to use the actual painted width returned by paint functions (though they only ever return the same width as requested, at this point) diff -r 74755fa6ea9e -r 3bce4c45b681 layer/SpectrogramLayer.cpp --- a/layer/SpectrogramLayer.cpp Fri Jan 22 18:12:41 2016 +0000 +++ b/layer/SpectrogramLayer.cpp Mon Jan 25 15:52:26 2016 +0000 @@ -1954,19 +1954,6 @@ x1 = x0; // it's all valid, paint nothing } } - - cache.validArea = QRect - (std::min(vx0, x0), cache.validArea.y(), - std::max(vx1 - std::min(vx0, x0), - x1 - std::min(vx0, x0)), - cache.validArea.height()); - -#ifdef DEBUG_SPECTROGRAM_REPAINT - cerr << "Valid area becomes " << cache.validArea.x() - << ", " << cache.validArea.y() << ", " - << cache.validArea.width() << "x" - << cache.validArea.height() << endl; -#endif } else { if (x1 > x0 + paintBlockWidth) { @@ -1981,20 +1968,9 @@ x1 = x0 + paintBlockWidth; } } -#ifdef DEBUG_SPECTROGRAM_REPAINT - cerr << "Valid area becomes " << x0 << ", 0, " << (x1-x0) - << "x" << h << endl; -#endif - cache.validArea = QRect(x0, 0, x1 - x0, h); } -/* - if (xPixelRatio != 1.f) { - x0 = int((int(x0 / xPixelRatio) - 4) * xPixelRatio + 0.0001); - x1 = int((int(x1 / xPixelRatio) + 4) * xPixelRatio + 0.0001); - } -*/ - int w = x1 - x0; + int repaintWidth = x1 - x0; #ifdef DEBUG_SPECTROGRAM_REPAINT cerr << "x0 " << x0 << ", x1 " << x1 << ", w " << w << ", h " << h << endl; @@ -2064,8 +2040,8 @@ cerr << ((double(v->getFrameForX(1) - v->getFrameForX(0))) / increment) << " bin(s) per pixel" << endl; #endif - if (w == 0) { - SVDEBUG << "*** NOTE: w == 0" << endl; + if (repaintWidth == 0) { + SVDEBUG << "*** NOTE: repaintWidth == 0" << endl; } Profiler outerprof("SpectrogramLayer::paint: all cols"); @@ -2097,14 +2073,20 @@ sv_frame_t f = v->getFrameForX(x); if ((f / increment) * increment == f) { if (leftCropFrame == -1) leftCropFrame = f; - else if (x < x0 - 2) { leftBoundaryFrame = f; break; } + else if (x < x0 - 2) { + leftBoundaryFrame = f; + break; + } } } - for (int x = x0 + w; ; ++x) { + for (int x = x0 + repaintWidth; ; ++x) { sv_frame_t f = v->getFrameForX(x); if ((f / increment) * increment == f) { if (rightCropFrame == -1) rightCropFrame = f; - else if (x > x0 + w + 2) { rightBoundaryFrame = f; break; } + else if (x > x0 + repaintWidth + 2) { + rightBoundaryFrame = f; + break; + } } } #ifdef DEBUG_SPECTROGRAM_REPAINT @@ -2116,7 +2098,7 @@ } else { - bufwid = w; + bufwid = repaintWidth; } vector binforx(bufwid); @@ -2153,6 +2135,7 @@ } m_drawBuffer.fill(0); + int attainedBufwid = bufwid; if (m_binDisplay != PeakFrequencies) { @@ -2165,18 +2148,27 @@ } } - paintDrawBuffer(v, bufwid, h, binforx, binfory, usePeaksCache, - overallMag, overallMagChanged); + attainedBufwid = + paintDrawBuffer(v, bufwid, h, binforx, binfory, usePeaksCache, + overallMag, overallMagChanged); } else { - paintDrawBufferPeakFrequencies(v, bufwid, h, binforx, - minbin, maxbin, - displayMinFreq, displayMaxFreq, - logarithmic, - overallMag, overallMagChanged); + attainedBufwid = + paintDrawBufferPeakFrequencies(v, bufwid, h, binforx, + minbin, maxbin, + displayMinFreq, displayMaxFreq, + logarithmic, + overallMag, overallMagChanged); } + int failedToRepaint = bufwid - attainedBufwid; + if (failedToRepaint < 0) { + cerr << "WARNING: failedToRepaint < 0 (= " << failedToRepaint << ")" + << endl; + failedToRepaint = 0; + } + if (overallMagChanged) { m_viewMags[v] = overallMag; #ifdef DEBUG_SPECTROGRAM_REPAINT @@ -2196,11 +2188,12 @@ cache.image = QImage(v->getPaintWidth(), h, QImage::Format_ARGB32_Premultiplied); } - if (w > 0) { + if (repaintWidth > 0) { + #ifdef DEBUG_SPECTROGRAM_REPAINT - cerr << "Painting " << w << "x" << h + cerr << "Painting " << repaintWidth << "x" << h << " from draw buffer at " << 0 << "," << 0 - << " to " << w << "x" << h << " on cache at " + << " to " << repaintWidth << "x" << h << " on cache at " << x0 << "," << 0 << endl; #endif @@ -2234,15 +2227,48 @@ scaled, QRect(scaledLeftCrop - scaledLeft, 0, scaledRightCrop - scaledLeftCrop, h)); + } else { - cachePainter.drawImage(QRect(x0, 0, w, h), + + cachePainter.drawImage(QRect(x0, 0, repaintWidth, h), m_drawBuffer, - QRect(0, 0, w, h)); + QRect(0, 0, repaintWidth, h)); } cachePainter.end(); } + // update cache valid area based on painted area + if (cache.validArea.width() > 0) { + + int left = std::min(cache.validArea.x(), x0); + + int wid = std::max(cache.validArea.x() + cache.validArea.width() - left, + x1 - left); + + wid = wid - failedToRepaint; + if (wid < 0) wid = 0; + + cache.validArea = QRect + (left, cache.validArea.y(), wid, cache.validArea.height()); + +#ifdef DEBUG_SPECTROGRAM_REPAINT + cerr << "Valid area becomes " << cache.validArea.x() + << ", " << cache.validArea.y() << ", " + << cache.validArea.width() << "x" + << cache.validArea.height() << endl; +#endif + + } else { + + cache.validArea = QRect(x0, 0, x1 - x0, h); + +#ifdef DEBUG_SPECTROGRAM_REPAINT + cerr << "Valid area becomes " << x0 << ", 0, " << (x1-x0) + << "x" << h << endl; +#endif + } + QRect pr = rect & cache.validArea; #ifdef DEBUG_SPECTROGRAM_REPAINT @@ -2279,11 +2305,12 @@ cache.validArea.width()) << ")" << endl; #endif - v->getView()->update(cache.validArea.x() + cache.validArea.width(), - 0, - cache.image.width() - (cache.validArea.x() + - cache.validArea.width()), - h); + v->getView()->update + (cache.validArea.x() + cache.validArea.width(), + 0, + cache.image.width() - (cache.validArea.x() + + cache.validArea.width()), + h); } } else { // overallMagChanged @@ -2307,7 +2334,7 @@ } } -void +int SpectrogramLayer::paintDrawBufferPeakFrequencies(LayerGeometryProvider *v, int w, int h, @@ -2329,7 +2356,7 @@ if (maxbin < 0) maxbin = minbin+1; FFTModel *fft = getFFTModel(v); - if (!fft) return; + if (!fft) return 0; FFTModel::PeakSet peakfreqs; @@ -2422,9 +2449,11 @@ } } } + + return w; } -void +int SpectrogramLayer::paintDrawBuffer(LayerGeometryProvider *v, int w, int h, @@ -2460,7 +2489,7 @@ sourceModel = fft = getFFTModel(v); } - if (!sourceModel) return; + if (!sourceModel) return 0; bool interpolate = false; Preferences::SpectrogramSmoothing smoothing = @@ -2656,6 +2685,8 @@ m_drawBuffer.setPixel(x, h-y-1, peakpix); } } + + return w; } void diff -r 74755fa6ea9e -r 3bce4c45b681 layer/SpectrogramLayer.h --- a/layer/SpectrogramLayer.h Fri Jan 22 18:12:41 2016 +0000 +++ b/layer/SpectrogramLayer.h Mon Jan 25 15:52:26 2016 +0000 @@ -418,21 +418,21 @@ mutable std::vector m_columnMags; void invalidateMagnitudes(); bool updateViewMagnitudes(LayerGeometryProvider *v) const; - void paintDrawBuffer(LayerGeometryProvider *v, int w, int h, - const std::vector &binforx, - const std::vector &binfory, - bool usePeaksCache, - MagnitudeRange &overallMag, - bool &overallMagChanged) const; - void paintDrawBufferPeakFrequencies(LayerGeometryProvider *v, int w, int h, - const std::vector &binforx, - int minbin, - int maxbin, - double displayMinFreq, - double displayMaxFreq, - bool logarithmic, - MagnitudeRange &overallMag, - bool &overallMagChanged) const; + int paintDrawBuffer(LayerGeometryProvider *v, int w, int h, + const std::vector &binforx, + const std::vector &binfory, + bool usePeaksCache, + MagnitudeRange &overallMag, + bool &overallMagChanged) const; + int paintDrawBufferPeakFrequencies(LayerGeometryProvider *v, int w, int h, + const std::vector &binforx, + int minbin, + int maxbin, + double displayMinFreq, + double displayMaxFreq, + bool logarithmic, + MagnitudeRange &overallMag, + bool &overallMagChanged) const; virtual void updateMeasureRectYCoords(LayerGeometryProvider *v, const MeasureRect &r) const; virtual void setMeasureRectYCoord(LayerGeometryProvider *v, MeasureRect &r, bool start, int y) const;