# HG changeset patch # User am@osimis.io # Date 1528981589 -7200 # Node ID 210c1ce8e1a6bc64adfb581b3af5f94428a1c28f # Parent c8f11437a6fd738d0b340e67b8bc96b5aaa07e7e WasmViewport is no more a singleton diff -r c8f11437a6fd -r 210c1ce8e1a6 Platforms/WebAssembly/Defaults.cpp --- a/Platforms/WebAssembly/Defaults.cpp Thu Jun 14 13:28:40 2018 +0200 +++ b/Platforms/WebAssembly/Defaults.cpp Thu Jun 14 15:06:29 2018 +0200 @@ -5,6 +5,7 @@ #include "Framework/Widgets/TestCairoWidget.h" #include #include +#include static unsigned int width_ = 0; static unsigned int height_ = 0; @@ -12,13 +13,21 @@ /**********************************/ static std::auto_ptr application; -static std::shared_ptr viewport_; static OrthancStone::ChangeObserver changeObserver_; static OrthancStone::StatusBar statusBar_; static std::list> viewports_; +std::shared_ptr FindViewportSharedPtr(ViewportHandle viewport) { + for (const auto& v : viewports_) { + if (v.get() == viewport) { + return v; + } + assert(false); + } +} + #ifdef __cplusplus extern "C" { #endif @@ -38,8 +47,6 @@ viewport->SetStatusBar(statusBar_); viewport->Register(changeObserver_); - // TODO: remove once we really want to handle multiple viewports - viewport_ = viewport; return viewport.get(); } @@ -50,7 +57,6 @@ printf("There are now %d viewports in C++\n", viewports_.size()); } - void EMSCRIPTEN_KEEPALIVE CreateWasmApplication(ViewportHandle viewport) { printf("CreateWasmApplication\n"); @@ -66,7 +72,7 @@ application->SetStartupParameter(keyc, value); } - void EMSCRIPTEN_KEEPALIVE StartWasmApplication() { + void EMSCRIPTEN_KEEPALIVE StartWasmApplication(ViewportHandle viewport) { printf("StartWasmApplication\n"); @@ -74,79 +80,36 @@ boost::program_options::variables_map parameters; application->GetStartupParameters(parameters); - BasicWasmApplicationContext& context = dynamic_cast(application->CreateApplicationContext(OrthancStone::WasmWebService::GetInstance(), viewport_));; + BasicWasmApplicationContext& context = dynamic_cast(application->CreateApplicationContext(OrthancStone::WasmWebService::GetInstance(), FindViewportSharedPtr(viewport))); application->Initialize(statusBar_, parameters); - viewport_->SetSize(width_, height_); + viewport->SetSize(width_, height_); printf("StartWasmApplication - completed\n"); } - - // void EMSCRIPTEN_KEEPALIVE ViewportUpdate(const char* _instanceId) { - // printf("updating viewport content, Instance = [%s]\n", instanceId.c_str()); - - // layerSource->LoadFrame(instanceId, 0); - // printf("frame loaded\n"); - // instanceWidget->UpdateContent(); - - // printf("update should be done\n"); - // } - // void EMSCRIPTEN_KEEPALIVE ViewportStart() - // { - - // viewport_.reset(new OrthancStone::WidgetViewport); - // viewport_->SetStatusBar(statusBar_); - // viewport_->Register(changeObserver_); - // instanceWidget.reset(new OrthancStone::LayerWidget); - // layerSource = new OrthancStone::OrthancFrameLayerSource(OrthancStone::WasmWebService::GetInstance()); - - // if (!instanceId.empty()) - // { - // layerSource->LoadFrame(instanceId, 0); - // } else { - // printf("No instance provided so far\n"); - // } - - // instanceWidget->AddLayer(layerSource); - - // { - // OrthancStone::RenderStyle s; - // //s.drawGrid_ = true; - // s.alpha_ = 1; - // s.windowing_ = OrthancStone::ImageWindowing_Bone; - // instanceWidget->SetLayerStyle(0, s); - // } - - // viewport_->SetCentralWidget(instanceWidget.release()); - // viewport_->SetSize(width_, height_); - - - // } - void EMSCRIPTEN_KEEPALIVE NotifyUpdateContent() { - // TODO Only launch the JavaScript timer if "HasUpdateContent()" - if (viewport_.get() != NULL && - viewport_->HasUpdateContent()) - { - viewport_->UpdateContent(); + for (auto viewport : viewports_) { + // TODO Only launch the JavaScript timer if "HasUpdateContent()" + if (viewport->HasUpdateContent()) + { + viewport->UpdateContent(); + } + } } - void EMSCRIPTEN_KEEPALIVE ViewportSetSize(unsigned int width, unsigned int height) + void EMSCRIPTEN_KEEPALIVE ViewportSetSize(ViewportHandle viewport, unsigned int width, unsigned int height) { width_ = width; height_ = height; - if (viewport_.get() != NULL) - { - viewport_->SetSize(width, height); - } + viewport->SetSize(width, height); } - int EMSCRIPTEN_KEEPALIVE ViewportRender(OrthancStone::WidgetViewport* viewport, + int EMSCRIPTEN_KEEPALIVE ViewportRender(ViewportHandle viewport, unsigned int width, unsigned int height, uint8_t* data) @@ -184,7 +147,8 @@ } - void EMSCRIPTEN_KEEPALIVE ViewportMouseDown(unsigned int rawButton, + void EMSCRIPTEN_KEEPALIVE ViewportMouseDown(ViewportHandle viewport, + unsigned int rawButton, int x, int y, unsigned int rawModifiers) @@ -208,20 +172,17 @@ return; // Unknown button } - if (viewport_.get() != NULL) - { - viewport_->MouseDown(button, x, y, OrthancStone::KeyboardModifiers_None /* TODO */); - } + viewport->MouseDown(button, x, y, OrthancStone::KeyboardModifiers_None /* TODO */); } - void EMSCRIPTEN_KEEPALIVE ViewportMouseWheel(int deltaY, + void EMSCRIPTEN_KEEPALIVE ViewportMouseWheel(ViewportHandle viewport, + int deltaY, int x, int y, int isControl) { - if (viewport_.get() != NULL && - deltaY != 0) + if (deltaY != 0) { OrthancStone::MouseWheelDirection direction = (deltaY < 0 ? OrthancStone::MouseWheelDirection_Up : @@ -233,68 +194,55 @@ modifiers = OrthancStone::KeyboardModifiers_Control; } - viewport_->MouseWheel(direction, x, y, modifiers); + viewport->MouseWheel(direction, x, y, modifiers); } } - void EMSCRIPTEN_KEEPALIVE ViewportMouseMove(int x, + void EMSCRIPTEN_KEEPALIVE ViewportMouseMove(ViewportHandle viewport, + int x, int y) { - if (viewport_.get() != NULL) - { - viewport_->MouseMove(x, y); - } + viewport->MouseMove(x, y); } - void EMSCRIPTEN_KEEPALIVE ViewportKeyPressed(const char* key, + void EMSCRIPTEN_KEEPALIVE ViewportKeyPressed(ViewportHandle viewport, + const char* key, bool isShiftPressed, bool isControlPressed, bool isAltPressed) { - if (viewport_.get() != NULL) - { - OrthancStone::KeyboardModifiers modifiers = OrthancStone::KeyboardModifiers_None; - if (isShiftPressed) { - modifiers = static_cast(modifiers + OrthancStone::KeyboardModifiers_Shift); - } - if (isControlPressed) { - modifiers = static_cast(modifiers + OrthancStone::KeyboardModifiers_Control); - } - if (isAltPressed) { - modifiers = static_cast(modifiers + OrthancStone::KeyboardModifiers_Alt); - } - printf("key pressed : %c\n", key[0]); - viewport_->KeyPressed(key[0], modifiers); + OrthancStone::KeyboardModifiers modifiers = OrthancStone::KeyboardModifiers_None; + if (isShiftPressed) { + modifiers = static_cast(modifiers + OrthancStone::KeyboardModifiers_Shift); } + if (isControlPressed) { + modifiers = static_cast(modifiers + OrthancStone::KeyboardModifiers_Control); + } + if (isAltPressed) { + modifiers = static_cast(modifiers + OrthancStone::KeyboardModifiers_Alt); + } + printf("key pressed : %c\n", key[0]); + viewport->KeyPressed(key[0], modifiers); } - void EMSCRIPTEN_KEEPALIVE ViewportMouseUp() + void EMSCRIPTEN_KEEPALIVE ViewportMouseUp(ViewportHandle viewport) { - if (viewport_.get() != NULL) - { - viewport_->MouseUp(); - } + viewport->MouseUp(); } - void EMSCRIPTEN_KEEPALIVE ViewportMouseEnter() + void EMSCRIPTEN_KEEPALIVE ViewportMouseEnter(ViewportHandle viewport) { - if (viewport_.get() != NULL) - { - viewport_->MouseEnter(); - } + viewport->MouseEnter(); } - void EMSCRIPTEN_KEEPALIVE ViewportMouseLeave() + void EMSCRIPTEN_KEEPALIVE ViewportMouseLeave(ViewportHandle viewport) { - if (viewport_.get() != NULL) - { - viewport_->MouseLeave(); - } + viewport->MouseLeave(); } diff -r c8f11437a6fd -r 210c1ce8e1a6 Platforms/WebAssembly/Defaults.h --- a/Platforms/WebAssembly/Defaults.h Thu Jun 14 13:28:40 2018 +0200 +++ b/Platforms/WebAssembly/Defaults.h Thu Jun 14 15:06:29 2018 +0200 @@ -20,8 +20,6 @@ // C++ methods accessible from JS extern void EMSCRIPTEN_KEEPALIVE CreateWasmApplication(ViewportHandle viewport); -// extern void EMSCRIPTEN_KEEPALIVE SetStartupParameter(const char* keyc, const char* value); -// extern void EMSCRIPTEN_KEEPALIVE StartWasmApplication(); #ifdef __cplusplus } diff -r c8f11437a6fd -r 210c1ce8e1a6 Platforms/WebAssembly/wasm-application.js --- a/Platforms/WebAssembly/wasm-application.js Thu Jun 14 13:28:40 2018 +0200 +++ b/Platforms/WebAssembly/wasm-application.js Thu Jun 14 15:06:29 2018 +0200 @@ -87,7 +87,7 @@ } } - StartWasmApplication(); + StartWasmApplication(viewport.GetCppViewport()); /************************************** */ UpdateContentThread(); diff -r c8f11437a6fd -r 210c1ce8e1a6 Platforms/WebAssembly/wasm-viewport.ts --- a/Platforms/WebAssembly/wasm-viewport.ts Thu Jun 14 13:28:40 2018 +0200 +++ b/Platforms/WebAssembly/wasm-viewport.ts Thu Jun 14 15:06:29 2018 +0200 @@ -37,15 +37,19 @@ this.htmlCanvas_ = document.getElementById(this.canvasId_) as HTMLCanvasElement; this.context_ = this.htmlCanvas_.getContext('2d'); - this.ViewportSetSize = this.module_.cwrap('ViewportSetSize', null, [ 'number', 'number' ]); + this.ViewportSetSize = this.module_.cwrap('ViewportSetSize', null, [ 'any', 'number', 'number' ]); this.ViewportRender = this.module_.cwrap('ViewportRender', null, [ 'any', 'number', 'number', 'number' ]); - this.ViewportMouseDown = this.module_.cwrap('ViewportMouseDown', null, [ 'number', 'number', 'number', 'number' ]); - this.ViewportMouseMove = this.module_.cwrap('ViewportMouseMove', null, [ 'number', 'number' ]); - this.ViewportMouseUp = this.module_.cwrap('ViewportMouseUp', null, [ ]); - this.ViewportMouseEnter = this.module_.cwrap('ViewportMouseEnter', null, []); - this.ViewportMouseLeave = this.module_.cwrap('ViewportMouseLeave', null, []); - this.ViewportMouseWheel = this.module_.cwrap('ViewportMouseWheel', null, [ 'number', 'number', 'number', 'number' ]); - this.ViewportKeyPressed = this.module_.cwrap('ViewportKeyPressed', null, [ 'string', 'number', 'number' ]); + this.ViewportMouseDown = this.module_.cwrap('ViewportMouseDown', null, [ 'any', 'number', 'number', 'number', 'number' ]); + this.ViewportMouseMove = this.module_.cwrap('ViewportMouseMove', null, [ 'any', 'number', 'number' ]); + this.ViewportMouseUp = this.module_.cwrap('ViewportMouseUp', null, [ 'any' ]); + this.ViewportMouseEnter = this.module_.cwrap('ViewportMouseEnter', null, [ 'any' ]); + this.ViewportMouseLeave = this.module_.cwrap('ViewportMouseLeave', null, [ 'any' ]); + this.ViewportMouseWheel = this.module_.cwrap('ViewportMouseWheel', null, [ 'any', 'number', 'number', 'number', 'number' ]); + this.ViewportKeyPressed = this.module_.cwrap('ViewportKeyPressed', null, [ 'any', 'string', 'number', 'number' ]); + } + + public GetCppViewport() : any { + return this.pimpl_; } public Redraw() { @@ -76,12 +80,12 @@ this.imageData_ = null; } - this.htmlCanvas_.width = window.innerWidth; + this.htmlCanvas_.width = window.innerWidth; this.htmlCanvas_.height = window.innerHeight; if (this.imageData_ === null) { this.imageData_ = this.context_.getImageData(0, 0, this.htmlCanvas_.width, this.htmlCanvas_.height); - this.ViewportSetSize(this.htmlCanvas_.width, this.htmlCanvas_.height); + this.ViewportSetSize(this.pimpl_, this.htmlCanvas_.width, this.htmlCanvas_.height); if (this.renderingBuffer_ != null) { this.module_._free(this.renderingBuffer_); @@ -100,53 +104,53 @@ // Force the rendering of the viewport for the first time this.Resize(); + var that : WasmViewport = this; // Register an event listener to call the Resize() function // each time the window is resized. - window.addEventListener('resize', this.Resize, false); + window.addEventListener('resize', function(event) { + that.Resize(); + }, false); - var that = this; - this.htmlCanvas_.addEventListener('contextmenu', function(event) { // Prevent right click on the canvas event.preventDefault(); }, false); this.htmlCanvas_.addEventListener('mouseleave', function(event) { - that.ViewportMouseLeave(); + that.ViewportMouseLeave(that.pimpl_); }); this.htmlCanvas_.addEventListener('mouseenter', function(event) { - that.ViewportMouseEnter(); + that.ViewportMouseEnter(that.pimpl_); }); this.htmlCanvas_.addEventListener('mousedown', function(event) { var x = event.pageX - this.offsetLeft; var y = event.pageY - this.offsetTop; - that.ViewportMouseDown(event.button, x, y, 0 /* TODO */); + that.ViewportMouseDown(that.pimpl_, event.button, x, y, 0 /* TODO */); }); this.htmlCanvas_.addEventListener('mousemove', function(event) { var x = event.pageX - this.offsetLeft; var y = event.pageY - this.offsetTop; - that.ViewportMouseMove(x, y); + that.ViewportMouseMove(that.pimpl_, x, y); }); this.htmlCanvas_.addEventListener('mouseup', function(event) { - that.ViewportMouseUp(); + that.ViewportMouseUp(that.pimpl_); }); window.addEventListener('keydown', function(event) { - that.ViewportKeyPressed(event.key, event.shiftKey, event.ctrlKey, event.altKey); + that.ViewportKeyPressed(that.pimpl_, event.key, event.shiftKey, event.ctrlKey, event.altKey); }); this.htmlCanvas_.addEventListener('wheel', function(event) { var x = event.pageX - this.offsetLeft; var y = event.pageY - this.offsetTop; - that.ViewportMouseWheel(event.deltaY, x, y, event.ctrlKey); + that.ViewportMouseWheel(that.pimpl_, event.deltaY, x, y, event.ctrlKey); event.preventDefault(); }); - var that = this; this.htmlCanvas_.addEventListener('touchstart', function(event) { that.ResetTouch(); }); @@ -158,26 +162,28 @@ this.htmlCanvas_.addEventListener('touchmove', function(event) { if (that.touchTranslation_.length == 2) { var t = that.GetTouchTranslation(event); - that.ViewportMouseMove(t[0], t[1]); + that.ViewportMouseMove(that.pimpl_, t[0], t[1]); } else if (that.touchZoom_.length == 3) { var z0 = that.touchZoom_; var z1 = that.GetTouchZoom(event); - that.ViewportMouseMove(z0[0], z0[1] - z0[2] + z1[2]); + that.ViewportMouseMove(that.pimpl_, z0[0], z0[1] - z0[2] + z1[2]); } else { // Realize the gesture event if (event.targetTouches.length == 1) { // Exactly one finger inside the canvas => Setup a translation that.touchTranslation_ = that.GetTouchTranslation(event); - that.ViewportMouseDown(1 /* middle button */, + that.ViewportMouseDown(that.pimpl_, + 1 /* middle button */, that.touchTranslation_[0], that.touchTranslation_[1], 0); } else if (event.targetTouches.length == 2) { // Exactly 2 fingers inside the canvas => Setup a pinch/zoom that.touchZoom_ = that.GetTouchZoom(event); var z0 = that.touchZoom_; - that.ViewportMouseDown(2 /* right button */, + that.ViewportMouseDown(that.pimpl_, + 2 /* right button */, z0[0], z0[1], 0); } @@ -188,7 +194,7 @@ public ResetTouch() { if (this.touchTranslation_ || this.touchZoom_) { - this.ViewportMouseUp(); + this.ViewportMouseUp(this.pimpl_); } this.touchTranslation_ = false;