Mercurial > hg > orthanc-stone
annotate Platforms/Wasm/Defaults.cpp @ 266:c9cf95b49a86 am-2
removed OrthancSlicesLoader::ISliceLoaderObserver; now using standard messages instead
author | am@osimis.io |
---|---|
date | Tue, 21 Aug 2018 18:14:22 +0200 |
parents | 65562a28fe05 |
children | d7d91d96b9d8 |
rev | line source |
---|---|
222 | 1 #include "Defaults.h" |
2 | |
223 | 3 #include "WasmWebService.h" |
4 #include <Framework/dev.h> | |
5 #include "Framework/Widgets/TestCairoWidget.h" | |
6 #include <Framework/Viewport/WidgetViewport.h> | |
7 #include <Framework/Widgets/LayerWidget.h> | |
228 | 8 #include <algorithm> |
242 | 9 #include "Applications/Wasm/StartupParametersBuilder.h" |
223 | 10 |
11 static unsigned int width_ = 0; | |
12 static unsigned int height_ = 0; | |
13 | |
14 /**********************************/ | |
15 | |
242 | 16 static std::unique_ptr<OrthancStone::IBasicApplication> application; |
17 static std::unique_ptr<OrthancStone::BasicApplicationContext> context; | |
18 static OrthancStone::StartupParametersBuilder startupParametersBuilder; | |
253 | 19 static OrthancStone::MessageBroker broker; |
242 | 20 |
223 | 21 static OrthancStone::ChangeObserver changeObserver_; |
22 static OrthancStone::StatusBar statusBar_; | |
23 | |
227 | 24 static std::list<std::shared_ptr<OrthancStone::WidgetViewport>> viewports_; |
25 | |
228 | 26 std::shared_ptr<OrthancStone::WidgetViewport> FindViewportSharedPtr(ViewportHandle viewport) { |
27 for (const auto& v : viewports_) { | |
28 if (v.get() == viewport) { | |
29 return v; | |
30 } | |
31 } | |
229 | 32 assert(false); |
33 return std::shared_ptr<OrthancStone::WidgetViewport>(); | |
228 | 34 } |
35 | |
223 | 36 #ifdef __cplusplus |
37 extern "C" { | |
38 #endif | |
39 | |
40 using namespace OrthancStone; | |
227 | 41 |
42 // when WASM needs a C++ viewport | |
43 ViewportHandle EMSCRIPTEN_KEEPALIVE CreateCppViewport() { | |
44 | |
45 std::shared_ptr<OrthancStone::WidgetViewport> viewport(new OrthancStone::WidgetViewport); | |
46 printf("viewport %x\n", viewport.get()); | |
47 | |
48 viewports_.push_back(viewport); | |
49 | |
50 printf("There are now %d viewports in C++\n", viewports_.size()); | |
51 | |
52 viewport->SetStatusBar(statusBar_); | |
53 viewport->Register(changeObserver_); | |
54 | |
55 return viewport.get(); | |
56 } | |
57 | |
58 // when WASM does not need a viewport anymore, it should release it | |
59 void EMSCRIPTEN_KEEPALIVE ReleaseCppViewport(ViewportHandle viewport) { | |
60 viewports_.remove_if([viewport](const std::shared_ptr<OrthancStone::WidgetViewport>& v) { return v.get() == viewport;}); | |
61 | |
62 printf("There are now %d viewports in C++\n", viewports_.size()); | |
63 } | |
64 | |
65 void EMSCRIPTEN_KEEPALIVE CreateWasmApplication(ViewportHandle viewport) { | |
223 | 66 |
67 printf("CreateWasmApplication\n"); | |
68 | |
253 | 69 application.reset(CreateUserApplication(broker)); |
255 | 70 WasmWebService::SetBroker(broker); |
223 | 71 |
242 | 72 startupParametersBuilder.Clear(); |
223 | 73 } |
74 | |
75 void EMSCRIPTEN_KEEPALIVE SetStartupParameter(const char* keyc, | |
76 const char* value) { | |
242 | 77 startupParametersBuilder.SetStartupParameter(keyc, value); |
223 | 78 } |
79 | |
231
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
229
diff
changeset
|
80 void EMSCRIPTEN_KEEPALIVE StartWasmApplication() { |
223 | 81 |
82 printf("StartWasmApplication\n"); | |
83 | |
84 // recreate a command line from uri arguments and parse it | |
85 boost::program_options::variables_map parameters; | |
242 | 86 boost::program_options::options_description options; |
87 application->DeclareStartupOptions(options); | |
88 startupParametersBuilder.GetStartupParameters(parameters, options); | |
223 | 89 |
242 | 90 context.reset(new OrthancStone::BasicApplicationContext(OrthancStone::WasmWebService::GetInstance())); |
91 application->Initialize(context.get(), statusBar_, parameters); | |
92 application->InitializeWasm(); | |
223 | 93 |
231
5027cb2feb51
viewport is now part of the Application itself and not global anymore
am@osimis.io
parents:
229
diff
changeset
|
94 // viewport->SetSize(width_, height_); |
223 | 95 printf("StartWasmApplication - completed\n"); |
96 } | |
97 | |
98 void EMSCRIPTEN_KEEPALIVE NotifyUpdateContent() | |
99 { | |
228 | 100 for (auto viewport : viewports_) { |
101 // TODO Only launch the JavaScript timer if "HasUpdateContent()" | |
102 if (viewport->HasUpdateContent()) | |
103 { | |
104 viewport->UpdateContent(); | |
105 } | |
106 | |
223 | 107 } |
108 | |
109 } | |
110 | |
111 | |
228 | 112 void EMSCRIPTEN_KEEPALIVE ViewportSetSize(ViewportHandle viewport, unsigned int width, unsigned int height) |
223 | 113 { |
114 width_ = width; | |
115 height_ = height; | |
116 | |
228 | 117 viewport->SetSize(width, height); |
223 | 118 } |
119 | |
228 | 120 int EMSCRIPTEN_KEEPALIVE ViewportRender(ViewportHandle viewport, |
227 | 121 unsigned int width, |
223 | 122 unsigned int height, |
123 uint8_t* data) | |
124 { | |
125 changeObserver_.Reset(); | |
126 | |
127 //printf("ViewportRender called %dx%d\n", width, height); | |
128 if (width == 0 || | |
129 height == 0) | |
130 { | |
131 return 1; | |
132 } | |
133 | |
134 Orthanc::ImageAccessor surface; | |
135 surface.AssignWritable(Orthanc::PixelFormat_BGRA32, width, height, 4 * width, data); | |
136 | |
227 | 137 viewport->Render(surface); |
223 | 138 |
139 // Convert from BGRA32 memory layout (only color mode supported by | |
140 // Cairo, which corresponds to CAIRO_FORMAT_ARGB32) to RGBA32 (as | |
141 // expected by HTML5 canvas). This simply amounts to swapping the | |
142 // B and R channels. | |
143 uint8_t* p = data; | |
144 for (unsigned int y = 0; y < height; y++) { | |
145 for (unsigned int x = 0; x < width; x++) { | |
146 uint8_t tmp = p[0]; | |
147 p[0] = p[2]; | |
148 p[2] = tmp; | |
149 | |
150 p += 4; | |
151 } | |
152 } | |
153 | |
154 return 1; | |
155 } | |
156 | |
157 | |
228 | 158 void EMSCRIPTEN_KEEPALIVE ViewportMouseDown(ViewportHandle viewport, |
159 unsigned int rawButton, | |
223 | 160 int x, |
161 int y, | |
162 unsigned int rawModifiers) | |
163 { | |
164 OrthancStone::MouseButton button; | |
165 switch (rawButton) | |
166 { | |
167 case 0: | |
168 button = OrthancStone::MouseButton_Left; | |
169 break; | |
170 | |
171 case 1: | |
172 button = OrthancStone::MouseButton_Middle; | |
173 break; | |
174 | |
175 case 2: | |
176 button = OrthancStone::MouseButton_Right; | |
177 break; | |
178 | |
179 default: | |
180 return; // Unknown button | |
181 } | |
182 | |
228 | 183 viewport->MouseDown(button, x, y, OrthancStone::KeyboardModifiers_None /* TODO */); |
223 | 184 } |
185 | |
186 | |
228 | 187 void EMSCRIPTEN_KEEPALIVE ViewportMouseWheel(ViewportHandle viewport, |
188 int deltaY, | |
223 | 189 int x, |
190 int y, | |
191 int isControl) | |
192 { | |
228 | 193 if (deltaY != 0) |
223 | 194 { |
195 OrthancStone::MouseWheelDirection direction = (deltaY < 0 ? | |
196 OrthancStone::MouseWheelDirection_Up : | |
197 OrthancStone::MouseWheelDirection_Down); | |
198 OrthancStone::KeyboardModifiers modifiers = OrthancStone::KeyboardModifiers_None; | |
199 | |
200 if (isControl != 0) | |
201 { | |
202 modifiers = OrthancStone::KeyboardModifiers_Control; | |
203 } | |
204 | |
228 | 205 viewport->MouseWheel(direction, x, y, modifiers); |
223 | 206 } |
207 } | |
208 | |
209 | |
228 | 210 void EMSCRIPTEN_KEEPALIVE ViewportMouseMove(ViewportHandle viewport, |
211 int x, | |
223 | 212 int y) |
213 { | |
228 | 214 viewport->MouseMove(x, y); |
223 | 215 } |
216 | |
228 | 217 void EMSCRIPTEN_KEEPALIVE ViewportKeyPressed(ViewportHandle viewport, |
218 const char* key, | |
223 | 219 bool isShiftPressed, |
220 bool isControlPressed, | |
221 bool isAltPressed) | |
222 | |
223 { | |
228 | 224 OrthancStone::KeyboardModifiers modifiers = OrthancStone::KeyboardModifiers_None; |
225 if (isShiftPressed) { | |
226 modifiers = static_cast<OrthancStone::KeyboardModifiers>(modifiers + OrthancStone::KeyboardModifiers_Shift); | |
223 | 227 } |
228 | 228 if (isControlPressed) { |
229 modifiers = static_cast<OrthancStone::KeyboardModifiers>(modifiers + OrthancStone::KeyboardModifiers_Control); | |
230 } | |
231 if (isAltPressed) { | |
232 modifiers = static_cast<OrthancStone::KeyboardModifiers>(modifiers + OrthancStone::KeyboardModifiers_Alt); | |
233 } | |
234 printf("key pressed : %c\n", key[0]); | |
235 viewport->KeyPressed(key[0], modifiers); | |
223 | 236 } |
237 | |
238 | |
228 | 239 void EMSCRIPTEN_KEEPALIVE ViewportMouseUp(ViewportHandle viewport) |
223 | 240 { |
228 | 241 viewport->MouseUp(); |
223 | 242 } |
243 | |
244 | |
228 | 245 void EMSCRIPTEN_KEEPALIVE ViewportMouseEnter(ViewportHandle viewport) |
223 | 246 { |
228 | 247 viewport->MouseEnter(); |
223 | 248 } |
249 | |
250 | |
228 | 251 void EMSCRIPTEN_KEEPALIVE ViewportMouseLeave(ViewportHandle viewport) |
223 | 252 { |
228 | 253 viewport->MouseLeave(); |
223 | 254 } |
255 | |
256 | |
257 #ifdef __cplusplus | |
258 } | |
259 #endif |