view Platforms/WebAssembly/Defaults.cpp @ 223:d30a10d574ec am

refactoring continued - not working
author am@osimis.io
date Thu, 14 Jun 2018 10:57:02 +0200
parents 84844649a8fd
children c8f11437a6fd
line wrap: on
line source

#include "Defaults.h"

#include "WasmWebService.h"
#include <Framework/dev.h>
#include "Framework/Widgets/TestCairoWidget.h"
#include <Framework/Viewport/WidgetViewport.h>
#include <Framework/Widgets/LayerWidget.h>

static unsigned int width_ = 0;
static unsigned int height_ = 0;

/**********************************/

static std::auto_ptr<OrthancStone::BasicWasmApplication> application;
static std::shared_ptr<OrthancStone::WidgetViewport> viewport_;
static OrthancStone::ChangeObserver changeObserver_;
static OrthancStone::StatusBar statusBar_;


#ifdef __cplusplus
extern "C" {
#endif

  using namespace OrthancStone;
  
  void EMSCRIPTEN_KEEPALIVE CreateWasmApplication() {

    printf("CreateWasmApplication\n");
    viewport_.reset(new OrthancStone::WidgetViewport);
    viewport_->SetStatusBar(statusBar_);
    viewport_->Register(changeObserver_);


    application.reset(CreateUserApplication());

    boost::program_options::options_description options;
    application->DeclareStartupOptions(options);
  }

  void EMSCRIPTEN_KEEPALIVE SetStartupParameter(const char* keyc,
                                                  const char* value) {
    application->SetStartupParameter(keyc, value);
  }

  void EMSCRIPTEN_KEEPALIVE StartWasmApplication() {

    printf("StartWasmApplication\n");

    // recreate a command line from uri arguments and parse it
    boost::program_options::variables_map parameters;
    application->GetStartupParameters(parameters);

    BasicWasmApplicationContext& context = dynamic_cast<BasicWasmApplicationContext&>(application->CreateApplicationContext(OrthancStone::WasmWebService::GetInstance(), viewport_));;
    application->Initialize(statusBar_, parameters);

    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();
    }

  }
  

  void EMSCRIPTEN_KEEPALIVE ViewportSetSize(unsigned int width, unsigned int height)
  {
    width_ = width;
    height_ = height;
    
    if (viewport_.get() != NULL)
    {
      viewport_->SetSize(width, height);
    }
  }

  int EMSCRIPTEN_KEEPALIVE ViewportRender(unsigned int width,
                                          unsigned int height,
                                          uint8_t* data)
  {
    changeObserver_.Reset();

    //printf("ViewportRender called %dx%d\n", width, height);
    if (width == 0 ||
        height == 0)
    {
      return 1;
    }

    Orthanc::ImageAccessor surface;
    surface.AssignWritable(Orthanc::PixelFormat_BGRA32, width, height, 4 * width, data);

    if (viewport_.get() != NULL)
    {
      viewport_->Render(surface);
    }

    // Convert from BGRA32 memory layout (only color mode supported by
    // Cairo, which corresponds to CAIRO_FORMAT_ARGB32) to RGBA32 (as
    // expected by HTML5 canvas). This simply amounts to swapping the
    // B and R channels.
    uint8_t* p = data;
    for (unsigned int y = 0; y < height; y++) {
      for (unsigned int x = 0; x < width; x++) {
        uint8_t tmp = p[0];
        p[0] = p[2];
        p[2] = tmp;
        
        p += 4;
      }
    }

    return 1;
  }


  void EMSCRIPTEN_KEEPALIVE ViewportMouseDown(unsigned int rawButton,
                                              int x,
                                              int y,
                                              unsigned int rawModifiers)
  {
    OrthancStone::MouseButton button;
    switch (rawButton)
    {
      case 0:
        button = OrthancStone::MouseButton_Left;
        break;

      case 1:
        button = OrthancStone::MouseButton_Middle;
        break;

      case 2:
        button = OrthancStone::MouseButton_Right;
        break;

      default:
        return;  // Unknown button
    }

    if (viewport_.get() != NULL)
    {
      viewport_->MouseDown(button, x, y, OrthancStone::KeyboardModifiers_None /* TODO */);
    }
  }
  

  void EMSCRIPTEN_KEEPALIVE ViewportMouseWheel(int deltaY,
                                               int x,
                                               int y,
                                               int isControl)
  {
    if (viewport_.get() != NULL &&
        deltaY != 0)
    {
      OrthancStone::MouseWheelDirection direction = (deltaY < 0 ?
                                                     OrthancStone::MouseWheelDirection_Up :
                                                     OrthancStone::MouseWheelDirection_Down);
      OrthancStone::KeyboardModifiers modifiers = OrthancStone::KeyboardModifiers_None;

      if (isControl != 0)
      {
        modifiers = OrthancStone::KeyboardModifiers_Control;
      }

      viewport_->MouseWheel(direction, x, y, modifiers);
    }
  }
  

  void EMSCRIPTEN_KEEPALIVE ViewportMouseMove(int x,
                                              int y)
  {
    if (viewport_.get() != NULL)
    {
      viewport_->MouseMove(x, y);
    }
  }
  
  void EMSCRIPTEN_KEEPALIVE ViewportKeyPressed(const char* key, 
                                               bool isShiftPressed, 
                                               bool isControlPressed,
                                               bool isAltPressed)
                                               
  {
    if (viewport_.get() != NULL)
    {
      OrthancStone::KeyboardModifiers modifiers = OrthancStone::KeyboardModifiers_None;
      if (isShiftPressed) {
        modifiers = static_cast<OrthancStone::KeyboardModifiers>(modifiers + OrthancStone::KeyboardModifiers_Shift);
      }
      if (isControlPressed) {
        modifiers = static_cast<OrthancStone::KeyboardModifiers>(modifiers + OrthancStone::KeyboardModifiers_Control);
      }
      if (isAltPressed) {
        modifiers = static_cast<OrthancStone::KeyboardModifiers>(modifiers + OrthancStone::KeyboardModifiers_Alt);
      }
      printf("key pressed : %c\n", key[0]);
      viewport_->KeyPressed(key[0], modifiers);
    }
  }
  

  void EMSCRIPTEN_KEEPALIVE ViewportMouseUp()
  {
    if (viewport_.get() != NULL)
    {
      viewport_->MouseUp();
    }
  }
  

  void EMSCRIPTEN_KEEPALIVE ViewportMouseEnter()
  {
    if (viewport_.get() != NULL)
    {
      viewport_->MouseEnter();
    }
  }
  

  void EMSCRIPTEN_KEEPALIVE ViewportMouseLeave()
  {
    if (viewport_.get() != NULL)
    {
      viewport_->MouseLeave();
    }
  }


#ifdef __cplusplus
}
#endif