Mercurial > hg > orthanc-stone
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)