diff layer/SpectrogramLayer.cpp @ 1031:55ac6ac1982e spectrogram-minor-refactor

Further fixes to the scrollable cache logic
author Chris Cannam
date Fri, 29 Jan 2016 18:51:05 +0000
parents 0be17aafa935
children 6f7a471826d1
line wrap: on
line diff
--- a/layer/SpectrogramLayer.cpp	Fri Jan 29 15:08:01 2016 +0000
+++ b/layer/SpectrogramLayer.cpp	Fri Jan 29 18:51:05 2016 +0000
@@ -1674,7 +1674,18 @@
 
     if (cache.getZoomLevel() != zoomLevel ||
         cache.getSize() != v->getPaintSize()) {
+#ifdef DEBUG_SPECTROGRAM_REPAINT
+        cerr << "SpectrogramLayer: resizing image cache from "
+             << cache.getSize().width() << "x" << cache.getSize().height()
+             << " to "
+             << v->getPaintSize().width() << "x" << v->getPaintSize().height()
+             << " and updating zoom level from " << cache.getZoomLevel()
+             << " to " << zoomLevel
+             << endl;
+#endif
         cache.resize(v->getPaintSize());
+        cache.setZoomLevel(zoomLevel);
+        cache.setStartFrame(startFrame);
     }
     
     if (cache.isValid()) {
@@ -1706,7 +1717,7 @@
             cache.scrollTo(startFrame);
             
 #ifdef DEBUG_SPECTROGRAM_REPAINT
-            cerr << "SpectrogramLayer: cache valid now from "
+            cerr << "SpectrogramLayer: after scrolling, cache valid from "
                  << cache.getValidLeft() << " width " << cache.getValidWidth()
                  << endl;
 #endif
@@ -1735,7 +1746,7 @@
         int left = x0;
         int width = x1 - x0;
         bool isLeftOfValidArea = false;
-        cache.resizeToTouchValidArea(left, width, isLeftOfValidArea);
+        cache.adjustToTouchValidArea(left, width, isLeftOfValidArea);
         x0 = left;
         x1 = x0 + width;
 
@@ -1895,7 +1906,7 @@
                 binforx[x] = -1; //???
             }
         }
-        if (m_drawBuffer.width() < bufwid || m_drawBuffer.height() < h) {
+        if (m_drawBuffer.width() < bufwid || m_drawBuffer.height() != h) {
             m_drawBuffer = QImage(bufwid, h, QImage::Format_Indexed8);
         }
         usePeaksCache = (increment * 8) < zoomLevel;
@@ -1939,17 +1950,33 @@
     }
 
     int failedToRepaint = bufwid - attainedBufwid;
+
+    int paintedLeft = x0;
+    int paintedWidth = x1 - x0;
+    
     if (failedToRepaint > 0) {
+
 #ifdef DEBUG_SPECTROGRAM_REPAINT
         cerr << "SpectrogramLayer::paint(): Failed to repaint " << failedToRepaint << " of " << bufwid
              << " columns in time (so managed to repaint " << bufwid - failedToRepaint << ")" << endl;
 #endif
+
+        if (rightToLeft) {
+            paintedLeft += failedToRepaint;
+        }
+
+        paintedWidth -= failedToRepaint;
+
+        if (paintedWidth < 0) {
+            paintedWidth = 0;
+        }
+        
     } else if (failedToRepaint < 0) {
         cerr << "WARNING: failedToRepaint < 0 (= " << failedToRepaint << ")"
              << endl;
         failedToRepaint = 0;
     }
