Mercurial > hg > orthanc-stone
comparison Framework/Viewport/WebAssemblyViewport.cpp @ 1328:fd616c4a5904 broker
Added mechanism to prevent callbacks from being sent on dead WebAssemblyViewport objects
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Fri, 27 Mar 2020 12:54:27 +0100 |
parents | cbfdba08e039 |
children | ab81ee8fce1f |
comparison
equal
deleted
inserted
replaced
1327:4f8db2d202c8 | 1328:fd616c4a5904 |
---|---|
19 **/ | 19 **/ |
20 | 20 |
21 | 21 |
22 #include "WebAssemblyViewport.h" | 22 #include "WebAssemblyViewport.h" |
23 | 23 |
24 #include "../Toolbox/GenericToolbox.h" | |
25 | |
24 #include <Core/OrthancException.h> | 26 #include <Core/OrthancException.h> |
25 | 27 |
26 #include <boost/make_shared.hpp> | 28 #include <boost/make_shared.hpp> |
29 #include <boost/enable_shared_from_this.hpp> | |
27 | 30 |
28 namespace OrthancStone | 31 namespace OrthancStone |
29 { | 32 { |
30 static void ConvertMouseEvent(PointerEvent& target, | 33 static void ConvertMouseEvent(PointerEvent& target, |
31 const EmscriptenMouseEvent& source, | 34 const EmscriptenMouseEvent& source, |
101 }; | 104 }; |
102 | 105 |
103 | 106 |
104 EM_BOOL WebAssemblyViewport::OnRequestAnimationFrame(double time, void *userData) | 107 EM_BOOL WebAssemblyViewport::OnRequestAnimationFrame(double time, void *userData) |
105 { | 108 { |
106 WebAssemblyViewport& that = *reinterpret_cast<WebAssemblyViewport*>(userData); | 109 boost::shared_ptr<WebAssemblyViewport> that = GenericToolbox::HoldingRef<WebAssemblyViewport>::Unwrap(userData); |
107 | 110 |
108 if (that.compositor_.get() != NULL && | 111 if (that->compositor_.get() != NULL && |
109 that.controller_ /* should always be true */) | 112 that->controller_ /* should always be true */) |
110 { | 113 { |
111 that.Paint(*that.compositor_, *that.controller_); | 114 that->Paint(*that->compositor_, *that->controller_); |
112 } | 115 } |
113 | 116 |
114 return true; | 117 return true; |
115 } | 118 } |
116 | 119 |
117 EM_BOOL WebAssemblyViewport::OnResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData) | 120 EM_BOOL WebAssemblyViewport::OnResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData) |
118 { | 121 { |
119 WebAssemblyViewport& that = *reinterpret_cast<WebAssemblyViewport*>(userData); | 122 boost::shared_ptr<WebAssemblyViewport> that = GenericToolbox::HoldingRef<WebAssemblyViewport>::Unwrap(userData); |
120 | 123 |
121 if (that.compositor_.get() != NULL) | 124 if (that->compositor_.get() != NULL) |
122 { | 125 { |
123 that.UpdateSize(*that.compositor_); | 126 that->UpdateSize(*that->compositor_); |
124 that.Invalidate(); | 127 that->Invalidate(); |
125 } | 128 } |
126 | 129 |
127 return true; | 130 return true; |
128 } | 131 } |
129 | 132 |
130 | 133 |
131 EM_BOOL WebAssemblyViewport::OnMouseDown(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) | 134 EM_BOOL WebAssemblyViewport::OnMouseDown(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) |
132 { | 135 { |
133 WebAssemblyViewport& that = *reinterpret_cast<WebAssemblyViewport*>(userData); | 136 boost::shared_ptr<WebAssemblyViewport> that = GenericToolbox::HoldingRef<WebAssemblyViewport>::Unwrap(userData); |
134 | 137 |
135 LOG(INFO) << "mouse down: " << that.GetFullCanvasId(); | 138 LOG(INFO) << "mouse down: " << that->GetFullCanvasId(); |
136 | 139 |
137 if (that.compositor_.get() != NULL && | 140 if (that->compositor_.get() != NULL && |
138 that.interactor_.get() != NULL) | 141 that->interactor_.get() != NULL) |
139 { | 142 { |
140 PointerEvent pointer; | 143 PointerEvent pointer; |
141 ConvertMouseEvent(pointer, *mouseEvent, *that.compositor_); | 144 ConvertMouseEvent(pointer, *mouseEvent, *that->compositor_); |
142 | 145 |
143 that.controller_->HandleMousePress(*that.interactor_, pointer, | 146 that->controller_->HandleMousePress(*that->interactor_, pointer, |
144 that.compositor_->GetCanvasWidth(), | 147 that->compositor_->GetCanvasWidth(), |
145 that.compositor_->GetCanvasHeight()); | 148 that->compositor_->GetCanvasHeight()); |
146 that.Invalidate(); | 149 that->Invalidate(); |
147 } | 150 } |
148 | 151 |
149 return true; | 152 return true; |
150 } | 153 } |
151 | 154 |
152 | 155 |
153 EM_BOOL WebAssemblyViewport::OnMouseMove(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) | 156 EM_BOOL WebAssemblyViewport::OnMouseMove(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) |
154 { | 157 { |
155 WebAssemblyViewport& that = *reinterpret_cast<WebAssemblyViewport*>(userData); | 158 boost::shared_ptr<WebAssemblyViewport> that = GenericToolbox::HoldingRef<WebAssemblyViewport>::Unwrap(userData); |
156 | 159 |
157 if (that.compositor_.get() != NULL && | 160 if (that->compositor_.get() != NULL && |
158 that.controller_->HasActiveTracker()) | 161 that->controller_->HasActiveTracker()) |
159 { | 162 { |
160 PointerEvent pointer; | 163 PointerEvent pointer; |
161 ConvertMouseEvent(pointer, *mouseEvent, *that.compositor_); | 164 ConvertMouseEvent(pointer, *mouseEvent, *that->compositor_); |
162 if (that.controller_->HandleMouseMove(pointer)) | 165 if (that->controller_->HandleMouseMove(pointer)) |
163 { | 166 { |
164 that.Invalidate(); | 167 that->Invalidate(); |
165 } | 168 } |
166 } | 169 } |
167 | 170 |
168 return true; | 171 return true; |
169 } | 172 } |
170 | |
171 | 173 |
172 EM_BOOL WebAssemblyViewport::OnMouseUp(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) | 174 EM_BOOL WebAssemblyViewport::OnMouseUp(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) |
173 { | 175 { |
174 WebAssemblyViewport& that = *reinterpret_cast<WebAssemblyViewport*>(userData); | 176 boost::shared_ptr<WebAssemblyViewport> that = GenericToolbox::HoldingRef<WebAssemblyViewport>::Unwrap(userData); |
175 | 177 |
176 if (that.compositor_.get() != NULL) | 178 if (that->compositor_.get() != NULL) |
177 { | 179 { |
178 PointerEvent pointer; | 180 PointerEvent pointer; |
179 ConvertMouseEvent(pointer, *mouseEvent, *that.compositor_); | 181 ConvertMouseEvent(pointer, *mouseEvent, *that->compositor_); |
180 that.controller_->HandleMouseRelease(pointer); | 182 that->controller_->HandleMouseRelease(pointer); |
181 that.Invalidate(); | 183 that->Invalidate(); |
182 } | 184 } |
183 | 185 |
184 return true; | 186 return true; |
185 } | 187 } |
186 | 188 |
187 | |
188 void WebAssemblyViewport::Invalidate() | 189 void WebAssemblyViewport::Invalidate() |
189 { | 190 { |
190 emscripten_request_animation_frame(OnRequestAnimationFrame, this); | 191 emscripten_request_animation_frame(OnRequestAnimationFrame, GenericToolbox::HoldingRef<WebAssemblyViewport>::Wrap(this)); |
191 } | 192 } |
192 | |
193 | 193 |
194 void WebAssemblyViewport::AcquireCompositor(ICompositor* compositor /* takes ownership */) | 194 void WebAssemblyViewport::AcquireCompositor(ICompositor* compositor /* takes ownership */) |
195 { | 195 { |
196 if (compositor == NULL) | 196 if (compositor == NULL) |
197 { | 197 { |