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