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 {