diff layer/Colour3DPlotLayer.cpp @ 474:efc2bd6d3611

* take a bit more care about peaks cache sizing
author Chris Cannam
date Thu, 29 Jan 2009 14:17:12 +0000
parents 13e8edbffbd7
children 3f4b10e76ccd
line wrap: on
line diff
--- a/layer/Colour3DPlotLayer.cpp	Tue Jan 27 13:25:10 2009 +0000
+++ b/layer/Colour3DPlotLayer.cpp	Thu Jan 29 14:17:12 2009 +0000
@@ -37,7 +37,7 @@
     m_model(0),
     m_cache(0),
     m_peaksCache(0),
-    m_peakResolution(128),
+    m_peakResolution(256),
     m_cacheValidStart(0),
     m_cacheValidEnd(0),
     m_colourScale(LinearScale),
@@ -73,6 +73,16 @@
     connect(m_model, SIGNAL(modelChanged(size_t, size_t)),
 	    this, SLOT(modelChanged(size_t, size_t)));
 
+    m_peakResolution = 256;
+    if (model->getResolution() > 512) {
+        m_peakResolution = 16;
+    } else if (model->getResolution() > 128) {
+        m_peakResolution = 64;
+    } else if (model->getResolution() > 2) {
+        m_peakResolution = 128;
+    }
+    cacheInvalid();
+
     emit modelReplaced();
     emit sliceableModelReplaced(oldModel, model);
 }
@@ -750,7 +760,7 @@
         m_cache = new QImage
             (cacheWidth, cacheHeight, QImage::Format_Indexed8);
         m_cache->setNumColors(256);
-        if (modelResolution < m_peakResolution / 2 && !m_normalizeVisibleArea) {
+        if (!m_normalizeVisibleArea) {
             m_peaksCache = new QImage
                 (cacheWidth / m_peakResolution + 1, cacheHeight,
                  QImage::Format_Indexed8);
@@ -1118,13 +1128,23 @@
     int zoomLevel = v->getZoomLevel();
     
     QImage *source = m_cache;
-    if (m_peaksCache &&
-        ((modelResolution * srRatio * m_peakResolution) / zoomLevel) < 1) {
-//        std::cerr << "using peaks cache" << std::endl;
-        source = m_peaksCache;
-        modelResolution *= m_peakResolution;
+    
+    std::cerr << "modelResolution " << modelResolution << ", srRatio "
+              << srRatio << ", m_peakResolution " << m_peakResolution
+              << ", zoomLevel " << zoomLevel << ", result "
+              << ((modelResolution * srRatio * m_peakResolution) / zoomLevel)
+              << std::endl;
+
+    if (m_peaksCache) {
+        if (((modelResolution * srRatio * m_peakResolution) / zoomLevel) < 1) {
+            std::cerr << "using peaks cache" << std::endl;
+            source = m_peaksCache;
+            modelResolution *= m_peakResolution;
+        } else {
+            std::cerr << "not using peaks cache" << std::endl;
+        }
     } else {
-//        std::cerr << "not using peaks cache" << std::endl;
+        std::cerr << "have no peaks cache" << std::endl;
     }
 
     int psy1i = -1;
@@ -1175,8 +1195,11 @@
             
             for (int x = 0; x < w; ++x) {
 
+                int sx1i = sxa[x*2 + 1];
+                if (sx1i < 0) continue;
+
                 int sx0i = sxa[x*2];
-                int sx1i = sxa[x*2 + 1];
+                if (sx0i >= sw) break;
 
                 uchar peak = 0;
                 for (int sx = sx0i; sx <= sx1i; ++sx) {