diff Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp @ 1681:f2e8b3ac1dcd

handling multiple windowing presets in the Stone web viewer
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 24 Nov 2020 18:08:07 +0100
parents 03afa09cfcf1
children 84fe7089ccaa
line wrap: on
line diff
--- a/Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp	Tue Nov 24 16:39:54 2020 +0100
+++ b/Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp	Tue Nov 24 18:08:07 2020 +0100
@@ -94,6 +94,7 @@
 #include <WebGLViewport.h>
 
 
+#include <boost/math/special_functions/round.hpp>
 #include <boost/make_shared.hpp>
 #include <stdio.h>
 
@@ -1102,27 +1103,25 @@
       {
         OrthancStone::DicomInstanceParameters params(dicom);
 
+        GetViewport().windowingPresetCenters_.resize(params.GetWindowingPresetsCount());
+        GetViewport().windowingPresetWidths_.resize(params.GetWindowingPresetsCount());
+
         for (size_t i = 0; i < params.GetWindowingPresetsCount(); i++)
         {
-          LOG(INFO) << "Preset windowing " << i << "/" << params.GetWindowingPresetsCount()
+          LOG(INFO) << "Preset windowing " << (i + 1) << "/" << params.GetWindowingPresetsCount()
                     << ": " << params.GetWindowingPresetCenter(i)
                     << "," << params.GetWindowingPresetWidth(i);
+
+          GetViewport().windowingPresetCenters_[i] = params.GetWindowingPresetCenter(i);
+          GetViewport().windowingPresetWidths_[i] = params.GetWindowingPresetWidth(i);
         }
 
-        // TODO - WINDOWING
-        if (params.GetWindowingPresetsCount() > 0)
-        {
-          GetViewport().presetWindowingCenter_ = params.GetWindowingPresetCenter(0);
-          GetViewport().presetWindowingWidth_ = params.GetWindowingPresetWidth(0);
-
-          GetViewport().windowingCenter_ = params.GetWindowingPresetCenter(0);
-          GetViewport().windowingWidth_ = params.GetWindowingPresetWidth(0);
-        }
-        else
+        if (params.GetWindowingPresetsCount() == 0)
         {
           LOG(INFO) << "No preset windowing";
-          GetViewport().ResetWindowingPreset();
         }
+
+        GetViewport().SetWindowingPreset();
       }
 
       uint32_t cineRate;
@@ -1367,8 +1366,8 @@
   std::unique_ptr<SeriesCursor>                cursor_;
   float                                        windowingCenter_;
   float                                        windowingWidth_;
-  float                                        presetWindowingCenter_;
-  float                                        presetWindowingWidth_;
+  std::vector<float>                           windowingPresetCenters_;
+  std::vector<float>                           windowingPresetWidths_;
   unsigned int                                 cineRate_;
   bool                                         inverted_;
   bool                                         flipX_;
@@ -1416,18 +1415,6 @@
   }
   
   
-  void ResetWindowingPreset()
-  {
-    presetWindowingCenter_ = 128;
-    presetWindowingWidth_ = 256;
-
-    windowingCenter_ = presetWindowingCenter_;
-    windowingWidth_ = presetWindowingWidth_;
-
-    inverted_ = false;
-  }
-
-
   void ClearViewport()
   {
     {
@@ -1794,7 +1781,7 @@
     emscripten_set_keydown_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, this, false, OnKey);
     emscripten_set_keyup_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, this, false, OnKey);
 
-    ResetWindowingPreset();
+    SetWindowingPreset();
   }
 
   static EM_BOOL OnKey(int eventType,
@@ -1896,13 +1883,14 @@
     flipY_ = false;
     fitNextContent_ = true;
     cineRate_ = DEFAULT_CINE_RATE;
-    
+    inverted_ = false;
+
     frames_.reset(frames);
     cursor_.reset(new SeriesCursor(frames_->GetFramesCount()));
 
     LOG(INFO) << "Number of frames in series: " << frames_->GetFramesCount();
 
-    ResetWindowingPreset();
+    SetWindowingPreset();
     ClearViewport();
     prefetchQueue_.clear();
 
@@ -2131,7 +2119,18 @@
 
   void SetWindowingPreset()
   {
-    SetWindowing(presetWindowingCenter_, presetWindowingWidth_);
+    assert(windowingPresetCenters_.size() == windowingPresetWidths_.size());
+    
+    if (windowingPresetCenters_.empty())
+    {
+      windowingCenter_ = 128;
+      windowingWidth_ = 256;
+    }
+    else
+    {
+      windowingCenter_ = windowingPresetCenters_[0];
+      windowingWidth_ = windowingPresetWidths_[0];
+    }
   }
 
   void SetWindowing(float windowingCenter,
@@ -2333,7 +2332,30 @@
 
   void FormatWindowingPresets(Json::Value& target) const
   {
+    assert(windowingPresetCenters_.size() == windowingPresetWidths_.size());
+
     target = Json::arrayValue;
+
+    for (size_t i = 0; i < windowingPresetCenters_.size(); i++)
+    {
+      const float c = windowingPresetCenters_[i];
+      const float w = windowingPresetWidths_[i];
+      
+      std::string name = "Preset";
+      if (windowingPresetCenters_.size() > 1)
+      {
+        name += " " + boost::lexical_cast<std::string>(i + 1);
+      }
+
+      Json::Value preset = Json::objectValue;
+      preset["name"] = name;
+      preset["info"] = ("C " + boost::lexical_cast<std::string>(boost::math::iround(c)) +
+                        ", W " + boost::lexical_cast<std::string>(boost::math::iround(w)));
+      preset["center"] = c;
+      preset["width"] = w;
+
+      target.append(preset);
+    }
   }
 };
 
@@ -2825,17 +2847,6 @@
 
 
   EMSCRIPTEN_KEEPALIVE
-  void SetWindowingPreset(const char* canvas)
-  {
-    try
-    {
-      GetViewport(canvas)->SetWindowingPreset();
-    }
-    EXTERN_CATCH_EXCEPTIONS;
-  }  
-
-
-  EMSCRIPTEN_KEEPALIVE
   void SetWindowing(const char* canvas,
                     int center,
                     int width)