[med-svn] [Git][med-team/gdcm][upstream] New upstream version 2.8.8
Gert Wollny
gitlab at salsa.debian.org
Sun Oct 28 17:03:22 GMT 2018
Gert Wollny pushed to branch upstream at Debian Med / gdcm
Commits:
fa93f977 by Gert Wollny at 2018-10-28T07:45:13Z
New upstream version 2.8.8
- - - - -
28 changed files:
- Applications/Cxx/gdcmimg.cxx
- Applications/Cxx/gdcminfo.cxx
- Applications/Cxx/gdcmpdf.cxx
- CMake/InstallMacros.cmake
- CMakeLists.txt
- Examples/Cxx/CMakeLists.txt
- + Examples/Cxx/PrintLUT.cxx
- Source/Common/gdcmCAPICryptographicMessageSyntax.cxx
- Source/Common/gdcmDirectory.cxx
- Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
- Source/DataDictionary/gdcmSOPClassUIDToIOD.cxx
- Source/DataDictionary/gdcmUIDs.h
- Source/DataStructureAndEncodingDefinition/gdcmSequenceOfItems.cxx
- Source/DataStructureAndEncodingDefinition/gdcmWriter.cxx
- Source/MediaStorageAndFileFormat/gdcmBitmap.cxx
- Source/MediaStorageAndFileFormat/gdcmDirectoryHelper.cxx
- Source/MediaStorageAndFileFormat/gdcmImageChangeTransferSyntax.cxx
- Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
- Source/MediaStorageAndFileFormat/gdcmJPEGLSCodec.cxx
- Source/MediaStorageAndFileFormat/gdcmLookupTable.cxx
- Source/MediaStorageAndFileFormat/gdcmLookupTable.h
- Source/MediaStorageAndFileFormat/gdcmPrinter.cxx
- Source/MediaStorageAndFileFormat/gdcmRLECodec.cxx
- Testing/Source/DataDictionary/Cxx/TestSOPClassUIDToIOD.cxx
- Testing/Source/MediaStorageAndFileFormat/Cxx/TestImageChangePlanarConfiguration.cxx
- Testing/Source/MediaStorageAndFileFormat/Cxx/TestPrinter1.cxx
- Utilities/VTK/CMakeLists.txt
- Wrapping/Python/gdcmswig.i
Changes:
=====================================
Applications/Cxx/gdcmimg.cxx
=====================================
@@ -858,7 +858,8 @@ int main (int argc, char *argv[])
|| gdcm::System::StrCaseCmp(inputextension,".rawl") == 0 // kakadu convention for raw little endian
|| gdcm::System::StrCaseCmp(inputextension,".gray") == 0 // imagemagick convention
|| gdcm::System::StrCaseCmp(inputextension,".bin") == 0 // openjp3d convention for raw little endian
- || gdcm::System::StrCaseCmp(inputextension,".rgb") == 0 ) // imagemagick convention
+ || gdcm::System::StrCaseCmp(inputextension,".rgb") == 0 // imagemagick convention
+ || gdcm::System::StrCaseCmp(inputextension,".yuv") == 0 ) // ffmpeg convention
{
if( !size[0] || !size[1] )
{
@@ -891,7 +892,7 @@ int main (int argc, char *argv[])
raw.SetPixelFormat( pf );
if( spp )
{
- if( pixelspp == 3 ) pi = gdcm::PhotometricInterpretation::RGB;
+ if( pixelspp == 3 && !pinter ) pi = gdcm::PhotometricInterpretation::RGB;
}
raw.SetPhotometricInterpretation( pi );
raw.SetNeedByteSwap( false );
=====================================
Applications/Cxx/gdcminfo.cxx
=====================================
@@ -189,7 +189,7 @@ static int checkdeflated(const char *name)
static std::string getInfoDate(Dict *infoDict, const char *key)
{
Object obj;
- char *s;
+ const char *s;
int year, mon, day, hour, min, sec, n;
struct tm tmStruct;
//char buf[256];
@@ -201,7 +201,8 @@ static std::string getInfoDate(Dict *infoDict, const char *key)
if (infoDict->lookup((char*)key, &obj)->isString())
#endif
{
- s = obj.getString()->getCString();
+ const GooString* gs = obj.getString();
+ s = gs->getCString();
if (s[0] == 'D' && s[1] == ':')
{
s += 2;
@@ -256,7 +257,7 @@ static std::string getInfoDate(Dict *infoDict, const char *key)
static std::string getInfoString(Dict *infoDict, const char *key, UnicodeMap *uMap)
{
Object obj;
- GooString *s1;
+ const GooString *s1;
GBool isUnicode;
Unicode u;
char buf[8];
@@ -429,6 +430,7 @@ static int ProcessOneFile( std::string const & filename, gdcm::Defs const & defs
if( md5sum )
{
+ int ret = 0;
char *buffer = new char[ pimage->GetBufferLength() ];
gdcm::ImageChangePlanarConfiguration icpc;
icpc.SetPlanarConfiguration( 0 );
@@ -449,9 +451,11 @@ static int ProcessOneFile( std::string const & filename, gdcm::Defs const & defs
}
else
{
- std::cout << "Problem decompressing file: " << filename << std::endl;
+ std::cerr << "Problem decompressing file: " << filename << std::endl;
+ ret = 1;
}
delete[] buffer;
+ return ret;
}
}
else if ( ms == gdcm::MediaStorage::EncapsulatedPDFStorage )
=====================================
Applications/Cxx/gdcmpdf.cxx
=====================================
@@ -37,7 +37,7 @@
static std::string getInfoDate(Dict *infoDict, const char *key)
{
Object obj;
- char *s;
+ const char *s;
int year, mon, day, hour, min, sec, n;
struct tm tmStruct;
//char buf[256];
@@ -49,7 +49,8 @@ static std::string getInfoDate(Dict *infoDict, const char *key)
if (infoDict->lookup((char*)key, &obj)->isString())
#endif
{
- s = obj.getString()->getCString();
+ const GooString* gs = obj.getString();
+ s = gs->getCString();
if (s[0] == 'D' && s[1] == ':')
{
s += 2;
@@ -104,7 +105,7 @@ static std::string getInfoDate(Dict *infoDict, const char *key)
static std::string getInfoString(Dict *infoDict, const char *key, UnicodeMap *uMap, GBool & unicode)
{
Object obj;
- GooString *s1;
+ const GooString *s1;
GBool isUnicode = gFalse;
Unicode u;
char buf[8];
=====================================
CMake/InstallMacros.cmake
=====================================
@@ -41,6 +41,7 @@ macro(install_library library)
EXPORT ${GDCM_TARGETS_NAME}
RUNTIME DESTINATION ${GDCM_INSTALL_BIN_DIR} COMPONENT Applications
LIBRARY DESTINATION ${GDCM_INSTALL_LIB_DIR} COMPONENT Libraries ${NAMELINK_SKIP}
+ INCLUDES DESTINATION ${GDCM_INSTALL_INCLUDE_DIR}
ARCHIVE DESTINATION ${GDCM_INSTALL_LIB_DIR} COMPONENT DebugDevel
)
# need recent cmake: http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=cbe7e8fa
=====================================
CMakeLists.txt
=====================================
@@ -14,6 +14,9 @@ endif()
if( POLICY CMP0063 )
cmake_policy(SET CMP0063 NEW)
endif()
+if( POLICY CMP0074 )
+ cmake_policy(SET CMP0074 NEW)
+endif()
project(GDCM)
set(CMAKE_CXX_STANDARD 98)
set(CMAKE_CXX_EXTENSIONS OFF)
@@ -40,7 +43,7 @@ set(GDCM_PACKAGE_CONTACT "GDCM Developers <gdcm-developers at lists.sourceforge.net
#----------------------------------------------------------------------------
set(GDCM_MAJOR_VERSION 2)
set(GDCM_MINOR_VERSION 8)
-set(GDCM_BUILD_VERSION 7)
+set(GDCM_BUILD_VERSION 8)
set(GDCM_VERSION
"${GDCM_MAJOR_VERSION}.${GDCM_MINOR_VERSION}.${GDCM_BUILD_VERSION}")
# let advanced user the option to define GDCM_API_VERSION:
@@ -594,6 +597,11 @@ endif()
# Need to subdirs in Source/Common before Wrapping
# to have gdcmConfigure.h around
+if(GDCM_STANDALONE)
+ set(BUILD_APPLICATIONS ${GDCM_BUILD_APPLICATIONS})
+else()
+ set(BUILD_APPLICATIONS OFF)
+endif()
subdirs(Utilities)
add_subdirectory(Source)
=====================================
Examples/Cxx/CMakeLists.txt
=====================================
@@ -32,6 +32,7 @@ mark_as_advanced(QT_QMAKE_EXECUTABLE)
endif()
set(EXAMPLES_SRCS
+ PrintLUT
EmptyMask
DumpSiemensBase64
TemplateEmptyImage
=====================================
Examples/Cxx/PrintLUT.cxx
=====================================
@@ -0,0 +1,47 @@
+/*=========================================================================
+
+ Program: GDCM (Grassroots DICOM). A DICOM library
+
+ Copyright (c) 2006-2011 Mathieu Malaterre
+ All rights reserved.
+ See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notice for more information.
+
+=========================================================================*/
+/*
+ */
+
+#include "gdcmImageReader.h"
+#include "gdcmImageWriter.h"
+#include "gdcmImage.h"
+#include "gdcmPhotometricInterpretation.h"
+
+#include <iostream>
+
+int main(int argc, char *argv[])
+{
+ if( argc < 2 )
+ {
+ std::cerr << argv[0] << " input.dcm" << std::endl;
+ return 1;
+ }
+ const char *filename = argv[1];
+
+ // Instanciate the image reader:
+ gdcm::ImageReader reader;
+ reader.SetFileName( filename );
+ if( !reader.Read() )
+ {
+ std::cerr << "Could not read: " << filename << std::endl;
+ return 1;
+ }
+ const gdcm::Image &image = reader.GetImage();
+
+ const gdcm::LookupTable & lut = image.GetLUT();
+ lut.Print( std::cout );
+
+ return 0;
+}
=====================================
Source/Common/gdcmCAPICryptographicMessageSyntax.cxx
=====================================
@@ -218,7 +218,7 @@ bool CAPICryptographicMessageSyntax::Decrypt(char *output, size_t &outlen, const
goto err;
}
- DWORD dwMessageType, cbMessageTypeLen;
+ DWORD dwMessageType, cbMessageTypeLen = sizeof(DWORD);
if(! CryptMsgGetParam(hMsg, CMSG_TYPE_PARAM, 0, &dwMessageType, &cbMessageTypeLen))
{
gdcmErrorMacro( "CryptMsgGetParam CMSG_TYPE_PARAM failed with error 0x" << std::hex << GetLastError() );
@@ -232,7 +232,7 @@ bool CAPICryptographicMessageSyntax::Decrypt(char *output, size_t &outlen, const
}
ALG_ID kekAlg;
- DWORD kekAlgLen;
+ DWORD kekAlgLen = sizeof(ALG_ID);
if(! CryptGetKeyParam(hRsaPrivK, KP_ALGID, (BYTE*)&kekAlg, &kekAlgLen, 0))
{
gdcmErrorMacro( "MsgGetParam KP_ALGID failed with error 0x" << std::hex << GetLastError() );
@@ -244,7 +244,7 @@ bool CAPICryptographicMessageSyntax::Decrypt(char *output, size_t &outlen, const
goto err;
}
- DWORD nrOfRecipeints, nrOfRecipientsLen;
+ DWORD nrOfRecipeints, nrOfRecipientsLen = sizeof(DWORD);
if(! CryptMsgGetParam(hMsg, CMSG_RECIPIENT_COUNT_PARAM, 0, &nrOfRecipeints, &nrOfRecipientsLen))
{
gdcmErrorMacro( "Decode CMSG_RECIPIENT_COUNT_PARAM failed with error 0x" << std::hex << GetLastError() );
=====================================
Source/Common/gdcmDirectory.cxx
=====================================
@@ -73,8 +73,11 @@ unsigned int Directory::Explore(FilenameType const &name, bool recursive)
}
else
{
- Filenames.push_back(dirName+fileName);
- nFiles++;
+ if (fileName[0] != '.') // discard "unix like" hidden files such as .git in submodules
+ {
+ Filenames.push_back(dirName+fileName);
+ nFiles++;
+ }
}
}
DWORD dwError = GetLastError();
=====================================
Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
=====================================
@@ -44,12 +44,14 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0021,0x0004,"SIEMENS MR SDI 02",VR::DS,VM::VM1,"??",false},
{0x0021,0x0004,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
{0x0021,0x0005,"SIEMENS MR SDS 01",VR::IS,VM::VM3,"??",false},
+ {0x0021,0x0005,"SIEMENS MR SDI 02",VR::IS,VM::VM1,"ICE_Dims",false},
{0x0021,0x0006,"SIEMENS MR SDI 02",VR::LO,VM::VM1,"ICE_Dims",false},
{0x0021,0x0006,"SIEMENS MR SDS 01",VR::LO,VM::VM1,"CoilForGradient",false},
{0x0021,0x0007,"SIEMENS MR SDS 01",VR::LO,VM::VM1,"LongModelName",false},
{0x0021,0x0008,"SIEMENS MR SDS 01",VR::SH,VM::VM1,"GradientMode",false},
{0x0021,0x0009,"SIEMENS MR SDS 01",VR::LO,VM::VM1,"PAT mode",false},
{0x0021,0x000a,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
+ {0x0021,0x000c,"SIEMENS MR SDS 01",VR::SH,VM::VM1,"?Orientation?",false},
{0x0021,0x000d,"SIEMENS MR SDS 01",VR::US,VM::VM1,"??",false},
{0x0021,0x000f,"SIEMENS MR SDS 01",VR::DS,VM::VM3,"?Stim_lim?",false},
{0x0021,0x0010,"SIEMENS MR SDS 01",VR::IS,VM::VM1,"PhoenixMetaProtocolVersion",false},
@@ -61,6 +63,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0021,0x0017,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
{0x0021,0x0018,"SIEMENS MR SDS 01",VR::SH,VM::VM1,"?RFSWDMostCriticalAspect?",false},
{0x0021,0x0019,"SIEMENS MR SDS 01",VR::OW,VM::VM1,"PhoenixMetaProtocol",false},
+ {0x0021,0x001a,"SIEMENS MR SDS 01",VR::LO,VM::VM1,"??",false},
{0x0021,0x001a,"SIEMENS MR SDI 02",VR::SH,VM::VM1,"?RFSWDDataType?",false},
{0x0021,0x001b,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
{0x0021,0x001c,"SIEMENS MR SDI 02",VR::IS,VM::VM1,"??",false},
@@ -68,6 +71,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0021,0x001d,"SIEMENS MR SDS 01",VR::IS,VM::VM1,"??",false},
{0x0021,0x0022,"SIEMENS MR SDS 01",VR::SH,VM::VM1,"Manufacturer",false},
{0x0021,0x0023,"SIEMENS MR SDS 01",VR::IS,VM::VM1,"??",false},
+ {0x0021,0x0021,"SIEMENS MR SDI 02",VR::CS,VM::VM1,"?DiffusionDirectionality?",false},
{0x0021,0x0024,"SIEMENS MR SDI 02",VR::IS,VM::VM1,"??",false},
{0x0021,0x0025,"SIEMENS MR SDS 01",VR::SL,VM::VM3,"?ImaAbsTablePosition?",false},
{0x0021,0x0026,"SIEMENS MR SDS 01",VR::IS,VM::VM1_n,"?MiscSequenceParam?",false},
@@ -82,6 +86,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0021,0x0031,"SIEMENS MR SDS 01",VR::IS,VM::VM1,"PtabAbsStartPosZ",false},
{0x0021,0x0032,"SIEMENS MR SDS 01",VR::SS,VM::VM1,"??",false},
{0x0021,0x0033,"SIEMENS MR SDI 02",VR::IS,VM::VM1,"?CoilForGradient2?",false},
+ {0x0021,0x0035,"SIEMENS MR SDI 02",VR::IS,VM::VM1,"??",false},
{0x0021,0x0033,"SIEMENS MR SDS 01",VR::SH,VM::VM1,"??",false},
{0x0021,0x0034,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
{0x0021,0x0035,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
@@ -96,11 +101,17 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0021,0x0045,"SIEMENS MR SDI 02",VR::SL,VM::VM3,"?Table Position?",false},
{0x0021,0x0045,"SIEMENS MR SDS 01",VR::CS,VM::VM1,"??",false},
{0x0021,0x0046,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
+ {0x0021,0x0047,"SIEMENS MR SDS 01",VR::CS,VM::VM1,"??",false},
+ {0x0021,0x0048,"SIEMENS MR SDS 01",VR::CS,VM::VM1,"??",false},
+ {0x0021,0x0049,"SIEMENS MR SDS 01",VR::CS,VM::VM1,"??",false},
{0x0021,0x0048,"SIEMENS MR SDI 02",VR::IS,VM::VM1,"??",false},
{0x0021,0x0049,"SIEMENS MR SDI 02",VR::IS,VM::VM1,"??",false},
{0x0021,0x004f,"SIEMENS MR SDI 02",VR::LO,VM::VM1,"ImaCoilString",false},
{0x0021,0x0050,"SIEMENS MR SDS 01",VR::US,VM::VM1,"??",false},
{0x0021,0x0051,"SIEMENS MR SDI 02",VR::UL,VM::VM1,"?SequenceMask?",false},
+ {0x0021,0x0053,"SIEMENS MR SDI 02",VR::FD,VM::VM1,"?BandwidthPerPixelPhaseEncode?",false},
+ {0x0021,0x0054,"SIEMENS MR SDI 02",VR::US,VM::VM1,"??",false},
+ {0x0021,0x0056,"SIEMENS MR SDI 02",VR::LO,VM::VM1,"?PAT Mode?",false},
{0x0021,0x0051,"SIEMENS MR SDS 01",VR::US,VM::VM1,"??",false},
{0x0021,0x0053,"SIEMENS MR SDS 01",VR::CS,VM::VM1,"??",false},
{0x0021,0x0058,"SIEMENS MR SDI 02",VR::SH,VM::VM1,"AcquisitionMatrixText",false},
@@ -846,6 +857,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0031,0x0000,"AGFA PACS Archive Mirroring 1.0",VR::CS,VM::VM1,"study_status",false },
/* 001310_IMPAX_6.5.x_Solution_DICOM_Conformance_Statement.pdf states is is VR:CS */
{0x0031,0x0001,"AGFA PACS Archive Mirroring 1.0",VR::UL,VM::VM1,"date_time_verified",false },
+ {0x0035,0x0000,"AGFA STUDY COMMENTS 1.0",VR::LT,VM::VM1,"Array of Comments (illegal XML)",false },
{0x0071,0x0018,"AGFA-AG_HPState",VR::SQ,VM::VM1,"?",false },
{0x0071,0x0019,"AGFA-AG_HPState",VR::SQ,VM::VM1,"?",false },
{0x0071,0x001a,"AGFA-AG_HPState",VR::SQ,VM::VM1,"?",false },
@@ -1451,6 +1463,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0019,0x0027,"DLX_SERIE_01",VR::DS,VM::VM1,"Image chain FWHM psf mm min",false },
{0x0019,0x0028,"DLX_SERIE_01",VR::DS,VM::VM1,"Image chain FWHM psf mm max",false },
{0x0015,0x008f,"DL_INTERNAL_USE",VR::IS,VM::VM1,"?",false },
+ {0x4453,0x0000,"DR Systems, Inc.",VR::LO,VM::VM1,"?kind of identifier?",false },
{0x4453,0x0001,"DR Systems, Inc.",VR::LO,VM::VM1,"DR Exam ID",false },
{0x4453,0x0002,"DR Systems, Inc.",VR::LO,VM::VM1,"DR Image Type",false },
{0x4453,0x0004,"DR Systems, Inc.",VR::LO,VM::VM1,"DR File Type",false },
@@ -1735,9 +1748,10 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x07a1,0x0071,"ELSCINT1",VR::SH,VM::VM1,"?num?",false },
{0x07a1,0x0075,"ELSCINT1",VR::LO,VM::VM2,"?",false },
{0x07a1,0x0085,"ELSCINT1",VR::UL,VM::VM1,"Tamar Translate Flags",false },
- {0x07a1,0x0088,"ELSCINT1",VR::US,VM::VM1,"?",false },
- {0x07a1,0x0098,"ELSCINT1",VR::US,VM::VM1,"?",false },
+ {0x07a1,0x0088,"ELSCINT1",VR::CS,VM::VM1,"?Y/N?",false },
+ {0x07a1,0x0098,"ELSCINT1",VR::CS,VM::VM1,"?Y/N?",false },
{0x07a1,0x009f,"ELSCINT1",VR::CS,VM::VM1,"?",false },
+ {0x07a1,0x00c2,"ELSCINT1",VR::ST,VM::VM1,"?status sent?",false },
{0x07a1,0x00d0,"ELSCINT1",VR::LO,VM::VM1,"?",false },
{0x07a3,0x0001,"ELSCINT1",VR::LO,VM::VM1,"Tamar Exe Software Version",false },
{0x07a3,0x0003,"ELSCINT1",VR::CS,VM::VM1,"Tamar Study Has Sticky Note",false },
@@ -1786,11 +1800,15 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x07a3,0x00ca,"ELSCINT1",VR::SQ,VM::VM1,"?network seq10?",false },
{0x07a3,0x00cb,"ELSCINT1",VR::SQ,VM::VM1,"?network seq11?",false },
{0x07a3,0x00cc,"ELSCINT1",VR::LO,VM::VM1,"Tamar Grid Token Version",false },
- {0x07a5,0x0000,"ELSCINT1",VR::LO,VM::VM1,"?",false },
+ {0x07a3,0x00e3,"ELSCINT1",VR::LO,VM::VM1,"?name?",false },
+ {0x07a3,0x00f2,"ELSCINT1",VR::CS,VM::VM1,"?",false },
+ {0x07a3,0x00fb,"ELSCINT1",VR::DT,VM::VM1,"?",false },
+ {0x07a5,0x0000,"ELSCINT1",VR::LO,VM::VM1,"?name?",false },
{0x07a5,0x0054,"ELSCINT1",VR::DT,VM::VM1,"?",false },
{0x07a5,0x0056,"ELSCINT1",VR::CS,VM::VM1,"?",false },
{0x07a5,0x0063,"ELSCINT1",VR::CS,VM::VM1_n,"?",false },
{0x07a5,0x0069,"ELSCINT1",VR::LO,VM::VM1,"?",false },
+ {0x07a5,0x00ae,"ELSCINT1",VR::IS,VM::VM1,"?",false },
{0x07a5,0x00c8,"ELSCINT1",VR::CS,VM::VM1,"?",false },
{0x5001,0x0070,"ELSCINT1",VR::SQ,VM::VM1,"?",false },
{0x5001,0x0071,"ELSCINT1",VR::SH,VM::VM1,"?",false },
@@ -2024,6 +2042,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0053,0x0068,"GEHC_CT_ADVAPP_001",VR::IS,VM::VM1,"Row Number Anotation Flag",false },
{0x0053,0x006a,"GEHC_CT_ADVAPP_001",VR::IS,VM::VM1,"ODMFlag",false },
{0x0053,0x006b,"GEHC_CT_ADVAPP_001",VR::IS,VM::VM1,"ODMReductionPercent",false },
+ {0x0053,0x006f,"GEHC_CT_ADVAPP_001",VR::IS,VM::VM1,"ASiR Auto Guidance Dose Reduction Percent",false },
{0x0053,0x009d,"GEHC_CT_ADVAPP_001",VR::LO,VM::VM1,"MARsAnnotation",false },
{0x0009,0x0010,"GEIIS",VR::SQ,VM::VM1,"GE IIS Thumbnail Sequence",false },
{0x0009,0x0012,"GEIIS",VR::IS,VM::VM1,"?",false },
@@ -2805,7 +2824,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0009,0x0030,"GEMS_GENIE_1",VR::LO,VM::VM1,"?",false },
{0x0009,0x0033,"GEMS_GENIE_1",VR::FD,VM::VM1,"Rotational Continuous Speed",false },
{0x0009,0x0034,"GEMS_GENIE_1",VR::SL,VM::VM1,"Gantry Motion Type (retired)",false },
- {0x0009,0x0035,"GEMS_GENIE_1",VR::SL,VM::VM1,"Gantry Locus Type",false },
+ {0x0009,0x0035,"GEMS_GENIE_1",VR::UL,VM::VM1,"Gantry Locus Type",false },
{0x0009,0x0037,"GEMS_GENIE_1",VR::SL,VM::VM1,"Starting Heart Rate",false },
{0x0009,0x0038,"GEMS_GENIE_1",VR::SL,VM::VM1,"RR Window Width",false },
{0x0009,0x0039,"GEMS_GENIE_1",VR::SL,VM::VM1,"RR Window Offset",false },
@@ -2882,7 +2901,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0011,0x0063,"GEMS_GENIE_1",VR::FD,VM::VM3,"Spatial Offset",false },
{0x0011,0x0064,"GEMS_GENIE_1",VR::FD,VM::VM3,"Spatial Orientation",false },
{0x0011,0x0065,"GEMS_GENIE_1",VR::LO,VM::VM1,"Reference Dataset UID",false },
- {0x0011,0x0066,"GEMS_GENIE_1",VR::SH,VM::VM1,"Starcam Reference Dataset",false },
+ {0x0011,0x0066,"GEMS_GENIE_1",VR::LO,VM::VM1,"Starcam Reference Dataset",false },
{0x0011,0x0067,"GEMS_GENIE_1",VR::SL,VM::VM1,"Reference Frame Number",false },
{0x0011,0x0068,"GEMS_GENIE_1",VR::SL,VM::VM1,"Cursor Length",false },
{0x0011,0x0069,"GEMS_GENIE_1",VR::SL,VM::VM1,"Number of Cursors",false },
@@ -2924,7 +2943,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0013,0x0011,"GEMS_GENIE_1",VR::SL,VM::VM1,"Source Translator",false },
{0x0013,0x0012,"GEMS_GENIE_1",VR::SL,VM::VM1,"RAL Flags",false },
{0x0013,0x0013,"GEMS_GENIE_1",VR::SQ,VM::VM1,"Xeleris Frame Sequence",false },
- {0x0013,0x0014,"GEMS_GENIE_1",VR::SL,VM::VM1,"Original Image Num",false },
+ {0x0013,0x0014,"GEMS_GENIE_1",VR::SL,VM::VM1_n,"Original Image Num",false },
{0x0013,0x0015,"GEMS_GENIE_1",VR::FD,VM::VM1,"Fscalar",false },
{0x0013,0x0016,"GEMS_GENIE_1",VR::SL,VM::VM1,"AutoTrack Peak",false },
{0x0013,0x0017,"GEMS_GENIE_1",VR::SL,VM::VM1,"AutoTrack Width",false },
@@ -3366,6 +3385,13 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0043,0x00b1,"GEMS_PARM_01",VR::SS,VM::VM1,"Excitation Mode",false },
{0x0043,0x00b2,"GEMS_PARM_01",VR::LO,VM::VM1_n,"MR Table Position Information",false },
{0x0043,0x00b3,"GEMS_PARM_01",VR::DS,VM::VM1_n,"Advanced Eddy Correction",false },
+ {0x0043,0x00b6,"GEMS_PARM_01",VR::LO,VM::VM1_n,"Multiband Parameters",false },
+ {0x0043,0x00b7,"GEMS_PARM_01",VR::LO,VM::VM4,"Compressed Sensing Parameters",false },
+ {0x0043,0x00b8,"GEMS_PARM_01",VR::DS,VM::VM1_n,"Grad Comp Parameters",false },
+ {0x0043,0x00b9,"GEMS_PARM_01",VR::LO,VM::VM1,"Parallel Transmit Information",false },
+ {0x0043,0x00ba,"GEMS_PARM_01",VR::DS,VM::VM1,"Echo Spacing",false },
+ {0x0043,0x00bb,"GEMS_PARM_01",VR::LO,VM::VM1_n,"Pixel Information",false },
+ {0x0043,0x00bc,"GEMS_PARM_01",VR::IS,VM::VM1,"Heart Beats pattern",false },
{0x0051,0x000a,"GEMS_PARM_01",VR::SL,VM::VM1,"Store level of Functional Image",false },
{0x0051,0x000b,"GEMS_PARM_01",VR::FL,VM::VM1,"Store B-Value with Functional Image",false },
{0x2001,0x0010,"GEMS_PARM_01",VR::UI,VM::VM1,"DICOM Implementation UID",false },
@@ -4547,11 +4573,11 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
// {0x0029,0x0000,"MITRA OBJECT DOCUMENT 1.0",VR::OB,VM::VM1,"?",false },
{0x0033,0x0002,"MITRA OBJECT UTF8 ATTRIBUTES 1.0",VR::OB,VM::VM1,"Patient Name (UTF8 Encoded)",false },
{0x0033,0x0004,"MITRA OBJECT UTF8 ATTRIBUTES 1.0",VR::CS,VM::VM1,"Study Description (UTF8 Encoded)",false },
- {0x0033,0x0006,"MITRA OBJECT UTF8 ATTRIBUTES 1.0",VR::OB,VM::VM1,"Referring Physician Name (UTF8 Encoded)",false },
+ {0x0033,0x0006,"MITRA OBJECT UTF8 ATTRIBUTES 1.0",VR::PN,VM::VM1,"Referring Physician Name (UTF8 Encoded)",false },
{0x0033,0x0008,"MITRA OBJECT UTF8 ATTRIBUTES 1.0",VR::OB,VM::VM1,"Requesting Physician Name (UTF8 Encoded)",false },
- {0x0033,0x000a,"MITRA OBJECT UTF8 ATTRIBUTES 1.0",VR::OB,VM::VM1,"Performing Physician Name (UTF8 Encoded)",false },
+ {0x0033,0x000a,"MITRA OBJECT UTF8 ATTRIBUTES 1.0",VR::PN,VM::VM1,"Performing Physician Name (UTF8 Encoded)",false },
{0x0033,0x000c,"MITRA OBJECT UTF8 ATTRIBUTES 1.0",VR::LO,VM::VM1,"Reason for Study (UTF8 Encoded)",false },
- {0x0033,0x000e,"MITRA OBJECT UTF8 ATTRIBUTES 1.0",VR::OB,VM::VM1,"Study Comments (UTF8 Encoded)",false },
+ {0x0033,0x000e,"MITRA OBJECT UTF8 ATTRIBUTES 1.0",VR::LT,VM::VM1,"Study Comments (UTF8 Encoded)",false },
{0x0033,0x0013,"MITRA OBJECT UTF8 ATTRIBUTES 1.0",VR::PN,VM::VM1,"Patient's Name",false },
{0x0033,0x0014,"MITRA OBJECT UTF8 ATTRIBUTES 1.0",VR::OB,VM::VM1,"?",false },
{0x0033,0x0015,"MITRA OBJECT UTF8 ATTRIBUTES 1.0",VR::OB,VM::VM1,"?",false },
@@ -4676,6 +4702,10 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0029,0x0003,"MITRA PRESENTATION 1.0",VR::IS,VM::VM1,"Mitra Invert",false },
{0x0029,0x0004,"MITRA PRESENTATION 1.0",VR::IS,VM::VM1,"Mitra Has Tabstop",false },
{0x0029,0x0005,"MITRA PRESENTATION 1.0",VR::CS,VM::VM1,"Smooth Rotation",false },
+ {0x0029,0x0010,"MITRA PRESENTATION 1.0",VR::CS,VM::VM1,"??",false },
+ {0x0029,0x0011,"MITRA PRESENTATION 1.0",VR::CS,VM::VM1,"??",false },
+ {0x0029,0x0012,"MITRA PRESENTATION 1.0",VR::CS,VM::VM1,"??",false },
+ {0x0029,0x0013,"MITRA PRESENTATION 1.0",VR::CS,VM::VM1,"??",false },
{0x1455,0x0000,"Mortara_Inc",VR::OW,VM::VM1,"ELI Interpretation Vector",false },
{0x1455,0x0001,"Mortara_Inc",VR::UN,VM::VM1,"Custom ID",false },
{0x1455,0x0002,"Mortara_Inc",VR::UT,VM::VM1,"Race",false },
@@ -6059,8 +6089,10 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x200b,0x009f,"Philips RAD Imaging DD 097",VR::SQ,VM::VM1,"?",false },
{0x200b,0x00a0,"Philips RAD Imaging DD 097",VR::LT,VM::VM1,"?",false },
{0x200b,0x00a1,"Philips RAD Imaging DD 097",VR::CS,VM::VM1,"?bool?",false },
+ {0x0029,0x0050,"Philips US Imaging 60",VR::CS,VM::VM1,"?COLOR/CPA/NONE?",false },
{0x0031,0x0030,"Philips US Imaging 60",VR::UL,VM::VM1,"Private data",false },
{0x0031,0x0031,"Philips US Imaging 60",VR::UL,VM::VM1,"Private data",false },
+ {0x0031,0x0032,"Philips US Imaging 60",VR::UL,VM::VM1,"Private data",false },
{0x200d,0x0005,"Philips US Imaging DD 017",VR::LO,VM::VM1,"?",false },
{0x200d,0x0037,"Philips US Imaging DD 023",VR::DA,VM::VM1,"?",false },
{0x200d,0x0038,"Philips US Imaging DD 023",VR::TM,VM::VM1,"?",false },
@@ -6228,6 +6260,12 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x200d,0x0020,"Philips US Imaging DD 113",VR::FD,VM::VM1,"?",false },
{0x200d,0x0021,"Philips US Imaging DD 113",VR::FD,VM::VM1,"?",false },
{0x200d,0x0022,"Philips US Imaging DD 113",VR::UL,VM::VM1,"?",false },
+ {0x200d,0x0024,"Philips US Imaging DD 113",VR::UL,VM::VM1,"?",false },
+ {0x200d,0x0025,"Philips US Imaging DD 113",VR::UL,VM::VM1,"?",false },
+ {0x200d,0x0026,"Philips US Imaging DD 113",VR::UL,VM::VM1,"?",false },
+ {0x200d,0x0027,"Philips US Imaging DD 113",VR::UL,VM::VM1,"?",false },
+ {0x200d,0x0028,"Philips US Imaging DD 113",VR::UL,VM::VM1,"?",false },
+ {0x200d,0x0031,"Philips US Imaging DD 113",VR::UL,VM::VM1,"?",false },
{0x200d,0x0002,"Philips US Private 3D",VR::IS,VM::VM1,"Threedpr Echo Vision Setting",false },
{0x200d,0x0003,"Philips US Private 3D",VR::IS,VM::VM1,"Threedpr Color Vision Setting",false },
{0x200d,0x0004,"Philips US Private 3D",VR::IS,VM::VM1,"Threedpr Transparency",false },
@@ -9842,6 +9880,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x700d,0x0007,"TOSHIBA_MEC_MR3",VR::OB,VM::VM1,"Image Information",false },
{0x700d,0x0008,"TOSHIBA_MEC_MR3",VR::OB,VM::VM1,"Original Data",false },
{0x700d,0x0009,"TOSHIBA_MEC_MR3",VR::SS,VM::VM1,"Original Data Flag",false },
+ {0x700d,0x000c,"TOSHIBA_MEC_MR3",VR::CS,VM::VM1,"?Y/N Flag?",false },
{0x700d,0x0080,"TOSHIBA_MEC_MR3",VR::US,VM::VM1,"Number of PAC channel",false },
{0x700d,0x0081,"TOSHIBA_MEC_MR3",VR::US,VM::VM1,"Reference mode",false },
{0x700d,0x0082,"TOSHIBA_MEC_MR3",VR::SQ,VM::VM1,"Gain value group for MRS",false },
=====================================
Source/DataDictionary/gdcmSOPClassUIDToIOD.cxx
=====================================
@@ -60,7 +60,7 @@ namespace gdcm
{"1.2.840.10008.5.1.4.1.1.12.2.1" , "Enhanced X Ray RF Image IOD Modules"},
{"1.2.840.10008.5.1.4.1.1.13.1.1" , "X Ray 3D Angiographic Image IOD Modules"},
{"1.2.840.10008.5.1.4.1.1.13.1.2" , "X-Ray 3D Craniofacial Image"},
-{"1.2.840.10008.5.1.4.1.1.13.1.3" , "IOD defined in PS 3.3"},
+{"1.2.840.10008.5.1.4.1.1.13.1.3" , "Breast Tomosynthesis Image IOD Modules"},
{"1.2.840.10008.5.1.4.1.1.20" , "NM Image IOD Modules"},
{"1.2.840.10008.5.1.4.1.1.66" , "Raw Data IOD Modules"},
{"1.2.840.10008.5.1.4.1.1.66.1" , "Spatial Registration IOD Modules"},
@@ -112,6 +112,9 @@ namespace gdcm
{"1.2.840.10008.5.1.4.1.1.481.9" , "RT Ion Beams Treatment Record IOD Modules"},
{"1.2.840.10008.5.1.4.38.1" , "Hanging Protocol IOD Modules"},
{"1.2.840.10008.5.1.4.39.1" , "Color Palette IOD"},
+{"1.2.840.10008.5.1.4.1.1.2.2", "Legacy Converted Enhanced CT Image IOD Modules"},
+{"1.2.840.10008.5.1.4.1.1.4.4", "Legacy Converted Enhanced MR Image IOD Modules"},
+{"1.2.840.10008.5.1.4.1.1.128.1", "Legacy Converted Enhanced PET Image IOD Modules"},
// Deprecated:
{"1.2.840.10008.3.1.2.3.3" , "Modality Performed Procedure Step IOD Modules" },
{"1.2.840.10008.5.1.4.1.1.5" , "NM Image IOD Modules"},
=====================================
Source/DataDictionary/gdcmUIDs.h
=====================================
@@ -332,6 +332,9 @@ uid_1_2_840_10008_5_1_4_1_1_77_1_6, // VL Whole Slide Microscopy Image Storage
uid_1_2_840_10008_5_1_4_1_1_6_2, // EnhancedUSVolumeStorage
uid_1_2_840_10008_5_1_4_1_1_66_5, // Surface Segmentation Storage
uid_1_2_840_10008_5_1_4_1_1_13_1_3, // Breast Tomosynthesis Image Storage
+uid_1_2_840_10008_5_1_4_1_1_2_2, // Legacy Converted Enhanced CT ImageStorage,
+uid_1_2_840_10008_5_1_4_1_1_4_4, // Legacy Converted Enhanced MR ImageStorage,
+uid_1_2_840_10008_5_1_4_1_1_128_1, // Legacy Converted Enhanced PET ImageStorage
uid_1_2_840_10008_1_2_4_101, // MPEG2 Main Profile @ High Level
uid_1_2_840_10008_1_2_4_102, // MPEG-4 AVC/H.264 High Profile / Level 4.1
uid_1_2_840_10008_1_2_4_103 // MPEG-4 AVC/H.264 BD-compatible High Profile / Level 4.1
@@ -629,7 +632,10 @@ dicomTransferCapability = 268, // dicomTransferCapability
VLWholeSlideMicroscopyImageStorage,
EnhancedUSVolumeStorage,
SurfaceSegmentationStorage,
-BreastTomosynthesisImageStorage
+BreastTomosynthesisImageStorage,
+LegacyConvertedEnhancedCTImageStorage,
+LegacyConvertedEnhancedMRImageStorage,
+LegacyConvertedEnhancedPETImageStorage
} TSName;
=====================================
Source/DataStructureAndEncodingDefinition/gdcmSequenceOfItems.cxx
=====================================
@@ -45,7 +45,7 @@ bool SequenceOfItems::RemoveItemByIndex( const SizeType position )
{
return false;
}
- Items.erase (Items.begin() + position);
+ Items.erase (Items.begin() + position - 1);
return true;
}
=====================================
Source/DataStructureAndEncodingDefinition/gdcmWriter.cxx
=====================================
@@ -166,9 +166,12 @@ void Writer::SetFileName(const char *filename)
{
//std::cerr << "Stream: " << filename << std::endl;
//std::cerr << "Ofstream: " << Ofstream << std::endl;
- if (Ofstream && Ofstream->is_open())
+ if (Ofstream)
{
- Ofstream->close();
+ if (Ofstream->is_open())
+ {
+ Ofstream->close();
+ }
delete Ofstream;
}
Ofstream = new std::ofstream();
=====================================
Source/MediaStorageAndFileFormat/gdcmBitmap.cxx
=====================================
@@ -132,7 +132,6 @@ unsigned int Bitmap::GetPlanarConfiguration() const
{
if( PlanarConfiguration && PF.GetSamplesPerPixel() != 3 )
{
- assert(0);
// LEADTOOLS_FLOWERS-8-PAL-RLE.dcm
// User specify PlanarConfiguration whereas SamplesPerPixel != 3
gdcmWarningMacro(
=====================================
Source/MediaStorageAndFileFormat/gdcmDirectoryHelper.cxx
=====================================
@@ -174,6 +174,15 @@ std::string DirectoryHelper::RetrieveSOPInstanceUIDFromZPosition(double inZPos,
std::vector<DataSet>::const_iterator itor;
Tag thePosition(0x0020, 0x0032);
Tag theSOPInstanceUID(0x0008, 0x0018);
+ Tag theSpacingBetweenSlice(0x0018, 0x0088);
+ double interSlice = 0.01;
+ if (inDS.begin() != inDS.end() && inDS.begin()->FindDataElement(theSpacingBetweenSlice))
+ {
+ DataElement tmpDe = inDS.begin()->GetDataElement(theSpacingBetweenSlice);
+ Attribute<0x0018,0x0088> tmpAt;
+ tmpAt.SetFromDataElement(tmpDe);
+ interSlice = fabs(tmpAt.GetValue())/2.0;
+ }
std::string blank;//return only if there's a problem
for (itor = inDS.begin(); itor != inDS.end(); itor++)
{
@@ -182,7 +191,7 @@ std::string DirectoryHelper::RetrieveSOPInstanceUIDFromZPosition(double inZPos,
DataElement de = itor->GetDataElement(thePosition);
Attribute<0x0020,0x0032> at;
at.SetFromDataElement( de );
- if (fabs(at.GetValue(2) - inZPos)<0.01)
+ if (fabs(at.GetValue(2) - inZPos)<interSlice)
{
DataElement de2 = itor->GetDataElement(theSOPInstanceUID);
const ByteValue* theVal = de2.GetByteValue();
=====================================
Source/MediaStorageAndFileFormat/gdcmImageChangeTransferSyntax.cxx
=====================================
@@ -271,11 +271,19 @@ bool ImageChangeTransferSyntax::TryJPEGLSCodec(const DataElement &pixelde, Bitma
r = codec->Code(pixelde, out);
}
if(!r) return false;
- output.SetPlanarConfiguration( 0 );
DataElement &de = output.GetDataElement();
de.SetValue( out.GetValue() );
UpdatePhotometricInterpretation( input, output );
+ if( input.GetPixelFormat().GetSamplesPerPixel() == 3 )
+ {
+ if( input.GetPlanarConfiguration() == 0 )
+ {
+ // http://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_8.2.3.html#table_8.2.3-1
+ output.SetPlanarConfiguration(1);
+ }
+ }
+
return r;
}
return false;
=====================================
Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
=====================================
@@ -428,7 +428,11 @@ std::vector<double> ImageHelper::GetOriginValue(File const & f)
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
|| ms == MediaStorage::SegmentationStorage
|| ms == MediaStorage::IVOCTForProcessing
- || ms == MediaStorage::IVOCTForPresentation)
+ || ms == MediaStorage::IVOCTForPresentation
+ || ms == MediaStorage::BreastTomosynthesisImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedMRImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedCTImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedPETImageStorage )
{
const Tag t1(0x5200,0x9229);
const Tag t2(0x5200,0x9230);
@@ -552,7 +556,11 @@ std::vector<double> ImageHelper::GetDirectionCosinesValue(File const & f)
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
|| ms == MediaStorage::SegmentationStorage
|| ms == MediaStorage::IVOCTForPresentation
- || ms == MediaStorage::IVOCTForProcessing )
+ || ms == MediaStorage::IVOCTForProcessing
+ || ms == MediaStorage::BreastTomosynthesisImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedMRImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedCTImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedPETImageStorage )
{
const Tag t1(0x5200,0x9229);
const Tag t2(0x5200,0x9230);
@@ -866,7 +874,11 @@ void ImageHelper::SetDimensionsValue(File& f, const Pixmap & img)
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
|| ms == MediaStorage::SegmentationStorage
|| ms == MediaStorage::IVOCTForProcessing
- || ms == MediaStorage::IVOCTForPresentation )
+ || ms == MediaStorage::IVOCTForPresentation
+ || ms == MediaStorage::BreastTomosynthesisImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedMRImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedCTImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedPETImageStorage )
{
const Tag tfgs(0x5200,0x9230);
if( ds.FindDataElement( tfgs ) )
@@ -891,7 +903,11 @@ std::vector<double> ImageHelper::GetRescaleInterceptSlopeValue(File const & f)
|| ms == MediaStorage::EnhancedPETImageStorage
|| ms == MediaStorage::XRay3DAngiographicImageStorage
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
- || ms == MediaStorage::SegmentationStorage )
+ || ms == MediaStorage::SegmentationStorage
+ || ms == MediaStorage::BreastTomosynthesisImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedMRImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedCTImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedPETImageStorage )
{
const Tag t1(0x5200,0x9229);
const Tag t2(0x5200,0x9230);
@@ -901,6 +917,37 @@ std::vector<double> ImageHelper::GetRescaleInterceptSlopeValue(File const & f)
assert( interceptslope.size() == 2 );
return interceptslope;
}
+
+ // Workaround to get intercept/slope from some Philips
+ // XRay3DAngiographic files
+ if (ms == MediaStorage::XRay3DAngiographicImageStorage && ForceRescaleInterceptSlope)
+ {
+ const Tag t3(0x0018,0x9530);
+ if(ds.FindDataElement( t3 ))
+ {
+ SmartPointer<SequenceOfItems> sqi = ds.GetDataElement( t3 ).GetValueAsSQ();
+ if(sqi && sqi->GetNumberOfItems() > 0)
+ {
+ const Item &item = sqi->GetItem(1);
+ const DataSet & subds = item.GetNestedDataSet();
+ const Tag tpi(0x0028,0x1052);
+ const Tag tps(0x0028,0x1053);
+ if( subds.FindDataElement(tps) && subds.FindDataElement(tpi))
+ {
+ const DataElement &dei = subds.GetDataElement( tpi );
+ Attribute<0x0028,0x1052> ati;
+ ati.SetFromDataElement( dei );
+ interceptslope.push_back( ati.GetValue() );
+ const DataElement &des = subds.GetDataElement( tps );
+ Attribute<0x0028,0x1053> ats;
+ ats.SetFromDataElement( des );
+ interceptslope.push_back( ats.GetValue() );
+ return interceptslope;
+ }
+ }
+ }
+ }
+
//else
// {
// interceptslope.resize( 2 );
@@ -1202,7 +1249,11 @@ std::vector<double> ImageHelper::GetSpacingValue(File const & f)
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
|| ms == MediaStorage::SegmentationStorage
|| ms == MediaStorage::IVOCTForProcessing
- || ms == MediaStorage::IVOCTForPresentation)
+ || ms == MediaStorage::IVOCTForPresentation
+ || ms == MediaStorage::BreastTomosynthesisImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedMRImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedCTImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedPETImageStorage)
{
// <entry group="5200" element="9230" vr="SQ" vm="1" name="Per-frame Functional Groups Sequence"/>
const Tag t1(0x5200,0x9229);
@@ -1477,7 +1528,11 @@ void ImageHelper::SetSpacingValue(DataSet & ds, const std::vector<double> & spac
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
|| ms == MediaStorage::SegmentationStorage
|| ms == MediaStorage::IVOCTForPresentation
- || ms == MediaStorage::IVOCTForProcessing )
+ || ms == MediaStorage::IVOCTForProcessing
+ || ms == MediaStorage::BreastTomosynthesisImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedMRImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedCTImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedPETImageStorage )
{
/*
(0028,9110) SQ (Sequence with undefined length #=1) # u/l, 1 PixelMeasuresSequence
@@ -1799,7 +1854,11 @@ void ImageHelper::SetOriginValue(DataSet & ds, const Image & image)
&& ms != MediaStorage::EnhancedPETImageStorage
&& ms != MediaStorage::EnhancedCTImageStorage
&& ms != MediaStorage::IVOCTForPresentation
- && ms != MediaStorage::IVOCTForProcessing )
+ && ms != MediaStorage::IVOCTForProcessing
+ && ms != MediaStorage::BreastTomosynthesisImageStorage
+ && ms != MediaStorage::LegacyConvertedEnhancedMRImageStorage
+ && ms != MediaStorage::LegacyConvertedEnhancedCTImageStorage
+ && ms != MediaStorage::LegacyConvertedEnhancedPETImageStorage )
{
// FIXME: should I remove the ipp tag ???
return;
@@ -1814,7 +1873,11 @@ void ImageHelper::SetOriginValue(DataSet & ds, const Image & image)
|| ms == MediaStorage::MultiframeGrayscaleByteSecondaryCaptureImageStorage
|| ms == MediaStorage::SegmentationStorage
|| ms == MediaStorage::IVOCTForPresentation
- || ms == MediaStorage::IVOCTForProcessing )
+ || ms == MediaStorage::IVOCTForProcessing
+ || ms == MediaStorage::BreastTomosynthesisImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedMRImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedCTImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedPETImageStorage)
{
/*
(0020,9113) SQ (Sequence with undefined length #=1) # u/l, 1 PlanePositionSequence
@@ -1928,7 +1991,11 @@ void ImageHelper::SetDirectionCosinesValue(DataSet & ds, const std::vector<doubl
&& ms != MediaStorage::EnhancedPETImageStorage
&& ms != MediaStorage::EnhancedCTImageStorage
&& ms != MediaStorage::IVOCTForPresentation
- && ms != MediaStorage::IVOCTForProcessing )
+ && ms != MediaStorage::IVOCTForProcessing
+ && ms != MediaStorage::BreastTomosynthesisImageStorage
+ && ms != MediaStorage::LegacyConvertedEnhancedMRImageStorage
+ && ms != MediaStorage::LegacyConvertedEnhancedCTImageStorage
+ && ms != MediaStorage::LegacyConvertedEnhancedPETImageStorage )
{
// FIXME: should I remove the iop tag ???
return;
@@ -1962,7 +2029,11 @@ void ImageHelper::SetDirectionCosinesValue(DataSet & ds, const std::vector<doubl
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
|| ms == MediaStorage::SegmentationStorage
|| ms == MediaStorage::IVOCTForPresentation
- || ms == MediaStorage::IVOCTForProcessing )
+ || ms == MediaStorage::IVOCTForProcessing
+ || ms == MediaStorage::BreastTomosynthesisImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedMRImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedCTImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedPETImageStorage )
{
/*
(0020,9116) SQ (Sequence with undefined length #=1) # u/l, 1 PlaneOrientationSequence
@@ -2075,7 +2146,11 @@ void ImageHelper::SetRescaleInterceptSlopeValue(File & f, const Image & img)
&& ms != MediaStorage::XRay3DCraniofacialImageStorage
&& ms != MediaStorage::SegmentationStorage
&& ms != MediaStorage::IVOCTForPresentation
- && ms != MediaStorage::IVOCTForProcessing )
+ && ms != MediaStorage::IVOCTForProcessing
+ && ms != MediaStorage::BreastTomosynthesisImageStorage
+ && ms != MediaStorage::LegacyConvertedEnhancedMRImageStorage
+ && ms != MediaStorage::LegacyConvertedEnhancedCTImageStorage
+ && ms != MediaStorage::LegacyConvertedEnhancedPETImageStorage )
{
if( img.GetIntercept() != 0. || img.GetSlope() != 1. )
{
@@ -2090,7 +2165,10 @@ void ImageHelper::SetRescaleInterceptSlopeValue(File & f, const Image & img)
|| ms == MediaStorage::EnhancedPETImageStorage
|| ms == MediaStorage::XRay3DAngiographicImageStorage
|| ms == MediaStorage::XRay3DCraniofacialImageStorage
- )
+ || ms == MediaStorage::BreastTomosynthesisImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedMRImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedCTImageStorage
+ || ms == MediaStorage::LegacyConvertedEnhancedPETImageStorage )
{
/*
(0020,9116) SQ (Sequence with undefined length #=1) # u/l, 1 PlaneOrientationSequence
=====================================
Source/MediaStorageAndFileFormat/gdcmJPEGLSCodec.cxx
=====================================
@@ -109,6 +109,7 @@ bool JPEGLSCodec::GetHeaderInfo(std::istream &is, TransferSyntax &ts)
else if( metadata.components == 3 )
{
PI = PhotometricInterpretation::RGB;
+ PlanarConfiguration = 1;
this->PF.SetSamplesPerPixel( 3 );
}
else assert(0);
=====================================
Source/MediaStorageAndFileFormat/gdcmLookupTable.cxx
=====================================
@@ -12,8 +12,11 @@
=========================================================================*/
#include "gdcmLookupTable.h"
+#include "gdcmSwapper.h"
#include <vector>
#include <set>
+#include <iomanip>
+#include <algorithm>
#include <string.h>
@@ -550,6 +553,62 @@ bool LookupTable::Decode(char *output, size_t outlen, const char *input, size_t
return success;
}
+bool LookupTable::Decode8(char *output, size_t outlen, const char *input, size_t inlen ) const
+{
+ bool success = false;
+ if( outlen < 3 * inlen )
+ {
+ gdcmDebugMacro( "Out buffer too small" );
+ return false;
+ }
+ if( !Initialized() )
+ {
+ gdcmDebugMacro( "Not Initialized" );
+ return false;
+ }
+ if ( BitSample == 8 )
+ {
+ const unsigned char * end = (const unsigned char*)input + inlen;
+ unsigned char * rgb = (unsigned char*)output;
+ for( const unsigned char * idx = (const unsigned char*)input; idx != end; ++idx )
+ {
+ if( IncompleteLUT )
+ {
+ assert( *idx < Internal->Length[RED] );
+ assert( *idx < Internal->Length[GREEN] );
+ assert( *idx < Internal->Length[BLUE] );
+ }
+ rgb[RED] = Internal->RGB[3 * *idx+RED];
+ rgb[GREEN] = Internal->RGB[3 * *idx+GREEN];
+ rgb[BLUE] = Internal->RGB[3 * *idx+BLUE];
+ rgb += 3;
+ }
+ success = true;
+ }
+ else if ( BitSample == 16 )
+ {
+ const uint16_t *rgb16 = (const uint16_t*)&Internal->RGB[0];
+ assert( inlen % 2 == 0 );
+ const uint16_t * end = (const uint16_t*)(input + inlen);
+ uint8_t * rgb = (uint8_t*)output;
+ for( const uint16_t * idx = (const uint16_t*)input; idx != end; ++idx )
+ {
+ if( IncompleteLUT )
+ {
+ assert( *idx < Internal->Length[RED] );
+ assert( *idx < Internal->Length[GREEN] );
+ assert( *idx < Internal->Length[BLUE] );
+ }
+ rgb[RED] = rgb16[3 * *idx+RED] >> 8;
+ rgb[GREEN] = rgb16[3 * *idx+GREEN] >> 8;
+ rgb[BLUE] = rgb16[3 * *idx+BLUE] >> 8;
+ rgb += 3;
+ }
+ success = true;
+ }
+ return success;
+}
+
const unsigned char *LookupTable::GetPointer() const
{
if ( BitSample == 8 )
@@ -669,4 +728,61 @@ bool LookupTable::WriteBufferAsRGBA(const unsigned char *rgba)
return ret;
}
+void LookupTable::Print(std::ostream &os) const
+{
+ if( BitSample == 16 )
+ {
+ uint16_t maxlut[3] = { 0 , 0 , 0};
+ uint16_t minlut[3] = { 0xffff, 0xffff, 0xffff };
+ uint16_t *uchar16 = (uint16_t*)&Internal->RGB[0];
+ if( Internal->Length[BLUE] != Internal->Length[RED]
+ || Internal->Length[RED] != Internal->Length[GREEN] ) return;
+ for( unsigned int i = 0; i < Internal->Length[BLUE]; ++i)
+ {
+ os << std::dec <<std::setw( 5 ) << std::setfill( '0' ) << i << " : ";
+ for(int type = RED; type <= BLUE; ++type )
+ {
+ assert( 2*(3*i+type) < Internal->RGB.size() );
+ const uint16_t val = SwapperDoOp::Swap(uchar16[3*i+type]);
+ minlut[type] = std::min( minlut[type], val );
+ maxlut[type] = std::max( maxlut[type], val );
+ os << std::hex << std::setw( 4 ) << std::setfill( '0' ) << val << ",";
+ }
+ os << std::endl;
+ }
+ os << "MINLUT: ";
+ for(int type = RED; type <= BLUE; ++type )
+ os << std::hex << std::setw( 4 ) << std::setfill( '0' ) << minlut[type] << ",";
+ os << std::endl;
+ os << "MAXLUT: ";
+ for(int type = RED; type <= BLUE; ++type )
+ os << std::hex << std::setw( 4 ) << std::setfill( '0' ) << maxlut[type] << ",";
+ os << std::endl;
+ }
+}
+
+bool LookupTable::IsRGB8() const
+{
+ if( BitSample == 16 )
+ {
+ uint16_t maxlut[3] = { 0 , 0 , 0};
+ uint16_t minlut[3] = { 0xffff, 0xffff, 0xffff };
+ uint16_t *uchar16 = (uint16_t*)&Internal->RGB[0];
+ if( Internal->Length[BLUE] != Internal->Length[RED]
+ || Internal->Length[RED] != Internal->Length[GREEN] ) return false;
+ for( unsigned int i = 0; i < Internal->Length[BLUE]; ++i)
+ {
+ for(int type = RED; type <= BLUE; ++type )
+ {
+ assert( 2*(3*i+type) < Internal->RGB.size() );
+ const uint16_t val = SwapperDoOp::Swap(uchar16[3*i+type]);
+ minlut[type] = std::min( minlut[type], val );
+ maxlut[type] = std::max( maxlut[type], val );
+ if( maxlut[type] > 0xff ) return false;
+ }
+ }
+ }
+ return true;
+}
+
} // end namespace gdcm
=====================================
Source/MediaStorageAndFileFormat/gdcmLookupTable.h
=====================================
@@ -39,7 +39,7 @@ public:
LookupTable();
~LookupTable();
- void Print(std::ostream &) const {}
+ void Print(std::ostream &) const;
/// Allocate the LUT
void Allocate( unsigned short bitsample = 8 );
@@ -76,6 +76,12 @@ public:
/// the outputbuffer should be at least 3 times the size of inlen
bool Decode(char *outputbuffer, size_t outlen, const char *inputbuffer, size_t inlen) const;
+ /// Return whether 16 bits LUT is in RGB 8 bits space
+ bool IsRGB8() const;
+
+ /// Decode into RGB 8 bits space
+ bool Decode8(char *outputbuffer, size_t outlen, const char *inputbuffer, size_t inlen) const;
+
LookupTable(LookupTable const &lut):Object(lut)
{
assert(0);
=====================================
Source/MediaStorageAndFileFormat/gdcmPrinter.cxx
=====================================
@@ -600,6 +600,7 @@ VR Printer::PrintDataElement(std::ostringstream &os, const Dicts &dicts, const D
StringFilterCase(FL);
StringFilterCase(FD);
//StringFilterCase(OB);
+ StringFilterCase(OD);
StringFilterCase(OF);
//StringFilterCase(OW);
StringFilterCase(SL);
@@ -764,7 +765,7 @@ VR Printer::PrintDataElement(std::ostringstream &os, const Dicts &dicts, const D
{
assert( refvr != VR::INVALID );
assert( refvr & VR::VRBINARY );
- if( refvr & VR::OB_OW || refvr == VR::SQ )
+ if( refvr & VR::OB_OW || refvr == VR::OD || refvr == VR::OF || refvr == VR::SQ )
{
guessvm = VM::VM1;
}
=====================================
Source/MediaStorageAndFileFormat/gdcmRLECodec.cxx
=====================================
@@ -855,7 +855,25 @@ bool RLECodec::DecodeByStreams(std::istream &is, std::ostream &os)
bool RLECodec::GetHeaderInfo(std::istream &is, TransferSyntax &ts)
{
- (void)is;
+ RLEFrame frame;
+ if( !frame.Read(is) )
+ return false;
+ // numsegments = num_comp * bpp / 8;
+ // numsegments >0 && numsegments <= 12
+ uint32_t bytespercomp = frame.Header.NumSegments;
+ if( frame.Header.NumSegments % 3 == 0 )
+ {
+ PI = PhotometricInterpretation::RGB;
+ PlanarConfiguration = 1;
+ this->PF.SetSamplesPerPixel( 3 );
+ bytespercomp /= 3;
+ }
+ else
+ {
+ PI = PhotometricInterpretation::MONOCHROME2;
+ this->PF.SetSamplesPerPixel( 1 );
+ }
+ this->PF.SetBitsAllocated( bytespercomp * 8 );
ts = TransferSyntax::RLELossless;
return true;
}
=====================================
Testing/Source/DataDictionary/Cxx/TestSOPClassUIDToIOD.cxx
=====================================
@@ -24,7 +24,7 @@ int TestSOPClassUIDToIOD(int, char *[])
std::cout << s[1] << std::endl;
if( std::string(s[1] ) != "Basic Directory IOD Modules" ) return 1;
- gdcm::SOPClassUIDToIOD::SOPClassUIDToIODType& s2 = gdcm::SOPClassUIDToIOD::GetSOPClassUIDToIOD(100);
+ gdcm::SOPClassUIDToIOD::SOPClassUIDToIODType& s2 = gdcm::SOPClassUIDToIOD::GetSOPClassUIDToIOD(103);
std::cout << ( s2[0] == 0 ) << std::endl;
if( !(s2[0] == 0) ) return 1;
std::cout << ( s2[1] == 0 ) << std::endl;
=====================================
Testing/Source/MediaStorageAndFileFormat/Cxx/TestImageChangePlanarConfiguration.cxx
=====================================
@@ -89,7 +89,7 @@ int TestImageChangePlanarConfigurationFunc(const char *filename, bool verbose =
// Check that after decompression we still find the same thing:
int res = 0;
const gdcm::Image &img = reader2.GetImage();
- unsigned int newpc = img.GetPlanarConfiguration();
+ //unsigned int newpc = img.GetPlanarConfiguration();
//std::cerr << "Success to read image from file: " << filename << std::endl;
unsigned long len = img.GetBufferLength();
=====================================
Testing/Source/MediaStorageAndFileFormat/Cxx/TestPrinter1.cxx
=====================================
@@ -164,7 +164,7 @@ static const char * const printmd5[][2] = {
{ "5797c9dfe94e4a4bccfbf81ab0aaa957" , "MR-SIEMENS-DICOM-WithOverlays.dcm" } ,
{ "df28467760104edc923d0625a0e2a778" , "MR-SIEMENS-DICOM-WithOverlays-extracted-overlays.dcm" } ,
{ "bf324a1c91d3a09d9136f54f5910e570" , "MR_SIEMENS_forceLoad29-1010_29-1020.dcm" } ,
-{ "acbf80a7c610b44caebd52bc22de74f9" , "MR_Spectroscopy_SIEMENS_OF.dcm" } ,
+{ "4b0a24992d94eb6c0ae5e4bb617e1718" , "MR_Spectroscopy_SIEMENS_OF.dcm" } ,
{ "1a5646a7b05840813c067d8c8dfa507e" , "NM-MONO2-16-13x-heart.dcm" } ,
{ "8d8c3b8eb830b57b162e7c9f2d64b214" , "OsirixFake16BitsStoredFakeSpacing.dcm" } ,
{ "bf793beb0e96f2399e467409e3cf5311" , "OT-MONO2-8-a7.dcm" } ,
@@ -238,7 +238,7 @@ static const char * const printmd5[][2] = {
{ "807bf2aef3bc1885217c8a12d2d2bc19" , "JPEGNote_bogus.dcm" },
{ "669cc0e807673ebe57124739a1874f35" , "RLEDebianBug816607Orig.dcm" },
{ "1daa9bb53a8ce090041472f528248686" , "IllegalGroup2ImplicitTS.dcm" },
-{ "49542e6002129f42f86f25e840b6beed" , "GE_MR_0025xx1bProtocolDataBlockXML.dcm" },
+{ "14c982413ba9bce288c2af88f4f751b6" , "GE_MR_0025xx1bProtocolDataBlockXML.dcm" },
{ 0 ,0 }
@@ -259,7 +259,13 @@ int TestPrint(const char *filename, bool verbose= false)
std::ostringstream out;
if( verbose )
print.Print( std::cout );
+#if defined(_MSC_VER) && (_MSC_VER <= 1800) // Visual Studio 2013
+ auto old_exponent_format = _set_output_format(_TWO_DIGIT_EXPONENT);
+#endif
print.Print( out );
+#if defined(_MSC_VER) && (_MSC_VER <= 1800) // Visual Studio 2013
+ _set_output_format(old_exponent_format);
+#endif
gdcm::Filename fn( filename );
const char *name = fn.GetName();
=====================================
Utilities/VTK/CMakeLists.txt
=====================================
@@ -691,7 +691,7 @@ if(GDCM_WRAP_JAVA)
#COMMAND ${Java_JAVAC_EXECUTABLE} ARGS -cp ${GDCM_VTK_JAVA_JAR} "vtk/*.java"
# No such thing as -cp for javac only java is listed:
# http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/classpath.html
- COMMAND ${Java_JAVAC_EXECUTABLE} ARGS ${jflags} -source ${GDCM_JAVA_SOURCE_VERSION} -target ${GDCM_JAVA_TARGET_VERSION} -classpath ${GDCM_VTK_JAVA_JAR} "vtk/*.java"
+ COMMAND ${Java_JAVAC_EXECUTABLE} ARGS ${jflags} -source ${GDCM_JAVA_SOURCE_VERSION} -target ${GDCM_JAVA_TARGET_VERSION} -classpath ${GDCM_VTK_JAVA_JAR} -d . "vtk/*.java"
COMMAND ${Java_JAR_EXECUTABLE} ARGS -cvfm ${LIBRARY_OUTPUT_PATH}/${PROJECT_NAME}.jar ${CMAKE_CURRENT_SOURCE_DIR}/manifest.txt vtk/*.class
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/java
DEPENDS ${VTKGDCM_NAME}Java
=====================================
Wrapping/Python/gdcmswig.i
=====================================
@@ -328,7 +328,24 @@ EXTEND_CLASS_PRINT(gdcm::ByteValue)
%include "gdcmSmartPointer.h"
%template(SmartPtrSQ) gdcm::SmartPointer<gdcm::SequenceOfItems>;
%template(SmartPtrFrag) gdcm::SmartPointer<gdcm::SequenceOfFragments>;
+%typemap(in) (const char* array, uint32_t length) {
+ $1 = PyString_AsString($input);
+ if ($1 == NULL) {
+ SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '$symname', argument $argnum expected byte string.");
+ }
+ Py_ssize_t length = PyString_Size($input);
+ if (static_cast<size_t>(length) > std::numeric_limits<uint32_t>::max()) {
+ SWIG_exception_fail(SWIG_ArgError(SWIG_OverflowError), "in method '$symname', array in argument $argnum is too large.");
+ }
+ $2 = static_cast<uint32_t>(length);
+}
%include "gdcmDataElement.h"
+%extend gdcm::DataElement
+{
+ void SetByteStringValue(const char *array, uint32_t length) {
+ self->SetByteValue(array, gdcm::VL(length));
+ }
+}
EXTEND_CLASS_PRINT(gdcm::DataElement)
%include "gdcmItem.h"
EXTEND_CLASS_PRINT(gdcm::Item)
@@ -449,6 +466,12 @@ EXTEND_CLASS_PRINT(gdcm::PDBHeader)
EXTEND_CLASS_PRINT(gdcm::MrProtocol)
%include "gdcmCSAElement.h"
EXTEND_CLASS_PRINT(gdcm::CSAElement)
+%extend gdcm::CSAElement
+{
+ void SetByteStringValue(const char *array, uint32_t length) {
+ self->SetByteValue(array, gdcm::VL(length));
+ }
+}
%include "gdcmCSAHeader.h"
EXTEND_CLASS_PRINT(gdcm::CSAHeader)
%include "gdcmSequenceOfFragments.h"
View it on GitLab: https://salsa.debian.org/med-team/gdcm/commit/fa93f977e70a135c37e8a94aae7121c2d9b4a9cb
--
View it on GitLab: https://salsa.debian.org/med-team/gdcm/commit/fa93f977e70a135c37e8a94aae7121c2d9b4a9cb
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20181028/f7e9da26/attachment-0001.html>
More information about the debian-med-commit
mailing list