-    
+
     if (overallMagChanged) {
         m_viewMags[v->getId()] = overallMag;
 #ifdef DEBUG_SPECTROGRAM_REPAINT
@@ -1961,23 +1988,26 @@
 
     Profiler profiler2("SpectrogramLayer::paint: draw image");
 
-    if (repaintWidth > 0) {
+    if (paintedWidth > 0) {
 
 #ifdef DEBUG_SPECTROGRAM_REPAINT
-        cerr << "SpectrogramLayer: Copying " << repaintWidth << "x" << h
-                  << " from draw buffer at " << 0 << "," << 0
-                  << " to " << repaintWidth << "x" << h << " on cache at "
+        cerr << "SpectrogramLayer: Copying " << paintedWidth << "x" << h
+                  << " from draw buffer at " << paintedLeft - x0 << "," << 0
+                  << " to " << paintedWidth << "x" << h << " on cache at "
                   << x0 << "," << 0 << endl;
 #endif
 
         if (bufferBinResolution) {
+
             int scaledLeft = v->getXForFrame(leftBoundaryFrame);
             int scaledRight = v->getXForFrame(rightBoundaryFrame);
+
 #ifdef DEBUG_SPECTROGRAM_REPAINT
             cerr << "SpectrogramLayer: Rescaling image from " << bufwid
                  << "x" << h << " to "
                  << scaledRight-scaledLeft << "x" << h << endl;
 #endif
+
             Preferences::SpectrogramXSmoothing xsmoothing = 
                 Preferences::getInstance()->getSpectrogramXSmoothing();
 
@@ -1989,11 +2019,14 @@
             
             int scaledLeftCrop = v->getXForFrame(leftCropFrame);
             int scaledRightCrop = v->getXForFrame(rightCropFrame);
+
 #ifdef DEBUG_SPECTROGRAM_REPAINT
             cerr << "SpectrogramLayer: Drawing image region of width " << scaledRightCrop - scaledLeftCrop << " to "
                  << scaledLeftCrop << " from " << scaledLeftCrop - scaledLeft << endl;
 #endif
 
+            //!!! Update this for failedToRepaint logic
+            
             cache.drawImage
                 (scaledLeftCrop,
                  scaledRightCrop - scaledLeftCrop,
@@ -2003,9 +2036,9 @@
 
         } else {
 
-            cache.drawImage(x0, repaintWidth,
+            cache.drawImage(paintedLeft, paintedWidth,
                             m_drawBuffer,
-                            0, repaintWidth);
+                            paintedLeft - x0, paintedWidth);
         }
     }
 
@@ -2029,30 +2062,45 @@
     if (!m_synchronous) {
 
         if ((m_normalization != NormalizeVisibleArea) || !overallMagChanged) {
-    
-            if (cache.getValidLeft() > 0) {
-#ifdef DEBUG_SPECTROGRAM_REPAINT
-                cerr << "SpectrogramLayer::paint() updating left (0, "
-                          << cache.getValidLeft() << ")" << endl;
-#endif
-                v->updatePaintRect(QRect(0, 0, cache.getValidLeft(), h));
+
+            QRect areaLeft(0, 0, cache.getValidLeft(), h);
+            QRect areaRight(cache.getValidRight(), 0,
+                            cache.getSize().width() - cache.getValidRight(), h);
+
+            bool haveSpaceLeft = (areaLeft.width() > 0);
+            bool haveSpaceRight = (areaRight.width() > 0);
+
+            bool updateLeft = haveSpaceLeft;
+            bool updateRight = haveSpaceRight;
+            
+            if (updateLeft && updateRight) {
+                if (rightToLeft) {
+                    // we just did something adjoining the cache on
+                    // its left side, so now do something on its right
+                    updateLeft = false;
+                } else {
+                    updateRight = false;
+                }
             }
             
-            if (cache.getValidRight() <
-                cache.getSize().width()) {
+            if (updateLeft) {
+#ifdef DEBUG_SPECTROGRAM_REPAINT
+                cerr << "SpectrogramLayer::paint() updating left ("
+                     << areaLeft.x() << ", "
+                     << areaLeft.width() << ")" << endl;
+#endif
+                v->updatePaintRect(areaLeft);
+            }
+            
+            if (updateRight) {
 #ifdef DEBUG_SPECTROGRAM_REPAINT
                 cerr << "SpectrogramLayer::paint() updating right ("
-                     << cache.getValidRight()
-                     << ", "
-                     << cache.getSize().width() - cache.getValidRight()
-                     << ")" << endl;
+                     << areaRight.x() << ", "
+                     << areaRight.width() << ")" << endl;
 #endif
-                v->updatePaintRect
-                    (QRect(cache.getValidRight(),
-                           0,
-                           cache.getSize().width() - cache.getValidRight(),
-                           h));
+                v->updatePaintRect(areaRight);
             }
+            
         } else {
             // overallMagChanged
             cerr << "\noverallMagChanged - updating all\n" << endl;
@@ -2209,7 +2257,7 @@
                 if (diff > maxTime) {
 #ifdef DEBUG_SPECTROGRAM_REPAINT
                     cerr << "SpectrogramLayer::paintDrawBufferPeakFrequencies: Max time " << maxTime << " sec exceeded after "
-                         << x << " columns with time " << diff << endl;
+                         << columnCount << " columns with time " << diff << endl;
 #endif
                     return columnCount;
                 }
@@ -2478,7 +2526,7 @@
                 if (diff > maxTime) {
 #ifdef DEBUG_SPECTROGRAM_REPAINT
                     cerr << "SpectrogramLayer::paintDrawBuffer: Max time " << maxTime << " sec exceeded after "
-                         << x << " columns with time " << diff << endl;
+                         << columnCount << " columns with time " << diff << endl;
 #endif
                     return columnCount;
                 }