# HG changeset patch # User Sebastien Jodogne # Date 1559313032 -7200 # Node ID 0965b665c653e0bdf93dfc9f5be5b9704e08596e # Parent c51b12fb4f345bc9623eb370e7539eb8186748d2 windowing and linear interpolation in GrayscaleStyleConfigurator diff -r c51b12fb4f34 -r 0965b665c653 Framework/Scene2D/GrayscaleStyleConfigurator.cpp --- a/Framework/Scene2D/GrayscaleStyleConfigurator.cpp Fri May 31 15:21:50 2019 +0200 +++ b/Framework/Scene2D/GrayscaleStyleConfigurator.cpp Fri May 31 16:30:32 2019 +0200 @@ -21,12 +21,51 @@ #include "GrayscaleStyleConfigurator.h" +#include "FloatTextureSceneLayer.h" + #include namespace OrthancStone { - TextureBaseSceneLayer* GrayscaleStyleConfigurator::CreateTextureFromImage(const Orthanc::ImageAccessor& image) const + void GrayscaleStyleConfigurator::SetLinearInterpolation(bool enabled) + { + linearInterpolation_ = enabled; + revision_++; + } + + TextureBaseSceneLayer* GrayscaleStyleConfigurator::CreateTextureFromImage( + const Orthanc::ImageAccessor& image) const { throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); } + + TextureBaseSceneLayer* GrayscaleStyleConfigurator::CreateTextureFromDicom( + const Orthanc::ImageAccessor& frame, + const DicomInstanceParameters& parameters) const + { + std::auto_ptr layer(parameters.CreateTexture(frame)); + + if (layer.get() == NULL || + layer->GetTexture().GetFormat() != Orthanc::PixelFormat_Float32) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + else + { + return layer.release(); + } + } + + + void GrayscaleStyleConfigurator::ApplyStyle(ISceneLayer& layer) const + { + FloatTextureSceneLayer& l = dynamic_cast(layer); + + l.SetLinearInterpolation(linearInterpolation_); + + if (hasWindowing_) + { + l.SetWindowing(windowing_); + } + } } diff -r c51b12fb4f34 -r 0965b665c653 Framework/Scene2D/GrayscaleStyleConfigurator.h --- a/Framework/Scene2D/GrayscaleStyleConfigurator.h Fri May 31 15:21:50 2019 +0200 +++ b/Framework/Scene2D/GrayscaleStyleConfigurator.h Fri May 31 16:30:32 2019 +0200 @@ -32,14 +32,32 @@ class GrayscaleStyleConfigurator : public ILayerStyleConfigurator { private: - uint64_t revision_; + uint64_t revision_; + bool linearInterpolation_; + bool hasWindowing_; + ImageWindowing windowing_; - // TODO - Add windowing + // TODO - Add custom windowing public: GrayscaleStyleConfigurator() : - revision_(0) + revision_(0), + linearInterpolation_(false), + hasWindowing_(false) + { + } + + void SetWindowing(ImageWindowing windowing) { + hasWindowing_ = true; + windowing_ = windowing; + } + + void SetLinearInterpolation(bool enabled); + + bool IsLinearInterpolation() const + { + return linearInterpolation_; } virtual uint64_t GetRevision() const @@ -47,16 +65,13 @@ return revision_; } - virtual TextureBaseSceneLayer* CreateTextureFromImage(const Orthanc::ImageAccessor& image) const; + virtual TextureBaseSceneLayer* CreateTextureFromImage( + const Orthanc::ImageAccessor& image) const; - virtual TextureBaseSceneLayer* CreateTextureFromDicom(const Orthanc::ImageAccessor& frame, - const DicomInstanceParameters& parameters) const - { - return parameters.CreateTexture(frame); - } + virtual TextureBaseSceneLayer* CreateTextureFromDicom( + const Orthanc::ImageAccessor& frame, + const DicomInstanceParameters& parameters) const; - virtual void ApplyStyle(ISceneLayer& layer) const - { - } + virtual void ApplyStyle(ISceneLayer& layer) const; }; } diff -r c51b12fb4f34 -r 0965b665c653 Samples/WebAssembly/BasicMPR.cpp --- a/Samples/WebAssembly/BasicMPR.cpp Fri May 31 15:21:50 2019 +0200 +++ b/Samples/WebAssembly/BasicMPR.cpp Fri May 31 16:30:32 2019 +0200 @@ -370,15 +370,30 @@ loader_.reset(new OrthancStone::OrthancSeriesVolumeProgressiveLoader(ct_, oracle_, oracle_)); widget1_.reset(new OrthancStone::VolumeSlicerWidget(broker_, "mycanvas1", OrthancStone::VolumeProjection_Axial)); - widget1_->SetSlicer(0, loader_, *loader_, new OrthancStone::GrayscaleStyleConfigurator); + { + std::auto_ptr style(new OrthancStone::GrayscaleStyleConfigurator); + style->SetLinearInterpolation(true); + style->SetWindowing(OrthancStone::ImageWindowing_Bone); + widget1_->SetSlicer(0, loader_, *loader_, style.release()); + } widget1_->UpdateSize(); widget2_.reset(new OrthancStone::VolumeSlicerWidget(broker_, "mycanvas2", OrthancStone::VolumeProjection_Coronal)); - widget2_->SetSlicer(0, loader_, *loader_, new OrthancStone::GrayscaleStyleConfigurator); + { + std::auto_ptr style(new OrthancStone::GrayscaleStyleConfigurator); + style->SetLinearInterpolation(true); + style->SetWindowing(OrthancStone::ImageWindowing_Bone); + widget2_->SetSlicer(0, loader_, *loader_, style.release()); + } widget2_->UpdateSize(); widget3_.reset(new OrthancStone::VolumeSlicerWidget(broker_, "mycanvas3", OrthancStone::VolumeProjection_Sagittal)); - widget3_->SetSlicer(0, loader_, *loader_, new OrthancStone::GrayscaleStyleConfigurator); + { + std::auto_ptr style(new OrthancStone::GrayscaleStyleConfigurator); + style->SetLinearInterpolation(true); + style->SetWindowing(OrthancStone::ImageWindowing_Bone); + widget3_->SetSlicer(0, loader_, *loader_, style.release()); + } widget3_->UpdateSize(); emscripten_set_resize_callback("#window", NULL, false, OnWindowResize);