diff Framework/Scene2D/Internals/CompositorHelper.cpp @ 1211:d10d2acb8a02 broker

compositors do not keep a reference to the scene anymore
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 04 Dec 2019 16:47:21 +0100
parents 6009c59d8676
children 0ca50d275b9a
line wrap: on
line diff
--- a/Framework/Scene2D/Internals/CompositorHelper.cpp	Wed Dec 04 16:13:10 2019 +0100
+++ b/Framework/Scene2D/Internals/CompositorHelper.cpp	Wed Dec 04 16:47:21 2019 +0100
@@ -80,12 +80,13 @@
     };
 
 
-    void CompositorHelper::Visit(const ISceneLayer& layer,
+    void CompositorHelper::Visit(const Scene2D& scene,
+                                 const ISceneLayer& layer,
                                  uint64_t layerIdentifier,
                                  int depth)
     {
       // "Visit()" is only applied to layers existing in the scene
-      assert(scene_.HasLayer(depth)); 
+      assert(scene.HasLayer(depth)); 
 
       Content::iterator found = content_.find(depth);
 
@@ -141,18 +142,34 @@
     }
 
   
-    void CompositorHelper::Refresh(unsigned int canvasWidth,
+    void CompositorHelper::Refresh(const Scene2D& scene,
+                                   unsigned int canvasWidth,
                                    unsigned int canvasHeight)
     {
+      /**
+       * Safeguard mechanism to enforce the fact that the same scene
+       * is always used with the compositor. Note that the safeguard
+       * is not 100% bullet-proof, as a new scene might reuse the same
+       * address as a previous scene.
+       **/
+      if (lastScene_ != NULL &&
+          lastScene_ != &scene)
+      {
+        throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls,
+                                        "ICompositor::ResetScene() should have been called");
+      }
+
+      lastScene_ = &scene;
+
       // Bring coordinate (0,0) to the center of the canvas
       AffineTransform2D offset = AffineTransform2D::CreateOffset(
         static_cast<double>(canvasWidth) / 2.0,
         static_cast<double>(canvasHeight) / 2.0);
 
-      sceneTransform_ = AffineTransform2D::Combine(offset, scene_.GetSceneToCanvasTransform());
+      sceneTransform_ = AffineTransform2D::Combine(offset, scene.GetSceneToCanvasTransform());
       canvasWidth_ = canvasWidth;
       canvasHeight_ = canvasHeight;
-      scene_.Apply(*this);
+      scene.Apply(*this);
     }
   }
 }