# HG changeset patch # User Sebastien Jodogne # Date 1647874229 -3600 # Node ID ed4831e08961eb85bc6325f2f1e286572577f098 # Parent fc6009c43bd97aba1373ef69bac5e32dcb5bcdc4 added DicomInstanceParameters::CreateOverlayTexture() diff -r fc6009c43bd9 -r ed4831e08961 OrthancStone/Sources/Scene2D/LookupTableTextureSceneLayer.cpp --- a/OrthancStone/Sources/Scene2D/LookupTableTextureSceneLayer.cpp Mon Mar 21 12:12:25 2022 +0100 +++ b/OrthancStone/Sources/Scene2D/LookupTableTextureSceneLayer.cpp Mon Mar 21 15:50:29 2022 +0100 @@ -33,13 +33,14 @@ LookupTableTextureSceneLayer::LookupTableTextureSceneLayer(const Orthanc::ImageAccessor& texture) : applyLog_(false) { + if (texture.GetFormat() == Orthanc::PixelFormat_Float32) + { + SetTexture(Orthanc::Image::Clone(texture)); + } + else { std::unique_ptr t( - new Orthanc::Image(Orthanc::PixelFormat_Float32, - texture.GetWidth(), - texture.GetHeight(), - false)); - + new Orthanc::Image(Orthanc::PixelFormat_Float32, texture.GetWidth(), texture.GetHeight(), false)); Orthanc::ImageProcessing::Convert(*t, texture); SetTexture(t.release()); } diff -r fc6009c43bd9 -r ed4831e08961 OrthancStone/Sources/Toolbox/DicomInstanceParameters.cpp --- a/OrthancStone/Sources/Toolbox/DicomInstanceParameters.cpp Mon Mar 21 12:12:25 2022 +0100 +++ b/OrthancStone/Sources/Toolbox/DicomInstanceParameters.cpp Mon Mar 21 15:50:29 2022 +0100 @@ -569,8 +569,8 @@ } - TextureBaseSceneLayer* DicomInstanceParameters::CreateTexture - (const Orthanc::ImageAccessor& pixelData) const + TextureBaseSceneLayer* DicomInstanceParameters::CreateTexture( + const Orthanc::ImageAccessor& pixelData) const { // { // const Orthanc::ImageAccessor& source = pixelData; @@ -647,23 +647,49 @@ } - LookupTableTextureSceneLayer* DicomInstanceParameters::CreateLookupTableTexture - (const Orthanc::ImageAccessor& pixelData) const + LookupTableTextureSceneLayer* DicomInstanceParameters::CreateLookupTableTexture( + const Orthanc::ImageAccessor& pixelData) const { - std::unique_ptr texture; - + std::unique_ptr texture; + if (pixelData.GetFormat() == Orthanc::PixelFormat_Float32) { - return new LookupTableTextureSceneLayer(pixelData); + texture.reset(new LookupTableTextureSceneLayer(pixelData)); } else { std::unique_ptr converted(ConvertToFloat(pixelData)); - return new LookupTableTextureSceneLayer(*converted); + texture.reset(new LookupTableTextureSceneLayer(*converted)); } + + if (HasPixelSpacing()) + { + texture->SetPixelSpacing(GetPixelSpacingX(), GetPixelSpacingY()); + } + + return texture.release(); } + LookupTableTextureSceneLayer* DicomInstanceParameters::CreateOverlayTexture( + int originX, + int originY, + const Orthanc::ImageAccessor& overlay) const + { + if (overlay.GetFormat() != Orthanc::PixelFormat_Grayscale8) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); + } + + std::unique_ptr texture(CreateLookupTableTexture(overlay)); + + texture->SetOrigin(static_cast(originX - 1) * texture->GetPixelSpacingX(), + static_cast(originY - 1) * texture->GetPixelSpacingY()); + + return texture.release(); + } + + unsigned int DicomInstanceParameters::GetIndexInSeries() const { if (data_.hasIndexInSeries_) diff -r fc6009c43bd9 -r ed4831e08961 OrthancStone/Sources/Toolbox/DicomInstanceParameters.h --- a/OrthancStone/Sources/Toolbox/DicomInstanceParameters.h Mon Mar 21 12:12:25 2022 +0100 +++ b/OrthancStone/Sources/Toolbox/DicomInstanceParameters.h Mon Mar 21 15:50:29 2022 +0100 @@ -202,6 +202,13 @@ LookupTableTextureSceneLayer* CreateLookupTableTexture(const Orthanc::ImageAccessor& pixelData) const; + // NB: According to the DICOM standard, the top-left pixel has + // (originX, originY) equals to (1,1): + // https://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.9.2.html + LookupTableTextureSceneLayer* CreateOverlayTexture(int originX, + int originY, + const Orthanc::ImageAccessor& overlay) const; + bool HasIndexInSeries() const { return data_.hasIndexInSeries_;