# HG changeset patch # User Benjamin Golinvaux # Date 1583312857 -3600 # Node ID 8a28a9bf8876afe860630fe83b8dc78095965cc8 # Parent fef1ec42a7db0500fb14a10c20f5fc956653645a ViewportController now gets a ref to its parent viewport for proper lock usage diff -r fef1ec42a7db -r 8a28a9bf8876 Framework/Scene2DViewport/ViewportController.cpp --- a/Framework/Scene2DViewport/ViewportController.cpp Wed Mar 04 10:07:14 2020 +0100 +++ b/Framework/Scene2DViewport/ViewportController.cpp Wed Mar 04 10:07:37 2020 +0100 @@ -33,24 +33,24 @@ namespace OrthancStone { IFlexiblePointerTracker* DefaultViewportInteractor::CreateTracker( - boost::shared_ptr controller, + IViewport& viewport, const PointerEvent& event, - unsigned int viewportWidth, - unsigned int viewportHeight) + unsigned int viewportWidth, + unsigned int viewportHeight) { switch (event.GetMouseButton()) { case MouseButton_Left: - return new RotateSceneTracker(controller, event); + return new RotateSceneTracker(viewport, event); case MouseButton_Middle: - return new PanSceneTracker(controller, event); + return new PanSceneTracker(viewport, event); case MouseButton_Right: { if (viewportWidth != 0) { - return new ZoomSceneTracker(controller, event, viewportWidth); + return new ZoomSceneTracker(viewport, event, viewportWidth); } else { @@ -64,24 +64,29 @@ } - ViewportController::ViewportController() : - undoStackW_(boost::make_shared()), - scene_(new Scene2D), - canvasToSceneFactor_(1) + ViewportController::ViewportController(IViewport& viewport) + : viewport_(viewport) + , undoStackW_(boost::make_shared()) + , scene_(new Scene2D) + , canvasToSceneFactor_(1) { } - ViewportController::ViewportController(const Scene2D& scene) : - undoStackW_(boost::make_shared()), - scene_(scene.Clone()), - canvasToSceneFactor_(1) + ViewportController::ViewportController(IViewport& viewport, + const Scene2D& scene) + : viewport_(viewport) + , undoStackW_(boost::make_shared()) + , scene_(scene.Clone()) + , canvasToSceneFactor_(1) { } - ViewportController::ViewportController(boost::weak_ptr undoStackW) : - undoStackW_(undoStackW), - scene_(new Scene2D), - canvasToSceneFactor_(1) + ViewportController::ViewportController(IViewport& viewport, + boost::weak_ptr undoStackW) + : viewport_(viewport) + , undoStackW_(undoStackW) + , scene_(new Scene2D) + , canvasToSceneFactor_(1) { } @@ -274,7 +279,7 @@ } // No measure tool, create new tracker from the interactor - activeTracker_.reset(interactor.CreateTracker(shared_from_this(), event, viewportWidth, viewportHeight)); + activeTracker_.reset(interactor.CreateTracker(viewport_, event, viewportWidth, viewportHeight)); } } diff -r fef1ec42a7db -r 8a28a9bf8876 Framework/Scene2DViewport/ViewportController.h --- a/Framework/Scene2DViewport/ViewportController.h Wed Mar 04 10:07:14 2020 +0100 +++ b/Framework/Scene2DViewport/ViewportController.h Wed Mar 04 10:07:37 2020 +0100 @@ -39,7 +39,7 @@ { } - virtual IFlexiblePointerTracker* CreateTracker(boost::shared_ptr controller, + virtual IFlexiblePointerTracker* CreateTracker(IViewport& viewport, const PointerEvent& event, unsigned int viewportWidth, unsigned int viewportHeight) = 0; @@ -50,7 +50,7 @@ class DefaultViewportInteractor : public IViewportInteractor { public: - virtual IFlexiblePointerTracker* CreateTracker(boost::shared_ptr controller, + virtual IFlexiblePointerTracker* CreateTracker(IViewport& viewport, const PointerEvent& event, unsigned int viewportWidth, unsigned int viewportHeight) ORTHANC_OVERRIDE; @@ -109,11 +109,11 @@ ORTHANC_STONE_DEFINE_ORIGIN_MESSAGE(__FILE__, __LINE__, \ SceneTransformChanged, ViewportController); - ViewportController(); + ViewportController(IViewport& viewport); - ViewportController(const Scene2D& scene /* will be cloned */); + ViewportController(IViewport& viewport, const Scene2D& scene /* will be cloned */); - ViewportController(boost::weak_ptr undoStackW); + ViewportController(IViewport& viewport, boost::weak_ptr undoStackW); ~ViewportController(); @@ -229,6 +229,7 @@ private: double GetCanvasToSceneFactor() const; + IViewport& viewport_; boost::weak_ptr undoStackW_; // Global stack, possibly shared by all viewports std::vector > measureTools_; boost::shared_ptr activeTracker_; // TODO - Couldn't this be a "std::auto_ptr"? diff -r fef1ec42a7db -r 8a28a9bf8876 Framework/Viewport/SdlViewport.cpp --- a/Framework/Viewport/SdlViewport.cpp Wed Mar 04 10:07:14 2020 +0100 +++ b/Framework/Viewport/SdlViewport.cpp Wed Mar 04 10:07:37 2020 +0100 @@ -48,18 +48,27 @@ compositor_.reset(compositor); } - SdlViewport::SdlViewport() : - controller_(new ViewportController) + controller_(new ViewportController(*this)) { refreshEvent_ = SDL_RegisterEvents(1); - + if (refreshEvent_ == static_cast(-1)) { throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); } } + SdlViewport::SdlViewport(boost::weak_ptr undoStackW) : + controller_(new ViewportController(*this,undoStackW)) + { + refreshEvent_ = SDL_RegisterEvents(1); + + if (refreshEvent_ == static_cast(-1)) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } void SdlViewport::SendRefreshEvent() { @@ -79,6 +88,16 @@ AcquireCompositor(new OpenGLCompositor(context_)); // (*) } + SdlOpenGLViewport::SdlOpenGLViewport(const char* title, + boost::weak_ptr undoStackW, + unsigned int width, + unsigned int height, + bool allowDpiScaling) : + SdlViewport(undoStackW), + context_(title, width, height, allowDpiScaling) + { + AcquireCompositor(new OpenGLCompositor(context_)); // (*) + } SdlOpenGLViewport::~SdlOpenGLViewport() { diff -r fef1ec42a7db -r 8a28a9bf8876 Framework/Viewport/SdlViewport.h --- a/Framework/Viewport/SdlViewport.h Wed Mar 04 10:07:14 2020 +0100 +++ b/Framework/Viewport/SdlViewport.h Wed Mar 04 10:07:37 2020 +0100 @@ -43,12 +43,20 @@ #include +// TODO: required for UndoStack injection +// I don't like it either :) +#include + +#include + namespace OrthancStone { + class UndoStack; + class SdlViewport : public IViewport { private: - boost::mutex mutex_; + boost::recursive_mutex mutex_; uint32_t refreshEvent_; boost::shared_ptr controller_; std::auto_ptr compositor_; @@ -59,8 +67,8 @@ class SdlLock : public ILock { private: - SdlViewport& that_; - boost::mutex::scoped_lock lock_; + SdlViewport& that_; + boost::recursive_mutex::scoped_lock lock_; public: SdlLock(SdlViewport& that) : @@ -96,6 +104,7 @@ public: SdlViewport(); + SdlViewport(boost::weak_ptr undoStackW); bool IsRefreshEvent(const SDL_Event& event) const { @@ -128,6 +137,12 @@ unsigned int height, bool allowDpiScaling = true); + SdlOpenGLViewport(const char* title, + boost::weak_ptr undoStackW, + unsigned int width, + unsigned int height, + bool allowDpiScaling = true); + virtual ~SdlOpenGLViewport(); virtual void Paint() ORTHANC_OVERRIDE; diff -r fef1ec42a7db -r 8a28a9bf8876 Framework/Viewport/WebAssemblyViewport.cpp --- a/Framework/Viewport/WebAssemblyViewport.cpp Wed Mar 04 10:07:14 2020 +0100 +++ b/Framework/Viewport/WebAssemblyViewport.cpp Wed Mar 04 10:07:37 2020 +0100 @@ -213,11 +213,11 @@ { if (scene == NULL) { - controller_ = boost::make_shared(); + controller_ = boost::make_shared(*this); } else { - controller_ = boost::make_shared(*scene); + controller_ = boost::make_shared(*this,*scene); } LOG(INFO) << "Initializing Stone viewport on HTML canvas: " << canvasId;