diff view/View.cpp @ 1605:ae2d5f8ff005

When asked to render the whole view width, we need to wait for the layers to be ready before we can determine what the width is
author Chris Cannam
date Thu, 30 Apr 2020 14:47:13 +0100
parents f12c25651f96
children 52d4bfba5b3d
line wrap: on
line diff
--- a/view/View.cpp	Wed Apr 29 17:47:55 2020 +0100
+++ b/view/View.cpp	Thu Apr 30 14:47:13 2020 +0100
@@ -2992,19 +2992,12 @@
 }
 
 bool
-View::render(QPainter &paint, int xorigin, sv_frame_t f0, sv_frame_t f1)
+View::waitForLayersToBeReady()
 {
-    int x0 = int(round(m_zoomLevel.framesToPixels(double(f0))));
-    int x1 = int(round(m_zoomLevel.framesToPixels(double(f1))));
-
-    int w = x1 - x0;
-
-    sv_frame_t origCentreFrame = m_centreFrame;
-
     bool someLayersIncomplete = false;
 
 #ifdef DEBUG_VIEW
-    SVDEBUG << "View::render: checking completion" << endl;
+    SVDEBUG << "View::waitForLayersToBeReady: checking completion" << endl;
 #endif
     
     for (LayerList::iterator i = m_layerStack.begin();
@@ -3064,8 +3057,31 @@
     }
 
 #ifdef DEBUG_VIEW
-    SVDEBUG << "View::render: ok, we're ready" << endl;
+    SVDEBUG << "View::waitForLayersToBeReady: ok, we're ready" << endl;
 #endif
+
+    return true;
+}
+
+bool
+View::render(QPainter &paint, int xorigin, sv_frame_t f0, sv_frame_t f1)
+{
+    int x0 = int(round(m_zoomLevel.framesToPixels(double(f0))));
+    int x1 = int(round(m_zoomLevel.framesToPixels(double(f1))));
+
+    int w = x1 - x0;
+
+#ifdef DEBUG_VIEW
+    SVDEBUG << "View::render: Render request is for frames " << f0
+            << " to " << f1 << " (pixels " << x0 << " to " << x1
+            << ", width " << w << ")" << endl;
+#endif
+
+    if (!waitForLayersToBeReady()) {
+        return false;
+    }
+
+    sv_frame_t origCentreFrame = m_centreFrame;
     
     QProgressDialog progress(tr("Rendering image..."),
                              tr("Cancel"), 0, w / width(), this);
@@ -3123,6 +3139,10 @@
 QImage *
 View::renderToNewImage()
 {
+    if (!waitForLayersToBeReady()) {
+        return nullptr;
+    }
+    
     sv_frame_t f0 = getModelsStartFrame();
     sv_frame_t f1 = getModelsEndFrame();