changeset 1213:34df6ff25472 3.0-integration

Don't start in the middle when repainting the whole width while using a peak cache. It looks funny.
author Chris Cannam
date Thu, 05 Jan 2017 14:17:47 +0000
parents a1ee3108d1d3
children be42a33a3db6
files layer/Colour3DPlotRenderer.cpp layer/Colour3DPlotRenderer.h
diffstat 2 files changed, 49 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/layer/Colour3DPlotRenderer.cpp	Thu Jan 05 14:02:54 2017 +0000
+++ b/layer/Colour3DPlotRenderer.cpp	Thu Jan 05 14:17:47 2017 +0000
@@ -187,12 +187,17 @@
     if (!m_cache.isValid() && timeConstrained) {
         // When rendering the whole area, in a context where we might
         // not be able to complete the work, start from somewhere near
-        // the middle so that the region of interest appears first
-
-        //!!! (perhaps we should avoid doing this if past repaints
-        //!!! have been fast enough to do the whole in one shot)
+        // the middle so that the region of interest appears
+        // first. But only if we aren't using a peak cache, as
+        // rendering from peak cache is usually (not always) quick and
+        // looks odd if we make a habit of jumping back after reaching
+        // the end.
         if (x0 == 0 && x1 == v->getPaintWidth()) {
-            x0 = int(x1 * 0.3);
+            int peakCacheIndex = -1, binsPerPeak = -1;
+            getPreferredPeakCache(v, peakCacheIndex, binsPerPeak);
+            if (peakCacheIndex == -1) { // no peak cache
+                x0 = int(x1 * 0.3);
+            }
         }
     }
 
@@ -484,6 +489,41 @@
 }
 
 void
+Colour3DPlotRenderer::getPreferredPeakCache(const LayerGeometryProvider *v,
+                                            int &peakCacheIndex,
+                                            int &binsPerPeak) const
+{
+    peakCacheIndex = -1;
+    binsPerPeak = -1;
+
+    const DenseThreeDimensionalModel *model = m_sources.source;
+    if (!model) return;
+    
+    int zoomLevel = v->getZoomLevel();
+    int binResolution = model->getResolution();
+    
+    for (int ix = 0; in_range_for(m_sources.peakCaches, ix); ++ix) {
+        int bpp = m_sources.peakCaches[ix]->getColumnsPerPeak();
+        int equivZoom = binResolution * bpp;
+        if (zoomLevel >= equivZoom) {
+            // this peak cache would work, though it might not be best
+            if (bpp > binsPerPeak) {
+                // ok, it's better than the best one we've found so far
+                peakCacheIndex = ix;
+                binsPerPeak = bpp;
+            }
+        }
+    }
+
+    SVDEBUG << "getPreferredPeakCache: zoomLevel = " << zoomLevel
+            << ", binResolution " << binResolution 
+            << ", binsPerPeak " << binsPerPeak
+            << ", peakCacheIndex " << peakCacheIndex
+            << ", peakCaches " << m_sources.peakCaches.size()
+            << endl;
+}
+
+void
 Colour3DPlotRenderer::renderToCachePixelResolution(const LayerGeometryProvider *v,
                                                    int x0, int repaintWidth,
                                                    bool rightToLeft,
@@ -510,7 +550,6 @@
     vector<int> binforx(repaintWidth);
     vector<double> binfory(h);
     
-    int zoomLevel = v->getZoomLevel();
     int binResolution = model->getResolution();
 
     for (int x = 0; x < repaintWidth; ++x) {
@@ -523,26 +562,8 @@
     int binsPerPeak = -1;
 
     if (m_params.colourScale.getScale() != ColourScaleType::Phase) {
-        for (int ix = 0; in_range_for(m_sources.peakCaches, ix); ++ix) {
-            int bpp = m_sources.peakCaches[ix]->getColumnsPerPeak();
-            int equivZoom = binResolution * bpp;
-            if (zoomLevel >= equivZoom) {
-                // this peak cache would work, though it might not be best
-                if (bpp > binsPerPeak) {
-                    // ok, it's better than the best one we've found so far
-                    peakCacheIndex = ix;
-                    binsPerPeak = bpp;
-                }
-            }
-        }
+        getPreferredPeakCache(v, peakCacheIndex, binsPerPeak);
     }
-
-    SVDEBUG << "[PIX] zoomLevel = " << zoomLevel
-            << ", binResolution " << binResolution 
-            << ", binsPerPeak " << binsPerPeak
-            << ", peakCacheIndex " << peakCacheIndex
-            << ", peakCaches " << m_sources.peakCaches.size()
-            << endl;
     
     for (int y = 0; y < h; ++y) {
         binfory[y] = m_sources.verticalBinLayer->getBinForY(v, h - y - 1);
--- a/layer/Colour3DPlotRenderer.h	Thu Jan 05 14:02:54 2017 +0000
+++ b/layer/Colour3DPlotRenderer.h	Thu Jan 05 14:17:47 2017 +0000
@@ -307,6 +307,9 @@
     
     ColumnOp::Column getColumn(int sx, int minbin, int nbins,
                                int peakCacheIndex) const; // -1 => don't use cache
+
+    void getPreferredPeakCache(const LayerGeometryProvider *,
+                               int &peakCacheIndex, int &binsPerPeak) const;
 };
 
 #endif