comparison Applications/StoneWebViewer/WebAssembly/StoneWebViewer.cpp @ 1720:b8d19f53aaca

display the instance number, and the wc/ww info (work-in-progress)
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 01 Dec 2020 12:13:43 +0100
parents 9a1f79d21a3f
children d4a8e2b19a65
comparison
equal deleted inserted replaced
1719:9a1f79d21a3f 1720:b8d19f53aaca
1175 virtual void SignalSeriesDetailsReady(const ViewerViewport& viewport) = 0; 1175 virtual void SignalSeriesDetailsReady(const ViewerViewport& viewport) = 0;
1176 1176
1177 virtual void SignalFrameUpdated(const ViewerViewport& viewport, 1177 virtual void SignalFrameUpdated(const ViewerViewport& viewport,
1178 size_t currentFrame, 1178 size_t currentFrame,
1179 size_t countFrames, 1179 size_t countFrames,
1180 DisplayedFrameQuality quality) = 0; 1180 DisplayedFrameQuality quality,
1181 unsigned int instanceNumber) = 0;
1181 1182
1182 virtual void SignalCrosshair(const ViewerViewport& viewport, 1183 virtual void SignalCrosshair(const ViewerViewport& viewport,
1183 const OrthancStone::Vector& click) = 0; 1184 const OrthancStone::Vector& click) = 0;
1184 1185
1185 virtual void SignalSynchronizedBrowsing(const ViewerViewport& viewport, 1186 virtual void SignalSynchronizedBrowsing(const ViewerViewport& viewport,
1186 const OrthancStone::Vector& click, 1187 const OrthancStone::Vector& click,
1187 const OrthancStone::Vector& normal) = 0; 1188 const OrthancStone::Vector& normal) = 0;
1189
1190 virtual void SignalWindowingUpdated(const ViewerViewport& viewport,
1191 double windowingCenter,
1192 double windowingWidth) = 0;
1188 }; 1193 };
1189 1194
1190 private: 1195 private:
1191 static const int LAYER_TEXTURE = 0; 1196 static const int LAYER_TEXTURE = 0;
1192 static const int LAYER_REFERENCE_LINES = 1; 1197 static const int LAYER_REFERENCE_LINES = 1;
1653 } 1658 }
1654 } 1659 }
1655 1660
1656 ScheduleNextPrefetch(); 1661 ScheduleNextPrefetch();
1657 1662
1658 if (observer_.get() != NULL) 1663 if (frames_.get() != NULL &&
1659 { 1664 cursor_.get() != NULL &&
1660 observer_->SignalFrameUpdated(*this, cursorIndex, frames_->GetFramesCount(), quality); 1665 observer_.get() != NULL)
1666 {
1667 const Orthanc::DicomMap& instance = frames_->GetInstanceOfFrame(cursor_->GetCurrentIndex()).GetTags();
1668
1669 uint32_t instanceNumber;
1670 if (!instance.ParseUnsignedInteger32(instanceNumber, Orthanc::DICOM_TAG_INSTANCE_NUMBER))
1671 {
1672 instanceNumber = 0;
1673 }
1674
1675 observer_->SignalFrameUpdated(*this, cursorIndex, frames_->GetFramesCount(), quality, instanceNumber);
1661 } 1676 }
1662 } 1677 }
1663 1678
1664 1679
1665 void RenderCurrentScene(const Orthanc::ImageAccessor& frame, 1680 void RenderCurrentScene(const Orthanc::ImageAccessor& frame,
2139 prefetchQueue_.clear(); 2154 prefetchQueue_.clear();
2140 2155
2141 if (observer_.get() != NULL) 2156 if (observer_.get() != NULL)
2142 { 2157 {
2143 observer_->SignalFrameUpdated(*this, cursor_->GetCurrentIndex(), 2158 observer_->SignalFrameUpdated(*this, cursor_->GetCurrentIndex(),
2144 frames_->GetFramesCount(), DisplayedFrameQuality_None); 2159 frames_->GetFramesCount(), DisplayedFrameQuality_None, 0);
2145 } 2160 }
2146 2161
2147 centralPhysicalWidth_ = 1; 2162 centralPhysicalWidth_ = 1;
2148 centralPhysicalHeight_ = 1; 2163 centralPhysicalHeight_ = 1;
2149 2164
2404 { 2419 {
2405 assert(windowingPresetCenters_.size() == windowingPresetWidths_.size()); 2420 assert(windowingPresetCenters_.size() == windowingPresetWidths_.size());
2406 2421
2407 if (windowingPresetCenters_.empty()) 2422 if (windowingPresetCenters_.empty())
2408 { 2423 {
2409 windowingCenter_ = 128; 2424 SetWindowing(128, 256);
2410 windowingWidth_ = 256;
2411 } 2425 }
2412 else 2426 else
2413 { 2427 {
2414 windowingCenter_ = windowingPresetCenters_[0]; 2428 SetWindowing(windowingPresetCenters_[0], windowingPresetWidths_[0]);
2415 windowingWidth_ = windowingPresetWidths_[0];
2416 } 2429 }
2417 } 2430 }
2418 2431
2419 void SetWindowing(float windowingCenter, 2432 void SetWindowing(float windowingCenter,
2420 float windowingWidth) 2433 float windowingWidth)
2421 { 2434 {
2422 windowingCenter_ = windowingCenter; 2435 windowingCenter_ = windowingCenter;
2423 windowingWidth_ = windowingWidth; 2436 windowingWidth_ = windowingWidth;
2424 UpdateCurrentTextureParameters(); 2437 UpdateCurrentTextureParameters();
2438
2439 if (observer_.get() != NULL)
2440 {
2441 observer_->SignalWindowingUpdated(*this, windowingCenter, windowingWidth);
2442 }
2425 } 2443 }
2426 2444
2427 void FlipX() 2445 void FlipX()
2428 { 2446 {
2429 flipX_ = !flipX_; 2447 flipX_ = !flipX_;
2745 } 2763 }
2746 2764
2747 virtual void SignalFrameUpdated(const ViewerViewport& viewport, 2765 virtual void SignalFrameUpdated(const ViewerViewport& viewport,
2748 size_t currentFrame, 2766 size_t currentFrame,
2749 size_t countFrames, 2767 size_t countFrames,
2750 DisplayedFrameQuality quality) ORTHANC_OVERRIDE 2768 DisplayedFrameQuality quality,
2769 unsigned int instanceNumber) ORTHANC_OVERRIDE
2751 { 2770 {
2752 EM_ASM({ 2771 EM_ASM({
2753 const customEvent = document.createEvent("CustomEvent"); 2772 const customEvent = document.createEvent("CustomEvent");
2754 customEvent.initCustomEvent("FrameUpdated", false, false, 2773 customEvent.initCustomEvent("FrameUpdated", false, false,
2755 { "canvasId" : UTF8ToString($0), 2774 { "canvasId" : UTF8ToString($0),
2756 "currentFrame" : $1, 2775 "currentFrame" : $1,
2757 "numberOfFrames" : $2, 2776 "numberOfFrames" : $2,
2758 "quality" : $3 }); 2777 "quality" : $3,
2778 "instanceNumber" : $4 });
2759 window.dispatchEvent(customEvent); 2779 window.dispatchEvent(customEvent);
2760 }, 2780 },
2761 viewport.GetCanvasId().c_str(), 2781 viewport.GetCanvasId().c_str(),
2762 static_cast<int>(currentFrame), 2782 static_cast<int>(currentFrame),
2763 static_cast<int>(countFrames), 2783 static_cast<int>(countFrames),
2764 quality); 2784 quality, instanceNumber);
2765 2785
2766 UpdateReferenceLines(); 2786 UpdateReferenceLines();
2767 } 2787 }
2768 2788
2769 virtual void SignalCrosshair(const ViewerViewport& viewport, 2789 virtual void SignalCrosshair(const ViewerViewport& viewport,
2833 "thumbnail" : UTF8ToString($1) }); 2853 "thumbnail" : UTF8ToString($1) });
2834 window.dispatchEvent(customEvent); 2854 window.dispatchEvent(customEvent);
2835 }, 2855 },
2836 sopInstanceUid.c_str(), 2856 sopInstanceUid.c_str(),
2837 dataUriScheme.c_str()); 2857 dataUriScheme.c_str());
2858 }
2859
2860 virtual void SignalWindowingUpdated(const ViewerViewport& viewport,
2861 double windowingCenter,
2862 double windowingWidth) ORTHANC_OVERRIDE
2863 {
2864 EM_ASM({
2865 const customEvent = document.createEvent("CustomEvent");
2866 customEvent.initCustomEvent("WindowingUpdated", false, false,
2867 { "canvasId" : UTF8ToString($0),
2868 "windowingCenter" : $1,
2869 "windowingWidth" : $2 });
2870 window.dispatchEvent(customEvent);
2871 },
2872 viewport.GetCanvasId().c_str(),
2873 static_cast<int>(boost::math::iround<double>(windowingCenter)),
2874 static_cast<int>(boost::math::iround<double>(windowingWidth)));
2875
2876 UpdateReferenceLines();
2838 } 2877 }
2839 }; 2878 };
2840 2879
2841 2880
2842 2881