[med-svn] [gdcm] 01/05: New upstream version 2.8.3
Gert Wollny
gewo at moszumanska.debian.org
Thu Oct 5 09:06:18 UTC 2017
This is an automated email from the git hooks/post-receive script.
gewo pushed a commit to branch master
in repository gdcm.
commit 202f6145d855b5d6fdee4edc74394036e309c2ca
Author: Gert Wollny <gewo at debian.org>
Date: Wed Oct 4 14:11:56 2017 +0000
New upstream version 2.8.3
---
Applications/Cxx/CMakeLists.txt | 6 +
Applications/Cxx/gdcmdump.cxx | 48 ++-
Applications/Cxx/gdcminfo.cxx | 22 ++
Applications/Cxx/gdcmpdf.cxx | 20 ++
Applications/Cxx/gdcmtar.cxx | 14 +-
CMake/CTestCustom.ctest.in | 2 +
CMake/InstallMacros.cmake | 40 +--
CMakeLists.txt | 11 +-
Examples/Cxx/CMakeLists.txt | 1 +
Examples/Cxx/ReadAndDumpDICOMDIR2.cxx | 393 +++++++++++++++++++++
Examples/Python/DecompressImage.py | 11 +-
Source/Common/CMakeLists.txt | 16 +-
Source/Common/gdcmConfigure.h.in | 3 +
Source/Common/gdcmSwapper.txx | 8 +-
Source/Common/gdcmSystem.cxx | 8 +-
Source/DataDictionary/CMakeLists.txt | 4 +-
Source/DataDictionary/gdcmPrivateDefaultDicts.cxx | 86 +++++
.../CMakeLists.txt | 8 +-
.../gdcmCSAHeader.h | 8 +-
.../gdcmMrProtocol.cxx | 12 +
Source/InformationObjectDefinition/CMakeLists.txt | 7 +-
Source/MediaStorageAndFileFormat/CMakeLists.txt | 15 +-
.../MediaStorageAndFileFormat/gdcmDictPrinter.cxx | 33 +-
Source/MediaStorageAndFileFormat/gdcmIPPSorter.cxx | 13 +-
.../MediaStorageAndFileFormat/gdcmImageHelper.cxx | 1 +
Source/MediaStorageAndFileFormat/gdcmPrinter.cxx | 2 +-
Source/MediaStorageAndFileFormat/gdcmPrinter.h | 3 +-
.../MediaStorageAndFileFormat/gdcmStringFilter.cxx | 4 +-
Source/MessageExchangeDefinition/CMakeLists.txt | 10 +-
Testing/Source/Data/CMakeLists.txt | 2 +
Utilities/VTK/CMakeLists.txt | 28 +-
Utilities/doxygen/man/gdcmdump.xml | 3 +-
Utilities/doxygen/man/gdcmtar.xml | 14 +-
Wrapping/Csharp/CMakeLists.txt | 3 +
Wrapping/Python/gdcmswig.i | 2 +-
35 files changed, 738 insertions(+), 123 deletions(-)
diff --git a/Applications/Cxx/CMakeLists.txt b/Applications/Cxx/CMakeLists.txt
index 9b42682..2843fd5 100644
--- a/Applications/Cxx/CMakeLists.txt
+++ b/Applications/Cxx/CMakeLists.txt
@@ -84,6 +84,12 @@ if(GDCM_USE_SYSTEM_POPPLER)
if(LIBPOPPLER_CATALOG_HAS_STRUCTTREEROOT)
list(APPEND libpoppler_flags -DLIBPOPPLER_CATALOG_HAS_STRUCTTREEROOT)
endif()
+ CHECK_CXX_SOURCE_COMPILES(
+ "\#include <poppler/Object.h>\nint main() { Object o(42); }"
+ LIBPOPPLER_NEW_OBJECT_API)
+if(LIBPOPPLER_NEW_OBJECT_API)
+ list(APPEND libpoppler_flags -DLIBPOPPLER_NEW_OBJECT_API)
+ endif()
if(libpoppler_flags)
string(REPLACE ";" " " libpoppler_flags_string "${libpoppler_flags}")
set_source_files_properties(
diff --git a/Applications/Cxx/gdcmdump.cxx b/Applications/Cxx/gdcmdump.cxx
index 24a6176..8e37cbf 100644
--- a/Applications/Cxx/gdcmdump.cxx
+++ b/Applications/Cxx/gdcmdump.cxx
@@ -49,6 +49,7 @@
#include "gdcmASN1.h"
#include "gdcmAttribute.h"
#include "gdcmBase64.h"
+#include "gdcmTagKeywords.h"
#include <string>
#include <iostream>
@@ -977,16 +978,55 @@ static int PrintMrProtocol(const std::string & filename)
gdcm::CSAHeader csa;
const gdcm::DataSet& ds = reader.GetFile().GetDataSet();
gdcm::MrProtocol mrprot;
+ const gdcm::PrivateTag att1(0x21,0x19,"SIEMENS MR SDS 01");
+ const gdcm::PrivateTag att2(0x21,0xfe,"SIEMENS MR SDS 01");
+ bool found = false;
+ namespace kwd = gdcm::Keywords;
+ kwd::SharedFunctionalGroupsSequence sfgs;
if( csa.GetMrProtocol(ds, mrprot))
{
- std::cout << mrprot;
+ found = true;
}
- else
+ else if( ds.FindDataElement( att1) )
{
- std::cout << "Could not find MrProtocol/MrPhoenixProtocol ASCII section" << std::endl;
+ const gdcm::DataElement &data = ds.GetDataElement( att1 );
+ const gdcm::ByteValue *bv = data.GetByteValue();
+ static const char csastr[] = "PhoenixMetaProtocol"; // FIXME
+ if( mrprot.Load( bv, csastr, -1))
+ found = true;
+ }
+ // SIEMENS now supports Enhanced MR
+ else if( ds.FindDataElement( sfgs.GetTag() ) )
+ {
+ const gdcm::DataElement &shared = ds.GetDataElement( sfgs.GetTag() );
+ gdcm::SmartPointer<gdcm::SequenceOfItems> sqi = shared.GetValueAsSQ();
+ if( sqi != NULL && sqi->GetNumberOfItems() == 1 ) {
+ gdcm::Item &item = sqi->GetItem(1);
+ gdcm::DataSet & subds = item.GetNestedDataSet();
+ if( subds.FindDataElement( att2) ) {
+ const gdcm::DataElement &privsq = subds.GetDataElement( att2 );
+ gdcm::SmartPointer<gdcm::SequenceOfItems> sqi2 = privsq.GetValueAsSQ();
+ if( sqi2 != NULL && sqi2->GetNumberOfItems() == 1 ) {
+ gdcm::Item &item2 = sqi2->GetItem(1);
+ gdcm::DataSet & subds2 = item2.GetNestedDataSet();
+ if( subds2.FindDataElement( att1) ) {
+ const gdcm::DataElement &data = subds2.GetDataElement( att1 );
+ const gdcm::ByteValue *bv = data.GetByteValue();
+ static const char csastr[] = "PhoenixMetaProtocol"; // FIXME
+ if( mrprot.Load( bv, csastr, -1))
+ found = true;
+ }
+ }
+ }
+ }
}
- return 0;
+ if( found )
+ std::cout << mrprot;
+ else
+ std::cerr << "Could not find MrProtocol/MrPhoenixProtocol ASCII section" << std::endl;
+
+ return found ? 0 : 1;
}
diff --git a/Applications/Cxx/gdcminfo.cxx b/Applications/Cxx/gdcminfo.cxx
index bf8b013..0143bf3 100644
--- a/Applications/Cxx/gdcminfo.cxx
+++ b/Applications/Cxx/gdcminfo.cxx
@@ -194,7 +194,11 @@ static std::string getInfoDate(Dict *infoDict, const char *key)
//char buf[256];
std::string out;
+#ifdef LIBPOPPLER_NEW_OBJECT_API
+ if ((obj = infoDict->lookup((char*)key)).isString())
+#else
if (infoDict->lookup((char*)key, &obj)->isString())
+#endif
{
s = obj.getString()->getCString();
if (s[0] == 'D' && s[1] == ':')
@@ -242,7 +246,9 @@ static std::string getInfoDate(Dict *infoDict, const char *key)
out = date;
}
}
+#ifndef LIBPOPPLER_NEW_OBJECT_API
obj.free();
+#endif
return out;
}
@@ -256,7 +262,11 @@ static std::string getInfoString(Dict *infoDict, const char *key, UnicodeMap *uM
int i, n;
std::string out;
+#ifdef LIBPOPPLER_NEW_OBJECT_API
+ if ((obj = infoDict->lookup((char*)key)).isString())
+#else
if (infoDict->lookup((char*)key, &obj)->isString())
+#endif
{
s1 = obj.getString();
if ((s1->getChar(0) & 0xff) == 0xfe &&
@@ -288,7 +298,9 @@ static std::string getInfoString(Dict *infoDict, const char *key, UnicodeMap *uM
out.append( std::string(buf, n) );
}
}
+#ifndef LIBPOPPLER_NEW_OBJECT_API
obj.free();
+#endif
return out;
}
#endif
@@ -452,7 +464,11 @@ static int ProcessOneFile( std::string const & filename, gdcm::Defs const & defs
MemStream *appearStream;
appearStream = new MemStream((char*)bv->GetPointer(), 0,
+#ifdef LIBPOPPLER_NEW_OBJECT_API
+ bv->GetLength(), std::move(appearDict));
+#else
bv->GetLength(), &appearDict);
+#endif
GooString *ownerPW, *userPW;
ownerPW = NULL;
userPW = NULL;
@@ -480,7 +496,11 @@ static int ProcessOneFile( std::string const & filename, gdcm::Defs const & defs
Object info;
if (doc->isOk())
{
+#ifdef LIBPOPPLER_NEW_OBJECT_API
+ info = doc->getDocInfo();
+#else
doc->getDocInfo(&info);
+#endif
if (info.isDict())
{
title = getInfoString(info.getDict(), "Title", uMap);
@@ -491,7 +511,9 @@ static int ProcessOneFile( std::string const & filename, gdcm::Defs const & defs
producer = getInfoString(info.getDict(), "Producer", uMap);
creationdate = getInfoDate( info.getDict(), "CreationDate" );
moddate = getInfoDate( info.getDict(), "ModDate" );
+#ifndef LIBPOPPLER_NEW_OBJECT_API
info.free();
+#endif
}
#ifdef LIBPOPPLER_CATALOG_HAS_STRUCTTREEROOT
const char *tagged = doc->getStructTreeRoot() ? "yes" : "no";
diff --git a/Applications/Cxx/gdcmpdf.cxx b/Applications/Cxx/gdcmpdf.cxx
index 4c7a7bb..92caad7 100644
--- a/Applications/Cxx/gdcmpdf.cxx
+++ b/Applications/Cxx/gdcmpdf.cxx
@@ -43,7 +43,11 @@ static std::string getInfoDate(Dict *infoDict, const char *key)
//char buf[256];
std::string out;
+#ifdef LIBPOPPLER_NEW_OBJECT_API
+ if ((obj = infoDict->lookup((char*)key)).isString())
+#else
if (infoDict->lookup((char*)key, &obj)->isString())
+#endif
{
s = obj.getString()->getCString();
if (s[0] == 'D' && s[1] == ':')
@@ -91,7 +95,9 @@ static std::string getInfoDate(Dict *infoDict, const char *key)
out = date;
}
}
+#ifndef LIBPOPPLER_NEW_OBJECT_API
obj.free();
+#endif
return out;
}
@@ -105,7 +111,11 @@ static std::string getInfoString(Dict *infoDict, const char *key, UnicodeMap *uM
int i, n;
std::string out;
+#ifdef LIBPOPPLER_NEW_OBJECT_API
+ if ((obj = infoDict->lookup((char*)key)).isString())
+#else
if (infoDict->lookup((char*)key, &obj)->isString())
+#endif
{
s1 = obj.getString();
if ((s1->getChar(0) & 0xff) == 0xfe &&
@@ -137,7 +147,9 @@ static std::string getInfoString(Dict *infoDict, const char *key, UnicodeMap *uM
out.append( std::string(buf, n) );
}
}
+#ifndef LIBPOPPLER_NEW_OBJECT_API
obj.free();
+#endif
unicode = unicode || isUnicode;
return out;
}
@@ -340,7 +352,9 @@ int main (int argc, char *argv[])
//ownerPW = new GooString( "toto" );
Object obj;
+#ifndef LIBPOPPLER_NEW_OBJECT_API
obj.initNull();
+#endif
doc = new PDFDoc(fileName, ownerPW, userPW);
if (doc->isEncrypted())
@@ -386,7 +400,11 @@ http://msdn.microsoft.com/en-us/library/078sfkak(VS.80).aspx
GBool isUnicode = gFalse;
if (doc->isOk())
{
+#ifdef LIBPOPPLER_NEW_OBJECT_API
+ info = doc->getDocInfo();
+#else
doc->getDocInfo(&info);
+#endif
if (info.isDict())
{
title = getInfoString(info.getDict(), "Title", uMap, isUnicode);
@@ -397,7 +415,9 @@ http://msdn.microsoft.com/en-us/library/078sfkak(VS.80).aspx
producer = getInfoString(info.getDict(), "Producer", uMap, isUnicode);
creationdate = getInfoDate( info.getDict(), "CreationDate" );
moddate = getInfoDate( info.getDict(), "ModDate" );
+#ifndef LIBPOPPLER_NEW_OBJECT_API
info.free();
+#endif
}
}
diff --git a/Applications/Cxx/gdcmtar.cxx b/Applications/Cxx/gdcmtar.cxx
index f16f39b..c86e8b5 100644
--- a/Applications/Cxx/gdcmtar.cxx
+++ b/Applications/Cxx/gdcmtar.cxx
@@ -65,12 +65,12 @@ static void PrintHelp()
std::cout << " -i --input DICOM filename" << std::endl;
std::cout << " -o --output DICOM filename" << std::endl;
std::cout << "Options:" << std::endl;
- std::cout << " --enhance enhance (default)" << std::endl;
- std::cout << " -U --unenhance unenhance" << std::endl;
- std::cout << " -M --mosaic Split SIEMENS Mosaic image into multiple frames." << std::endl;
- std::cout << " --mosaic-private When splitting SIEMENS Mosaic image into multiple frames, ppreserve private attributes (advanced user only)." << std::endl;
- std::cout << " -p --pattern Specify trailing file pattern." << std::endl;
- std::cout << " --root-uid Root UID." << std::endl;
+ std::cout << " --enhance Enhance (default)" << std::endl;
+ std::cout << " -U --unenhance Unenhance" << std::endl;
+ std::cout << " -M --mosaic Split SIEMENS Mosaic image into multiple frames." << std::endl;
+ std::cout << " --mosaic-private When splitting SIEMENS Mosaic image into multiple frames, preserve private attributes (advanced user only)." << std::endl;
+ std::cout << " -p --pattern Specify trailing file pattern." << std::endl;
+ std::cout << " --root-uid Root UID." << std::endl;
//std::cout << " --resources-path Resources path." << std::endl;
std::cout << "General Options:" << std::endl;
std::cout << " -V --verbose more verbose (warning+error)." << std::endl;
@@ -1327,7 +1327,7 @@ int main (int argc, char *argv[])
if( std::fabs(1. - snv_dot) > 1e-6 )
{
gdcmErrorMacro("Invalid direction found");
- return false;
+ return 1;
}
}
diff --git a/CMake/CTestCustom.ctest.in b/CMake/CTestCustom.ctest.in
index 9a5aa45..c49e971 100644
--- a/CMake/CTestCustom.ctest.in
+++ b/CMake/CTestCustom.ctest.in
@@ -35,6 +35,8 @@ SET(CTEST_CUSTOM_WARNING_EXCEPTION
"bootstrap class path not set in conjunction with"
"warning CS1699"
"has been explicitly marked deprecated here"
+ # clang-6.0: warning: the object size sanitizer has no effect at -O0, but is explicitly enabled: -fsanitize=float-cast-overflow,integer-divide-by-zero,null,object-size,return,shift,signed-integer-overflow,unreachable,vla-bound [-Winvalid-command-line-argument]
+ "the object size sanitizer has no effect at"
)
# Disable dynamic analysis on some tests:
diff --git a/CMake/InstallMacros.cmake b/CMake/InstallMacros.cmake
index e937b55..5d129de 100644
--- a/CMake/InstallMacros.cmake
+++ b/CMake/InstallMacros.cmake
@@ -56,37 +56,15 @@ macro(install_library library)
endmacro()
macro (install_pdb library)
- if (MSVC)
- if(CMAKE_CONFIGURATION_TYPES)
- # Visual Studio
- # The following does not work with LOCATION keyword. See:
- # http://www.cmake.org/pipermail/cmake/2011-February/042579.html
- foreach(cfg ${CMAKE_CONFIGURATION_TYPES})
- get_target_property(library_dll ${library} LOCATION_${cfg})
- string(REPLACE .dll .pdb library_pdb ${library_dll})
- string(TOLOWER ${cfg} lcfg)
- if(lcfg STREQUAL "debug" OR lcfg STREQUAL "relwithdebinfo")
- install (FILES ${library_pdb}
- DESTINATION ${GDCM_INSTALL_BIN_DIR}
- COMPONENT DebugDevel
- CONFIGURATIONS ${cfg}
- )
- endif()
- endforeach()
- else()
- # nmake
- # Same as above we need the explicit location_<config> variable to account for
- # the value of CMAKE_DEBUG_POSTFIX
- get_target_property(library_dll ${library} LOCATION_${CMAKE_BUILD_TYPE})
- string(REPLACE .dll .pdb library_pdb ${library_dll})
- string(TOLOWER ${CMAKE_BUILD_TYPE} lcfg)
- if(lcfg STREQUAL "debug" OR lcfg STREQUAL "relwithdebinfo")
- install (FILES ${library_pdb}
- DESTINATION ${GDCM_INSTALL_BIN_DIR}
- COMPONENT DebugDevel
- )
- endif()
- endif()
+ if(BUILD_SHARED_LIBS)
+ if (MSVC)
+ install (
+ FILES "$<TARGET_PDB_FILE:${library}>"
+ DESTINATION "${GDCM_INSTALL_BIN_DIR}"
+ COMPONENT DebugDevel
+ CONFIGURATIONS Debug RelWithDebInfo
+ )
+ endif ()
endif ()
endmacro ()
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1342e89..5c5031c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,12 +1,12 @@
cmake_minimum_required(VERSION 2.8.7)
if(POLICY CMP0022)
- cmake_policy(SET CMP0022 OLD)
+ cmake_policy(SET CMP0022 NEW)
endif()
if(POLICY CMP0025)
cmake_policy(SET CMP0025 NEW)
endif()
if(POLICY CMP0026)
- cmake_policy(SET CMP0026 OLD)
+ cmake_policy(SET CMP0026 NEW)
endif()
if(POLICY CMP0042)
cmake_policy(SET CMP0042 NEW)
@@ -35,7 +35,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 2)
+set(GDCM_BUILD_VERSION 3)
set(GDCM_VERSION
"${GDCM_MAJOR_VERSION}.${GDCM_MINOR_VERSION}.${GDCM_BUILD_VERSION}")
# let advanced user the option to define GDCM_API_VERSION:
@@ -543,7 +543,10 @@ set(GDCM_EXECUTABLE_DIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR})
#-----------------------------------------------------------------------------
# we need to link against CoreFoundation so that we can use CFBundle to get the executable path.
if(APPLE)
- find_library(COREFOUNDATION_LIBRARY CoreFoundation )
+ option(GDCM_USE_COREFOUNDATION_LIBRARY "Use COREFOUNDATION_LIBRARY?" ON)
+ if(GDCM_USE_COREFOUNDATION_LIBRARY)
+ find_library(COREFOUNDATION_LIBRARY CoreFoundation )
+ endif()
endif()
#-----------------------------------------------------------------------------
diff --git a/Examples/Cxx/CMakeLists.txt b/Examples/Cxx/CMakeLists.txt
index cc348d1..2c7a018 100644
--- a/Examples/Cxx/CMakeLists.txt
+++ b/Examples/Cxx/CMakeLists.txt
@@ -65,6 +65,7 @@ set(EXAMPLES_SRCS
LargeVRDSExplicit
ExtractEncryptedContent
ReadAndDumpDICOMDIR
+ #ReadAndDumpDICOMDIR2 # commented out since requires C++11
GenerateStandardSOPClasses
ClinicalTrialAnnotate
CheckBigEndianBug
diff --git a/Examples/Cxx/ReadAndDumpDICOMDIR2.cxx b/Examples/Cxx/ReadAndDumpDICOMDIR2.cxx
new file mode 100755
index 0000000..bc8de1a
--- /dev/null
+++ b/Examples/Cxx/ReadAndDumpDICOMDIR2.cxx
@@ -0,0 +1,393 @@
+/*=========================================================================
+
+ Program: GDCM (Grassroots DICOM). A DICOM library
+
+ Copyright (c) 2006-2017 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.
+
+=========================================================================*/
+/*
+ * This example shows how to read and dump a DICOMDIR File
+ *
+ * Thanks:
+ * Tom Marynowski (lordglub gmail) for contributing the original
+ * ReadAndDumpDICOMDIR.cxx example
+ * Mihail Isakov for contributing offset calculation code here:
+ * https://sourceforge.net/p/gdcm/mailman/gdcm-developers/?viewmonth=201707&viewday=15
+ * Tod Baudais for combining the above and cleaning up this example
+ */
+
+#include <string>
+#include <unordered_map>
+#include <iostream>
+#include <memory>
+
+#include "gdcmReader.h"
+#include "gdcmAttribute.h"
+#include "gdcmDirectory.h"
+
+//==============================================================================
+//==============================================================================
+
+#define TAG_MEDIA_STORAGE_SOP_CLASS_UID 0x0002,0x0002
+#define TAG_DIRECTORY_RECORD_SEQUENCE 0x0004,0x1220
+#define TAG_DIRECTORY_RECORD_TYPE 0x0004,0x1430
+#define TAG_PATIENTS_NAME 0x0010,0x0010
+#define TAG_PATIENT_ID 0x0010,0x0020
+#define TAG_STUDY_DATE 0x0008,0x0020
+#define TAG_STUDY_DESCRIPTION 0x0008,0x1030
+#define TAG_MODALITY 0x0008,0x0060
+#define TAG_SERIES_DESCRIPTION 0x0008,0x103E
+#define TAG_REFERENCED_FILE_ID 0x0004,0x1500
+#define TAG_REFERENCED_LOWER_LEVEL_DIRECTORY_ENTITY_OFFSET 0x0004,0x1420
+#define TAG_NEXT_DIRECTORY_RECORD_OFFSET 0x0004,0x1400
+
+//==============================================================================
+// Some handy utility functions
+//==============================================================================
+
+std::string left_trim(const std::string &s) {
+ std::string ss(s);
+ ss.erase(ss.begin(), std::find_if(ss.begin(), ss.end(), std::not1(std::ptr_fun<int, int>(std::isspace))));
+ return ss;
+}
+
+std::string right_trim(const std::string &s) {
+ std::string ss(s);
+ ss.erase(std::find_if(ss.rbegin(), ss.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), ss.end());
+ return ss;
+}
+
+std::string trim(const std::string &s) {
+ return left_trim(right_trim(s));
+}
+
+//==============================================================================
+// This code could be put in a header file somewhere
+//==============================================================================
+
+class DICOMDIRReader {
+ public:
+ DICOMDIRReader (void) {}
+ DICOMDIRReader (const DICOMDIRReader &rhs) = delete;
+ DICOMDIRReader (DICOMDIRReader &&rhs) = delete;
+ DICOMDIRReader & operator = (const DICOMDIRReader &rhs) = delete;
+ DICOMDIRReader & operator = (DICOMDIRReader &&rhs) = delete;
+ virtual ~DICOMDIRReader (void) {}
+
+ public:
+ struct Common {
+ int64_t child_offset;
+ int64_t sibling_offset;
+ };
+
+ struct Image: public Common {
+ std::string path;
+ };
+
+ struct Series: public Common {
+ std::string modality;
+ std::string description;
+
+ std::vector<std::shared_ptr<Image>> children;
+ };
+
+ struct Study: public Common {
+ std::string date;
+ std::string description;
+
+ std::vector<std::shared_ptr<Series>> children;
+ };
+
+ struct Patient: public Common {
+ std::string name;
+ std::string id;
+
+ std::vector<std::shared_ptr<Study>> children;
+ };
+
+ struct Other: public Common {
+ };
+
+ /// Load DICOMDIR
+ const std::vector<std::shared_ptr<Patient>>& load (const std::string &path);
+
+ /// Return the results of the load
+ const std::vector<std::shared_ptr<Patient>>& patients (void) { return _patients; }
+
+ private:
+
+ template <class T>
+ std::string get_string (const T &ds, const gdcm::Tag &tag)
+ {
+ std::stringstream strm;
+ if (ds.FindDataElement(tag)) {
+ auto &de = ds.GetDataElement(tag);
+ if (!de.IsEmpty() && !de.IsUndefinedLength())
+ de.GetValue().Print(strm);
+ }
+ return trim(strm.str());
+ }
+
+ template <class P, class C, class O>
+ void reassemble_hierarchy (P &parent_offsets, C &child_offsets, O &other_offsets)
+ {
+ for (auto &parent : parent_offsets) {
+ int64_t sibling_offset;
+ auto c = child_offsets[parent.second->child_offset];
+ if (!c) {
+ auto o = other_offsets[parent.second->child_offset];
+ if (!o) {
+ continue;
+ } else {
+ sibling_offset = o->sibling_offset;
+ }
+ } else {
+ parent.second->children.push_back(c);
+ sibling_offset = c->sibling_offset;
+ }
+
+ // Get all siblings
+ while (sibling_offset) {
+ c = child_offsets[sibling_offset];
+ if (!c) {
+ auto o = other_offsets[sibling_offset];
+ if (!o) {
+ break;
+ } else {
+ sibling_offset = o->sibling_offset;
+ }
+ } else {
+ parent.second->children.push_back(c);
+ sibling_offset = c->sibling_offset;
+ }
+ }
+ }
+ }
+
+ std::vector<std::shared_ptr<Patient>> _patients;
+};
+
+//==============================================================================
+// This code could be put in an implementation file somewhere
+//==============================================================================
+
+const std::vector<std::shared_ptr<DICOMDIRReader::Patient>>& DICOMDIRReader::load (const std::string &path)
+{
+ _patients.clear();
+
+ //
+ // Read the dataset from the DICOMDIR file
+ //
+
+ gdcm::Reader reader;
+ reader.SetFileName(path.c_str());
+ if(!reader.Read()) {
+ throw std::runtime_error("Unable to read file");
+ }
+
+ // Retrieve information from file
+ auto &file = reader.GetFile();
+ auto &data_set = file.GetDataSet();
+ auto &file_meta_information = file.GetHeader();
+
+ // Retrieve and check the Media Storage class from file
+ gdcm::MediaStorage media_storage;
+ media_storage.SetFromFile(file);
+ if(media_storage != gdcm::MediaStorage::MediaStorageDirectoryStorage) {
+ throw std::runtime_error("This file is not a DICOMDIR");
+ }
+
+ auto media_storage_sop_class_uid = get_string(file_meta_information, gdcm::Tag(TAG_MEDIA_STORAGE_SOP_CLASS_UID));
+
+ // Make sure we have a DICOMDIR file
+ if (media_storage_sop_class_uid != "1.2.840.10008.1.3.10") {
+ throw std::runtime_error("This file is not a DICOMDIR");
+ }
+
+ //
+ // Offset to first item courtesy of Mihail Isakov
+ //
+
+ gdcm::VL first_item_offset = 0;
+ auto it = data_set.Begin();
+ for(; it != data_set.End() && it->GetTag() != gdcm::Tag(TAG_DIRECTORY_RECORD_SEQUENCE); ++it) {
+ first_item_offset += it->GetLength<gdcm::ExplicitDataElement>();
+ }
+ // Tag (4 bytes)
+ first_item_offset += it->GetTag().GetLength();
+ // VR field
+ first_item_offset += it->GetVR().GetLength();
+ // VL field
+ // For Explicit VR: adventitiously VL field lenght = VR field lenght,
+ // for SQ 4 bytes:
+ // http://dicom.nema.org/medical/dicom/current/output/html/part05.html#table_7.1-1
+ first_item_offset += it->GetVR().GetLength();
+
+ //
+ // Iterate all data elements
+ //
+
+ // For each item in data set
+ for(auto data_element : data_set.GetDES()) {
+
+ // Only look at Directory sequence
+ if (data_element.GetTag() != gdcm::Tag(TAG_DIRECTORY_RECORD_SEQUENCE))
+ continue;
+
+ auto item_sequence = data_element.GetValueAsSQ();
+ auto num_items = item_sequence->GetNumberOfItems();
+
+ //
+ // Compute an offset table
+ //
+
+ // Start calculation of offset to each item courtesy of Mihail Isakov
+ std::vector<int64_t> item_offsets(num_items+1);
+ item_offsets[0] = file_meta_information.GetFullLength() + static_cast<int64_t>(first_item_offset);
+
+ //
+ // Extract out all of the items
+ //
+
+ std::unordered_map<int64_t, std::shared_ptr<Patient>> patient_offsets;
+ std::unordered_map<int64_t, std::shared_ptr<Study>> study_offsets;
+ std::unordered_map<int64_t, std::shared_ptr<Series>> series_offsets;
+ std::unordered_map<int64_t, std::shared_ptr<Image>> image_offsets;
+ std::unordered_map<int64_t, std::shared_ptr<Other>> other_offsets;
+
+ for (uint32_t item_index = 1; item_index <= num_items; ++item_index) {
+ auto &item = item_sequence->GetItem(item_index);
+
+ // Add offset for item to offset table
+ item_offsets[item_index] = item_offsets[item_index-1] + item.GetLength<gdcm::ExplicitDataElement>();
+
+ // Child offset
+ gdcm::Attribute<TAG_REFERENCED_LOWER_LEVEL_DIRECTORY_ENTITY_OFFSET> child_offset;
+ child_offset.SetFromDataElement(item.GetDataElement(gdcm::Tag (TAG_REFERENCED_LOWER_LEVEL_DIRECTORY_ENTITY_OFFSET)));
+
+ // Sibling offset
+ gdcm::Attribute<TAG_NEXT_DIRECTORY_RECORD_OFFSET> sibling_offset;
+ sibling_offset.SetFromDataElement(item.GetDataElement(gdcm::Tag (TAG_NEXT_DIRECTORY_RECORD_OFFSET)));
+
+ // Record Type
+ auto record_type = trim(get_string(item, gdcm::Tag (TAG_DIRECTORY_RECORD_TYPE)));
+
+ // std::cout << "record_type " << record_type << " at " << item_offsets[item_index-1] << std::endl;
+ // std::cout << " child_offset " << child_offset.GetValue() << std::endl;
+ // std::cout << " sibling_offset " << sibling_offset.GetValue() << std::endl;
+
+ // Extract patient information
+ if (record_type == "PATIENT") {
+ auto patient = std::make_shared<Patient>();
+ patient->name = get_string(item, gdcm::Tag (TAG_PATIENTS_NAME));
+ patient->id = get_string(item, gdcm::Tag (TAG_PATIENT_ID));
+
+ patient->child_offset = child_offset.GetValue();
+ patient->sibling_offset = sibling_offset.GetValue();
+ patient_offsets[item_offsets[item_index-1]] = patient;
+
+ // Extract study information
+ } else if (record_type == "STUDY") {
+ auto study = std::make_shared<Study>();
+ study->date = get_string(item, gdcm::Tag (TAG_STUDY_DATE));
+ study->description = get_string(item, gdcm::Tag (TAG_STUDY_DESCRIPTION));
+
+ study->child_offset = child_offset.GetValue();
+ study->sibling_offset = sibling_offset.GetValue();
+ study_offsets[item_offsets[item_index-1]] = study;
+
+ // Extract series information
+ } else if (record_type == "SERIES") {
+ auto series = std::make_shared<Series>();
+ series->modality = get_string(item, gdcm::Tag (TAG_MODALITY));
+ series->description = get_string(item, gdcm::Tag (TAG_SERIES_DESCRIPTION));
+
+ series->child_offset = child_offset.GetValue();
+ series->sibling_offset = sibling_offset.GetValue();
+ series_offsets[item_offsets[item_index-1]] = series;
+
+ // Extract image information
+ } else if (record_type == "IMAGE") {
+ auto image = std::make_shared<Image>();
+ image->path = get_string(item, gdcm::Tag (TAG_REFERENCED_FILE_ID));
+
+ image->child_offset = child_offset.GetValue();
+ image->sibling_offset = sibling_offset.GetValue();
+ image_offsets[item_offsets[item_index-1]] = image;
+ } else {
+ auto other = std::make_shared<Other>();
+
+ other->child_offset = child_offset.GetValue();
+ other->sibling_offset = sibling_offset.GetValue();
+ other_offsets[item_offsets[item_index-1]] = other;
+ }
+ }
+
+ // Check validity
+ if (patient_offsets.size() == 0)
+ throw std::runtime_error("Unable to find patient record");
+
+ reassemble_hierarchy(series_offsets, image_offsets, other_offsets);
+ reassemble_hierarchy(study_offsets, series_offsets, other_offsets);
+ reassemble_hierarchy(patient_offsets, study_offsets, other_offsets);
+
+ // Set the new root
+ for (auto &patient : patient_offsets) {
+ _patients.push_back(patient.second);
+ }
+ }
+
+ return _patients;
+}
+
+//==============================================================================
+// Quick test
+//==============================================================================
+
+int main(int argc, const char *argv[]) {
+ DICOMDIRReader reader;
+
+ try {
+ if (argc != 2)
+ throw std::runtime_error("Wrong number of arguments");
+
+ auto &patients = reader.load(argv[1]);
+
+ for (auto &patient : patients) {
+
+ std::cout << "PATIENT" << std::endl;
+ std::cout << "NAME: " << patient->name << std::endl;
+ std::cout << "ID: " << patient->id << std::endl;
+
+ int x = 0;
+ for (auto &study : patient->children) {
+ std::cout << " STUDY" << std::endl;
+ std::cout << " DESCRIPTION: " << study->description << std::endl;
+ std::cout << " DATE: " << study->date << std::endl;
+
+ for (auto &series : study->children) {
+ x+=1;
+ std::cout << " SERIES " << x << std::endl;
+ std::cout << " DESCRIPTION: " << series->description << std::endl;
+ std::cout << " MODALITY: " << series->modality << std::endl;
+
+ for (auto &image : series->children) {
+ std::cout << " IMAGE PATH: " << image->path << std::endl;
+ }
+ }
+ }
+ }
+ }
+ catch (...) {
+ // TODO handle this
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/Examples/Python/DecompressImage.py b/Examples/Python/DecompressImage.py
index c3b7018..8d88bd3 100644
--- a/Examples/Python/DecompressImage.py
+++ b/Examples/Python/DecompressImage.py
@@ -31,8 +31,14 @@ if __name__ == "__main__":
if not r.Read():
sys.exit(1)
- image = gdcm.Image()
+ # check GetFragment API:
+ pd = r.GetFile().GetDataSet().GetDataElement(gdcm.Tag(0x7fe0, 0x0010))
+ frags = pd.GetSequenceOfFragments();
+ frags.GetFragment(0);
+
ir = r.GetImage()
+ w = gdcm.ImageWriter()
+ image = w.GetImage()
image.SetNumberOfDimensions( ir.GetNumberOfDimensions() );
dims = ir.GetDimensions();
@@ -42,7 +48,7 @@ if __name__ == "__main__":
# Just for fun:
dircos = ir.GetDirectionCosines()
- t = gdcm.Orientation.GetType(dircos)
+ t = gdcm.Orientation.GetType(tuple(dircos))
l = gdcm.Orientation.GetLabel(t)
print "Orientation label:",l
@@ -61,7 +67,6 @@ if __name__ == "__main__":
pixeldata.SetByteValue( str1, gdcm.VL( len(str1) ) )
image.SetDataElement( pixeldata )
- w = gdcm.ImageWriter()
w.SetFileName( file2 )
w.SetFile( r.GetFile() )
w.SetImage( image )
diff --git a/Source/Common/CMakeLists.txt b/Source/Common/CMakeLists.txt
index b2ea721..488cc07 100644
--- a/Source/Common/CMakeLists.txt
+++ b/Source/Common/CMakeLists.txt
@@ -188,27 +188,29 @@ add_library(gdcmCommon ${Common_SRCS})
#target_link_libraries(gdcmCommon ${GDCM_ZLIB_LIBRARIES}) # ${GDCM_POLARSSL_LIBRARIES})
if(GDCM_BUILD_TESTING)
-target_link_libraries(gdcmCommon gdcmmd5 )
+ target_link_libraries(gdcmCommon LINK_PRIVATE gdcmmd5)
endif()
if(APPLE)
- target_link_libraries(gdcmCommon ${COREFOUNDATION_LIBRARY})
+ if(GDCM_USE_COREFOUNDATION_LIBRARY)
+ target_link_libraries(gdcmCommon LINK_PRIVATE ${COREFOUNDATION_LIBRARY})
+ endif()
endif()
if(UNIX)
- target_link_libraries(gdcmCommon ${CMAKE_DL_LIBS})
+ target_link_libraries(gdcmCommon LINK_PRIVATE ${CMAKE_DL_LIBS})
endif()
if(WIN32)
- target_link_libraries(gdcmCommon ws2_32)
- target_link_libraries(gdcmCommon crypt32)
+ target_link_libraries(gdcmCommon LINK_PRIVATE ws2_32)
+ target_link_libraries(gdcmCommon LINK_PRIVATE crypt32)
endif()
if(GDCM_USE_SYSTEM_OPENSSL)
include_directories(${OPENSSL_INCLUDE_DIR})
- target_link_libraries(gdcmCommon ${OPENSSL_LIBRARIES})
+ target_link_libraries(gdcmCommon LINK_PRIVATE ${OPENSSL_LIBRARIES})
endif()
set_target_properties(gdcmCommon PROPERTIES ${GDCM_LIBRARY_PROPERTIES})
if(BUILD_SHARED_LIBS)
- set_target_properties(gdcmCommon PROPERTIES INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "")
+ #set_target_properties(gdcmCommon PROPERTIES INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "")
endif()
# libs
diff --git a/Source/Common/gdcmConfigure.h.in b/Source/Common/gdcmConfigure.h.in
index b01444a..2f3b10a 100644
--- a/Source/Common/gdcmConfigure.h.in
+++ b/Source/Common/gdcmConfigure.h.in
@@ -166,4 +166,7 @@
#cmakedefine GDCM_ALWAYS_TRACE_MACRO
+/* ITK Specific */
+#cmakedefine GDCM_USE_COREFOUNDATION_LIBRARY
+
#endif
diff --git a/Source/Common/gdcmSwapper.txx b/Source/Common/gdcmSwapper.txx
index 34cb1d5..88e530a 100644
--- a/Source/Common/gdcmSwapper.txx
+++ b/Source/Common/gdcmSwapper.txx
@@ -22,7 +22,7 @@
#define bswap_32(X) _byteswap_ulong(X)
#define bswap_64(X) _byteswap_uint64(X)
-#elif defined(__GLIBC__) || defined(__CYGWIN__) || defined(__ANDROID__) || defined(__EMSCRIPTEN__) // linux and al
+#elif defined(GDCM_HAVE_BYTESWAP_H)
#include <endian.h>
#include <byteswap.h>
@@ -72,6 +72,12 @@
(((x) & 0x00FF000000000000ULL) >> 40) | \
(((x) & 0xFF00000000000000ULL) >> 56))
+#else
+
+// If this condition is encountered, first check whether the platform has the functions required.
+// If not, test whether the workaround for __MINGW32__ can be used for this platform.
+#error "Byte swap methods are not available."
+
#endif
#include "gdcmTag.h"
diff --git a/Source/Common/gdcmSystem.cxx b/Source/Common/gdcmSystem.cxx
index 0721bdf..4a07aa8 100644
--- a/Source/Common/gdcmSystem.cxx
+++ b/Source/Common/gdcmSystem.cxx
@@ -42,9 +42,9 @@
#elif defined(GDCM_HAVE__SNPRINTF)
#define snprintf _snprintf
#endif
-#ifdef __APPLE__
+#ifdef GDCM_USE_COREFOUNDATION_LIBRARY
#include <CoreFoundation/CoreFoundation.h>
-#endif // __APPLE__
+#endif
#if defined(_WIN32) && (defined(_MSC_VER) || defined(__WATCOMC__) ||defined(__BORLANDC__) || defined(__MINGW32__))
#include <io.h>
@@ -421,7 +421,7 @@ const char *System::GetCurrentProcessFileName()
{
return buf;
}
-#elif defined(__APPLE__)
+#elif defined(GDCM_USE_COREFOUNDATION_LIBRARY)
static char buf[PATH_MAX];
Boolean success = false;
CFURLRef pathURL = CFBundleCopyExecutableURL(CFBundleGetMainBundle());
@@ -490,7 +490,7 @@ const char *System::GetCurrentModuleFileName()
const char *System::GetCurrentResourcesDirectory()
{
-#ifdef __APPLE__
+#ifdef GDCM_USE_COREFOUNDATION_LIBRARY
static char path[PATH_MAX];
Boolean success = false;
CFURLRef pathURL = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());
diff --git a/Source/DataDictionary/CMakeLists.txt b/Source/DataDictionary/CMakeLists.txt
index 609c207..81c910f 100644
--- a/Source/DataDictionary/CMakeLists.txt
+++ b/Source/DataDictionary/CMakeLists.txt
@@ -96,10 +96,10 @@ set(DICT_SRCS
)
add_library(gdcmDICT ${DICT_SRCS})
-target_link_libraries(gdcmDICT gdcmDSED gdcmIOD)
+target_link_libraries(gdcmDICT LINK_PRIVATE gdcmDSED gdcmIOD)
set_target_properties(gdcmDICT PROPERTIES ${GDCM_LIBRARY_PROPERTIES})
if(BUILD_SHARED_LIBS)
- set_target_properties(gdcmDICT PROPERTIES INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "")
+ #set_target_properties(gdcmDICT PROPERTIES INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "")
endif()
# libs
diff --git a/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx b/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
index b1e46df..716c2d5 100644
--- a/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
+++ b/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
@@ -37,6 +37,92 @@ typedef struct
} DICT_ENTRY;
static const DICT_ENTRY DICOMV3DataDict [] = {
+ {0x0021,0x0001,"SIEMENS MR SDR 01",VR::LO,VM::VM1,"??",false},
+ {0x0021,0x0001,"SIEMENS MR SDS 01",VR::IS,VM::VM1,"??",false},
+ {0x0021,0x0002,"SIEMENS MR SDR 01",VR::LO,VM::VM1,"??",false},
+ {0x0021,0x0003,"SIEMENS MR SDI 02",VR::DS,VM::VM1,"FrameAcquisitionDuration",false},
+ {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,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,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},
+ {0x0021,0x0011,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
+ {0x0021,0x0012,"SIEMENS MR SDS 01",VR::FD,VM::VM1,"??",false},
+ {0x0021,0x0013,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
+ {0x0021,0x0014,"SIEMENS MR SDS 01",VR::IS,VM::VM1,"??",false},
+ {0x0021,0x0016,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
+ {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 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},
+ {0x0021,0x001c,"SIEMENS MR SDS 01",VR::DS,VM::VM3,"??",false},
+ {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,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},
+ {0x0021,0x0027,"SIEMENS MR SDS 01",VR::US,VM::VM1,"??",false},
+ {0x0021,0x002a,"SIEMENS MR SDS 01",VR::IS,VM::VM1_n,"?CoilId?",false},
+ {0x0021,0x002b,"SIEMENS MR SDS 01",VR::ST,VM::VM1,"?ImaAbsTablePosition?",false},
+ {0x0021,0x002c,"SIEMENS MR SDS 01",VR::DS,VM::VM3,"??",false},
+ {0x0021,0x002d,"SIEMENS MR SDS 01",VR::DS,VM::VM3,"??",false},
+ {0x0021,0x002e,"SIEMENS MR SDS 01",VR::IS,VM::VM1,"??",false},
+ {0x0021,0x002f,"SIEMENS MR SDS 01",VR::DS,VM::VM3,"??",false},
+ {0x0021,0x0030,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
+ {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,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},
+ {0x0021,0x0036,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
+ {0x0021,0x0037,"SIEMENS MR SDS 01",VR::SH,VM::VM1,"??",false},
+ {0x0021,0x0038,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
+ {0x0021,0x003b,"SIEMENS MR SDS 01",VR::DS,VM::VM1,"??",false},
+ {0x0021,0x003d,"SIEMENS MR SDS 01",VR::CS,VM::VM1,"?Image Acquisition Param?",false},
+ {0x0021,0x0041,"SIEMENS MR SDI 02",VR::SH,VM::VM1,"?GSWDDataType?",false},
+ {0x0021,0x0042,"SIEMENS MR SDI 02",VR::IS,VM::VM1,"?RealDwellTime?",false},
+ {0x0021,0x0044,"SIEMENS MR SDS 01",VR::DS,VM::VM2,"??",false},
+ {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,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,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},
+ {0x0021,0x0059,"SIEMENS MR SDI 02",VR::IS,VM::VM3,"?ImaRelTablePosition?",false},
+ {0x0021,0x005a,"SIEMENS MR SDS 01",VR::CS,VM::VM1,"?Sequence Varient 1?",false},
+ {0x0021,0x005b,"SIEMENS MR SDI 02",VR::FD,VM::VM3,"Image Position (Patient)",false},
+ {0x0021,0x005b,"SIEMENS MR SDS 01",VR::CS,VM::VM1,"?Sequence Varient 2?",false},
+ {0x0021,0x005d,"SIEMENS MR SDS 01",VR::SL,VM::VM1,"??",false},
+ {0x0021,0x005e,"SIEMENS MR SDI 02",VR::IS,VM::VM1,"?FrameIndex?",false},
+ {0x0021,0x0063,"SIEMENS MR SDI 02",VR::IS,VM::VM1,"?Acquisition Number?",false},
+ {0x0021,0x0071,"SIEMENS MR SDI 02",VR::UT,VM::VM1,"?may contain PHI?",false},
+ {0x0021,0x0075,"SIEMENS MR SDI 02",VR::CS,VM::VM1_n,"Image Type",false},
+ {0x0021,0x0076,"SIEMENS MR SDI 02",VR::LO,VM::VM1_n,"Acquisition Info",false},
+ {0x0021,0x0077,"SIEMENS MR SDI 02",VR::LO,VM::VM1,"Sequence Name",false},
+ {0x0021,0x0078,"SIEMENS MR SDI 02",VR::CS,VM::VM1,"Acquisition Type 1",false},
+ {0x0021,0x0079,"SIEMENS MR SDI 02",VR::CS,VM::VM1,"Acquisition Type 2",false},
+ {0x0021,0x0088,"SIEMENS MR SDI 02",VR::DS,VM::VM1,"Slice Location",false},
+ {0x0021,0x008a,"SIEMENS MR SDI 02",VR::IS,VM::VM1,"Instance/Frame Number",false},
+ {0x0021,0x00fe,"SIEMENS MR SDI 02",VR::SQ,VM::VM1,"??",false},
+ {0x0021,0x00fe,"SIEMENS MR SDS 01",VR::SQ,VM::VM1,"??",false},
+ {0x0089,0x0054,"SYNGO_IMAGING",VR::OW,VM::VM1,"??",false},
+ {0x0095,0x00fa,"SIENET",VR::PN,VM::VM1,"?Some kind of Patient Name?",false},
{0x8ff1,0x0010,"SSI Image enhancement Group",VR::LO,VM::VM1,"SSI Image enhancement Group Version",false },
{0x8ff1,0x0020,"SSI Image enhancement Group",VR::IS,VM::VM256,"RGB LUT",false },
{0x8ff1,0x0024,"SSI Image enhancement Group",VR::LO,VM::VM1,"LUT Description",false },
diff --git a/Source/DataStructureAndEncodingDefinition/CMakeLists.txt b/Source/DataStructureAndEncodingDefinition/CMakeLists.txt
index b9b428e..af9a240 100644
--- a/Source/DataStructureAndEncodingDefinition/CMakeLists.txt
+++ b/Source/DataStructureAndEncodingDefinition/CMakeLists.txt
@@ -85,13 +85,13 @@ if(NOT GDCM_USE_SYSTEM_ZLIB)
endif()
add_library(gdcmDSED ${DSED_SRCS} ${DSED3_SRCS})
-target_link_libraries(gdcmDSED gdcmCommon)
+target_link_libraries(gdcmDSED LINK_PUBLIC gdcmCommon)
# zlib stuff are actually included (template) so we need to link them here.
-target_link_libraries(gdcmDSED ${GDCM_ZLIB_LIBRARIES})
+target_link_libraries(gdcmDSED LINK_PRIVATE ${GDCM_ZLIB_LIBRARIES})
set_target_properties(gdcmDSED PROPERTIES ${GDCM_LIBRARY_PROPERTIES})
if(BUILD_SHARED_LIBS)
- set(_ill "gdcmCommon")
- set_target_properties(gdcmDSED PROPERTIES INTERFACE_LINK_LIBRARIES "${_ill}" LINK_INTERFACE_LIBRARIES "${_ill}")
+ #set(_ill "gdcmCommon")
+ #set_target_properties(gdcmDSED PROPERTIES INTERFACE_LINK_LIBRARIES "${_ill}" LINK_INTERFACE_LIBRARIES "${_ill}")
endif()
# libs
diff --git a/Source/DataStructureAndEncodingDefinition/gdcmCSAHeader.h b/Source/DataStructureAndEncodingDefinition/gdcmCSAHeader.h
index 2782a68..0e5e87e 100644
--- a/Source/DataStructureAndEncodingDefinition/gdcmCSAHeader.h
+++ b/Source/DataStructureAndEncodingDefinition/gdcmCSAHeader.h
@@ -77,11 +77,11 @@ public :
ZEROED_OUT
} CSAHeaderType;
- GDCM_LEGACY(template <typename TSwap>
- std::istream &Read(std::istream &is));
+ template <typename TSwap>
+ GDCM_LEGACY(std::istream &Read(std::istream &is));
- GDCM_LEGACY(template <typename TSwap>
- const std::ostream &Write(std::ostream &os) const);
+ template <typename TSwap>
+ GDCM_LEGACY(const std::ostream &Write(std::ostream &os) const);
/// Decode the CSAHeader from element 'de'
bool LoadFromDataElement(DataElement const &de);
diff --git a/Source/DataStructureAndEncodingDefinition/gdcmMrProtocol.cxx b/Source/DataStructureAndEncodingDefinition/gdcmMrProtocol.cxx
index b22b92f..2b8e163 100644
--- a/Source/DataStructureAndEncodingDefinition/gdcmMrProtocol.cxx
+++ b/Source/DataStructureAndEncodingDefinition/gdcmMrProtocol.cxx
@@ -63,6 +63,18 @@ bool MrProtocol::Load( const ByteValue * bv, const char * csastr, int version )
if( !hasstarted )
{
hasstarted = starts_with(s, begin);
+ if( hasstarted ) {
+ if( version == -1 ) {
+ // find version if not specified:
+ static const char vers[] = "version=";
+ std::string::size_type p = s.find(vers);
+ if ( p != std::string::npos) {
+ const char *v = s.c_str() + p + sizeof(vers) - 1;
+ Pimpl->version = atoi(v);
+ }
+ }
+ continue; // do not insert ASCCONV begin
+ }
}
if( !hasstarted ) continue;
if( starts_with(s, end) ) break;
diff --git a/Source/InformationObjectDefinition/CMakeLists.txt b/Source/InformationObjectDefinition/CMakeLists.txt
index adfd1f2..24d547b 100644
--- a/Source/InformationObjectDefinition/CMakeLists.txt
+++ b/Source/InformationObjectDefinition/CMakeLists.txt
@@ -46,11 +46,12 @@ if(GDCM_USE_SYSTEM_EXPAT)
endif()
add_library(gdcmIOD ${IOD_SRCS})
-target_link_libraries(gdcmIOD gdcmDSED gdcmCommon ${GDCM_EXPAT_LIBRARIES})
+target_link_libraries(gdcmIOD LINK_PUBLIC gdcmDSED gdcmCommon)
+target_link_libraries(gdcmIOD LINK_PRIVATE ${GDCM_EXPAT_LIBRARIES})
set_target_properties(gdcmIOD PROPERTIES ${GDCM_LIBRARY_PROPERTIES})
if(BUILD_SHARED_LIBS)
- set(_ill "gdcmDSED;gdcmCommon")
- set_target_properties(gdcmIOD PROPERTIES INTERFACE_LINK_LIBRARIES "${_ill}" LINK_INTERFACE_LIBRARIES "${_ill}")
+ #set(_ill "gdcmDSED;gdcmCommon")
+ #set_target_properties(gdcmIOD PROPERTIES INTERFACE_LINK_LIBRARIES "${_ill}" LINK_INTERFACE_LIBRARIES "${_ill}")
endif()
# libs
diff --git a/Source/MediaStorageAndFileFormat/CMakeLists.txt b/Source/MediaStorageAndFileFormat/CMakeLists.txt
index b8bdb8a..4a56acb 100644
--- a/Source/MediaStorageAndFileFormat/CMakeLists.txt
+++ b/Source/MediaStorageAndFileFormat/CMakeLists.txt
@@ -189,9 +189,10 @@ if(GDCM_USE_PVRG)
endif()
# main libs:
-target_link_libraries(gdcmMSFF gdcmIOD gdcmDSED gdcmDICT ${GDCM_LJPEG_LIBRARIES} ${GDCM_OPENJPEG_LIBRARIES})
+target_link_libraries(gdcmMSFF LINK_PUBLIC gdcmIOD gdcmDSED gdcmDICT)
+target_link_libraries(gdcmMSFF LINK_PRIVATE ${GDCM_LJPEG_LIBRARIES} ${GDCM_OPENJPEG_LIBRARIES})
if(GDCM_USE_JPEGLS)
- target_link_libraries(gdcmMSFF ${GDCM_CHARLS_LIBRARIES})
+ target_link_libraries(gdcmMSFF LINK_PRIVATE ${GDCM_CHARLS_LIBRARIES})
endif()
if(CMAKE_COMPILER_IS_GNUCXX AND MINGW)
@@ -206,20 +207,20 @@ endif()
if(WIN32)
# For UuidCreate
# http://msdn.microsoft.com/en-us/library/aa379205(VS.85).aspx
- target_link_libraries(gdcmMSFF rpcrt4)
+ target_link_libraries(gdcmMSFF LINK_PRIVATE rpcrt4)
#endif()
else()
-target_link_libraries(gdcmMSFF ${GDCMUUID})
+ target_link_libraries(gdcmMSFF LINK_PRIVATE ${GDCMUUID})
endif()
if(GDCM_USE_SYSTEM_JSON)
-target_link_libraries(gdcmMSFF ${JSON_LIBRARIES})
+ target_link_libraries(gdcmMSFF LINK_PRIVATE ${JSON_LIBRARIES})
endif()
# handling of static lib within shared is a mess:
#target_link_libraries(gdcmMSFF gdcmrle)
set_target_properties(gdcmMSFF PROPERTIES ${GDCM_LIBRARY_PROPERTIES})
if(BUILD_SHARED_LIBS)
- set(_ill "gdcmDSED;gdcmDICT;gdcmIOD")
- set_target_properties(gdcmMSFF PROPERTIES INTERFACE_LINK_LIBRARIES "${_ill}" LINK_INTERFACE_LIBRARIES "${_ill}")
+ #set(_ill "gdcmDSED;gdcmDICT;gdcmIOD")
+ #set_target_properties(gdcmMSFF PROPERTIES INTERFACE_LINK_LIBRARIES "${_ill}" LINK_INTERFACE_LIBRARIES "${_ill}")
endif()
# libs
diff --git a/Source/MediaStorageAndFileFormat/gdcmDictPrinter.cxx b/Source/MediaStorageAndFileFormat/gdcmDictPrinter.cxx
index 270ce84..7569d43 100644
--- a/Source/MediaStorageAndFileFormat/gdcmDictPrinter.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmDictPrinter.cxx
@@ -23,6 +23,7 @@ namespace gdcm
//-----------------------------------------------------------------------------
DictPrinter::DictPrinter()
{
+ PrintStyle = XML;
}
//-----------------------------------------------------------------------------
@@ -80,8 +81,8 @@ VM GuessVMType(DataElement const &de)
{
assert( bv && "not bv" );
const char *array = bv->GetPointer();
- unsigned int c = VM::GetNumberOfElementsFromArray(array, vl);
- vm = VM::GetVMTypeFromLength( c, 1 );
+ size_t c = VM::GetNumberOfElementsFromArray(array, vl);
+ vm = VM::GetVMTypeFromLength( (unsigned int)c, 1 );
}
}
break;
@@ -466,17 +467,33 @@ void DictPrinter::PrintDataElement2(std::ostream& os, const DataSet &ds, const D
}
VM vm = GuessVMType(de);
- os <<
- "<entry group=\"" << std::hex << std::setw(4) << std::setfill('0') <<
- t.GetGroup() << "\" element=\"" << std::setw(4) << ((uint16_t)(t.GetElement() << 8) >> 8) << "\" ";
-
- os << "vr=\"" << pvr << "\" vm=\"" << vm << "\" ";
- //os << "\" retired=\"false\";
+ if( PrintStyle == XML )
+ {
+ os <<
+ "<entry group=\"" << std::hex << std::setw(4) << std::setfill('0') <<
+ t.GetGroup() << "\" element=\"" << std::setw(4) << ((uint16_t)(t.GetElement() << 8) >> 8) << "\" ";
+ os << "vr=\"" << pvr << "\" vm=\"" << vm << "\" ";
if( de.GetTag().IsPrivate() )
{
os << "name=\"?\" owner=\"" << owner
<< /*"\" version=\"" << version << */ "\"/>\n";
}
+ }
+ else if ( PrintStyle == CXX )
+ {
+ os <<
+ "{0x" << std::hex << std::setw(4) << std::setfill('0') <<
+ t.GetGroup() << ",0x" << std::setw(4) << ((uint16_t)(t.GetElement() << 8) >> 8) << ",";
+ if( de.GetTag().IsPrivate() )
+ {
+ os << "\"" << owner
+ << "\",";
+ }
+ std::string vm_str = VM::GetVMString(vm);
+ std::replace( vm_str.begin(), vm_str.end(), '-', '_');
+ os << "VR::" << pvr << ",VM::VM" << vm_str << ",\"??\",false},\n";
+ }
+
//os << "\n <description>?</description>\n";
//os << "</entry>\n";
//os << "/>\n";
diff --git a/Source/MediaStorageAndFileFormat/gdcmIPPSorter.cxx b/Source/MediaStorageAndFileFormat/gdcmIPPSorter.cxx
index f3670f9..1135a00 100644
--- a/Source/MediaStorageAndFileFormat/gdcmIPPSorter.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmIPPSorter.cxx
@@ -93,9 +93,18 @@ bool IPPSorter::Sort(std::vector<std::string> const & filenames)
return false;
}
}
- if( frames.size() > 1 ) // Should I really tolerate no Frame of Reference UID ?
+ const size_t fsize = frames.size(); // Should I really tolerate issue with Frame of Reference UID ?
+ if( fsize == 1 ) // by the book
{
- gdcmDebugMacro( "More than one Frame Of Reference UID" );
+ // TODO: need to check not empty ? technically PMS used to send MR Image Storage with empty FoR
+ }
+ else if( fsize == 0 || fsize == filenames.size() ) // Should I really tolerate no Frame of Reference UID ?
+ {
+ gdcmWarningMacro( "Odd number of Frame Of Reference UID (continuing with caution): " << fsize );
+ }
+ else
+ {
+ gdcmErrorMacro( "Sorry your setup with Frame Of Reference UID does not make any sense: " << fsize );
return false;
}
diff --git a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
index 85940f7..6247ec4 100644
--- a/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmImageHelper.cxx
@@ -1311,6 +1311,7 @@ std::vector<double> ImageHelper::GetSpacingValue(File const & f)
el.Read( ss );
for(unsigned int i = 0; i < el.GetLength(); ++i)
sp.push_back( el.GetValue(i) );
+ std::swap( sp[0], sp[1]);
assert( sp.size() == (unsigned int)entry.GetVM() );
}
break;
diff --git a/Source/MediaStorageAndFileFormat/gdcmPrinter.cxx b/Source/MediaStorageAndFileFormat/gdcmPrinter.cxx
index 0970115..7b21100 100644
--- a/Source/MediaStorageAndFileFormat/gdcmPrinter.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmPrinter.cxx
@@ -757,7 +757,7 @@ VR Printer::PrintDataElement(std::ostringstream &os, const Dicts &dicts, const D
if( bv )
{
size_t count = VM::GetNumberOfElementsFromArray(bv->GetPointer(), bv->GetLength());
- guessvm = VM::GetVMTypeFromLength(count, 1); // hackish...
+ guessvm = VM::GetVMTypeFromLength((unsigned int)count, 1); // hackish...
}
}
else if( refvr & VR::VRBINARY )
diff --git a/Source/MediaStorageAndFileFormat/gdcmPrinter.h b/Source/MediaStorageAndFileFormat/gdcmPrinter.h
index 205407a..b4b62f6 100644
--- a/Source/MediaStorageAndFileFormat/gdcmPrinter.h
+++ b/Source/MediaStorageAndFileFormat/gdcmPrinter.h
@@ -72,7 +72,8 @@ public:
VERBOSE_STYLE = 0, // GDCM Legacy VERBOSE one
CONDENSED_STYLE, //
// Ok I am missing voc here ...better naming would be nice
- XML // sure why not
+ XML, //
+ CXX
} PrintStyles;
/// Set PrintStyle value
diff --git a/Source/MediaStorageAndFileFormat/gdcmStringFilter.cxx b/Source/MediaStorageAndFileFormat/gdcmStringFilter.cxx
index 8e9c505..535543f 100644
--- a/Source/MediaStorageAndFileFormat/gdcmStringFilter.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmStringFilter.cxx
@@ -553,12 +553,12 @@ std::string StringFilter::FromString(const Tag&t, const char * value, size_t len
return s;
}
VL::Type castLen = (VL::Type)len;
- VL::Type count = VM::GetNumberOfElementsFromArray(value, castLen);
+ size_t count = VM::GetNumberOfElementsFromArray(value, castLen);
VL vl = vm.GetLength() * vr.GetSizeof();
if( vm.GetLength() == 0 )
{
// VM1_n
- vl = count * vr.GetSizeof();
+ vl = (VL)( (VL)count * vr.GetSizeof());
#if !defined(NDEBUG)
VM check = VM::GetVMTypeFromLength(count, 1);
assert( vm.Compatible( check ) );
diff --git a/Source/MessageExchangeDefinition/CMakeLists.txt b/Source/MessageExchangeDefinition/CMakeLists.txt
index 6ed2efb..4f19dbd 100644
--- a/Source/MessageExchangeDefinition/CMakeLists.txt
+++ b/Source/MessageExchangeDefinition/CMakeLists.txt
@@ -92,18 +92,18 @@ set(MessageExchangeDefinition_SRCS
)
add_library(gdcmMEXD ${MessageExchangeDefinition_SRCS})
-target_link_libraries(gdcmMEXD gdcmMSFF gdcmDICT gdcmDSED gdcmIOD)
+target_link_libraries(gdcmMEXD LINK_PRIVATE gdcmMSFF gdcmDICT gdcmDSED gdcmIOD)
if(GDCM_USE_SYSTEM_SOCKETXX)
- target_link_libraries(gdcmMEXD socket++)
+ target_link_libraries(gdcmMEXD LINK_PRIVATE socket++)
else()
- target_link_libraries(gdcmMEXD socketxx)
+ target_link_libraries(gdcmMEXD LINK_PRIVATE socketxx)
endif()
if(WIN32)
- target_link_libraries(gdcmMEXD ws2_32)
+ target_link_libraries(gdcmMEXD LINK_PRIVATE ws2_32)
endif()
set_target_properties(gdcmMEXD PROPERTIES ${GDCM_LIBRARY_PROPERTIES})
if(BUILD_SHARED_LIBS)
- set_target_properties(gdcmMEXD PROPERTIES INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "")
+ #set_target_properties(gdcmMEXD PROPERTIES INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "")
endif()
# libs
diff --git a/Testing/Source/Data/CMakeLists.txt b/Testing/Source/Data/CMakeLists.txt
index 7d61b16..166e2d8 100644
--- a/Testing/Source/Data/CMakeLists.txt
+++ b/Testing/Source/Data/CMakeLists.txt
@@ -68,6 +68,8 @@ set(BLACK_LIST_READER
LengthOfItemLarger.dcm
# https://github.com/team-charls/charls/issues/16
JPEG_LS_InvalidEscapeSequence_COM_padding.dcm
+# MITRA_CORNELL
+ MITRA_CORNELL.dcm
)
if(NOT GDCM_USE_PVRG)
set(BLACK_LIST_READER
diff --git a/Utilities/VTK/CMakeLists.txt b/Utilities/VTK/CMakeLists.txt
index 92e691c..77fdd96 100644
--- a/Utilities/VTK/CMakeLists.txt
+++ b/Utilities/VTK/CMakeLists.txt
@@ -166,12 +166,12 @@ endif()
#endif()
set_target_properties(${VTKGDCM_NAME} PROPERTIES ${GDCM_LIBRARY_PROPERTIES})
-target_link_libraries(${VTKGDCM_NAME} gdcmMSFF ${vtkgdcm_LIBS})
+target_link_libraries(${VTKGDCM_NAME} LINK_PRIVATE gdcmMSFF ${vtkgdcm_LIBS})
if(GDCM_HAVE_PTHREAD_H)
- target_link_libraries(${VTKGDCM_NAME} pthread)
+ target_link_libraries(${VTKGDCM_NAME} LINK_PRIVATE pthread)
endif()
# prevent viral dep of vtkgdcm
-set_property(TARGET ${VTKGDCM_NAME} PROPERTY LINK_INTERFACE_LIBRARIES "")
+#set_property(TARGET ${VTKGDCM_NAME} PROPERTY LINK_INTERFACE_LIBRARIES "")
if(NOT GDCM_INSTALL_NO_LIBRARIES)
install(TARGETS ${VTKGDCM_NAME}
EXPORT ${GDCM_TARGETS_NAME}
@@ -223,12 +223,12 @@ if(GDCM_WRAP_PHP)
SWIG_ADD_MODULE(php_vtkgdcm php vtkgdcm.i)
SWIG_LINK_LIBRARIES(php_vtkgdcm vtkgdcm)
- target_link_libraries(${SWIG_MODULE_php_vtkgdcm_REAL_NAME} ${vtkgdcm_LIBS})
+ target_link_libraries(${SWIG_MODULE_php_vtkgdcm_REAL_NAME} LINK_PRIVATE ${vtkgdcm_LIBS})
if(UNIX)
set_target_properties(${SWIG_MODULE_php_vtkgdcm_REAL_NAME} PROPERTIES OUTPUT_NAME "vtkgdcm")
endif()
set_target_properties(${SWIG_MODULE_php_vtkgdcm_REAL_NAME} PROPERTIES PREFIX "")
- set_target_properties(${SWIG_MODULE_php_vtkgdcm_REAL_NAME} PROPERTIES LINK_INTERFACE_LIBRARIES "")
+ #set_target_properties(${SWIG_MODULE_php_vtkgdcm_REAL_NAME} PROPERTIES LINK_INTERFACE_LIBRARIES "")
set_property(TARGET ${SWIG_MODULE_php_vtkgdcm_REAL_NAME} PROPERTY NO_SONAME 1)
if(NOT GDCM_INSTALL_NO_LIBRARIES)
@@ -295,7 +295,7 @@ if(GDCM_WRAP_CSHARP)
if(UNIX)
set_target_properties(${SWIG_MODULE_vtkgdcmsharpglue_REAL_NAME} PROPERTIES PREFIX "lib")
endif()
- target_link_libraries(${SWIG_MODULE_vtkgdcmsharpglue_REAL_NAME} ${vtkgdcm_LIBS})
+ target_link_libraries(${SWIG_MODULE_vtkgdcmsharpglue_REAL_NAME} LINK_PRIVATE ${vtkgdcm_LIBS})
if(NOT GDCM_INSTALL_NO_LIBRARIES)
install(TARGETS ${SWIG_MODULE_vtkgdcmsharpglue_REAL_NAME}
EXPORT ${GDCM_TARGETS_NAME}
@@ -673,13 +673,13 @@ if(GDCM_WRAP_JAVA)
if(APPLE)
set_target_properties(${VTKGDCM_NAME}Java PROPERTIES SUFFIX ".jnilib")
endif()
- target_link_libraries(${VTKGDCM_NAME}Java ${VTKGDCM_NAME})
+ target_link_libraries(${VTKGDCM_NAME}Java LINK_PRIVATE ${VTKGDCM_NAME})
set_property(TARGET ${VTKGDCM_NAME}Java PROPERTY NO_SONAME 1)
# By default link those module since APPLE and WIN32 needs fully resolved
# shared lib allow advanced users to skip the link step:
if(NOT GDCM_NO_VTKJAVA_LIBS_LINKING)
foreach(c ${vtkgdcm_LIBS})
- target_link_libraries(${VTKGDCM_NAME}Java ${c}Java)
+ target_link_libraries(${VTKGDCM_NAME}Java LINK_PRIVATE ${c}Java)
endforeach()
endif()
# Create the jar file:
@@ -757,18 +757,18 @@ if(GDCM_WRAP_PYTHON)
add_library(${VTKGDCM_NAME}Python MODULE ${VTKGDCM_NAME}PythonInit.cxx)
# do not set the version on the Python module:
#set_target_properties(${VTKGDCM_NAME}Python PROPERTIES ${GDCM_LIBRARY_PROPERTIES})
- target_link_libraries(${VTKGDCM_NAME}PythonD ${VTKGDCM_NAME} ${PYTHON_LIBRARY})
+ target_link_libraries(${VTKGDCM_NAME}PythonD LINK_PRIVATE ${VTKGDCM_NAME} ${PYTHON_LIBRARY})
foreach(c ${vtkgdcm_LIBS})
- target_link_libraries(${VTKGDCM_NAME}PythonD ${c}Python${DEXTENSION})
+ target_link_libraries(${VTKGDCM_NAME}PythonD LINK_PRIVATE ${c}Python${DEXTENSION})
endforeach()
if(TARGET vtkPythonCore)
- target_link_libraries(${VTKGDCM_NAME}PythonD vtkPythonCore)
+ target_link_libraries(${VTKGDCM_NAME}PythonD LINK_PRIVATE vtkPythonCore)
endif()
- target_link_libraries(${VTKGDCM_NAME}Python ${VTKGDCM_NAME}PythonD)
+ target_link_libraries(${VTKGDCM_NAME}Python LINK_PRIVATE ${VTKGDCM_NAME}PythonD)
if(NOT GDCM_NO_PYTHON_LIBS_LINKING)
- target_link_libraries(${VTKGDCM_NAME}Python ${PYTHON_LIBRARY})
+ target_link_libraries(${VTKGDCM_NAME}Python LINK_PRIVATE ${PYTHON_LIBRARY})
endif()
- set_property(TARGET ${VTKGDCM_NAME}PythonD PROPERTY LINK_INTERFACE_LIBRARIES "")
+ #set_property(TARGET ${VTKGDCM_NAME}PythonD PROPERTY LINK_INTERFACE_LIBRARIES "")
set_property(TARGET ${VTKGDCM_NAME}Python PROPERTY NO_SONAME 1)
#set_property(TARGET ${VTKGDCM_NAME}PythonD PROPERTY NO_SONAME 1)
# Removing lib prefix if we are at VTK7. Based on a reply by David Gobbi to
diff --git a/Utilities/doxygen/man/gdcmdump.xml b/Utilities/doxygen/man/gdcmdump.xml
index 8dae04c..b059700 100644
--- a/Utilities/doxygen/man/gdcmdump.xml
+++ b/Utilities/doxygen/man/gdcmdump.xml
@@ -53,7 +53,8 @@ dcm_directory DICOM input directory
-C --csa print SIEMENS CSA Header (0029,[12]0,SIEMENS CSA HEADER).
--csa-asl print decoded SIEMENS CSA MR_ASL (base64).
--csa-diffusion print decoded SIEMENS CSA MRDiffusion (base64).
- --mrprotocol print SIEMENS CSA MrProtocol only (within ASCCONV BEGIN/END).
+ --mrprotocol print SIEMENS MrProtocol only (within ASCCONV BEGIN/END).
+ either encapsulated in CSA or directly (syngo XA10)
-P --pdb print GEMS Protocol Data Block (0025,1b,GEMS_SERS_01).
--elscint print ELSCINT Protocol Information (01f7,26,ELSCINT1).
--vepro print VEPRO Protocol Information (0055,20,VEPRO VIF 3.0 DATA).
diff --git a/Utilities/doxygen/man/gdcmtar.xml b/Utilities/doxygen/man/gdcmtar.xml
index 5d43f5b..8c3f053 100644
--- a/Utilities/doxygen/man/gdcmtar.xml
+++ b/Utilities/doxygen/man/gdcmtar.xml
@@ -40,12 +40,12 @@ file-out DICOM output filename
<refsection xml:id="gdcmtar_1specific_options">
<title>specific options</title>
-<para><literallayout> --enhance enhance (default)
- -U --unenhance unenhance
- -M --mosaic Split SIEMENS Mosaic image into multiple frames.
- --mosaic-private When splitting SIEMENS Mosaic image into multiple frames, ppreserve private attributes (advanced user only).
- -p --pattern Specify trailing file pattern.
- --root-uid Root UID.
+<para><literallayout> --enhance Enhance (default)
+ -U --unenhance Unenhance
+ -M --mosaic Split SIEMENS Mosaic image into multiple frames.
+ --mosaic-private When splitting SIEMENS Mosaic image into multiple frames, preserve private attributes (advanced user only).
+ -p --pattern Specify trailing file pattern.
+ --root-uid Root UID.
</literallayout></para>
</refsection>
<refsection xml:id="gdcmtar_1general_options">
@@ -139,7 +139,7 @@ NumberOfDimensions: 2
Dimensions: (64,64,1)
...
</literallayout></para>
-<para>By default all private attributes are removed since they may not match the newly generated SOP Instance. One way to preserver the private attributes is to use the --mosaic-private command line option</para>
+<para>By default all private attributes are removed since they may not match the newly generated SOP Instance. One way to preserve the private attributes is to use the --mosaic-private command line option</para>
<para><literallayout>$ gdcmtar --mosaic --mosaic-private -i MR-sonata-3D-as-Tile.dcm -o mosaic --pattern %03d.dcm
</literallayout></para>
diff --git a/Wrapping/Csharp/CMakeLists.txt b/Wrapping/Csharp/CMakeLists.txt
index c1a838c..8ea1ded 100644
--- a/Wrapping/Csharp/CMakeLists.txt
+++ b/Wrapping/Csharp/CMakeLists.txt
@@ -28,6 +28,9 @@ SWIG_LINK_LIBRARIES(gdcmsharpglue gdcmMSFF
gdcmMEXD
)
set_target_properties(${SWIG_MODULE_gdcmsharpglue_REAL_NAME} PROPERTIES LINK_INTERFACE_LIBRARIES "")
+if(UNIX)
+set_target_properties(${SWIG_MODULE_gdcmsharpglue_REAL_NAME} PROPERTIES PREFIX "lib")
+endif()
set_property(TARGET ${SWIG_MODULE_gdcmsharpglue_REAL_NAME} PROPERTY NO_SONAME 1)
# Module are always place in the library destination but for poor win32 user I
diff --git a/Wrapping/Python/gdcmswig.i b/Wrapping/Python/gdcmswig.i
index 26722ee..21a71d8 100644
--- a/Wrapping/Python/gdcmswig.i
+++ b/Wrapping/Python/gdcmswig.i
@@ -439,7 +439,7 @@ EXTEND_CLASS_PRINT(gdcm::Image)
%include "gdcmFragment.h"
EXTEND_CLASS_PRINT(gdcm::Fragment)
// convert SWIGTYPE_p_std__vectorT_gdcm__Fragment_t__size_type
-//%template() std::vector< gdcm::Fragment >;
+%template(fragmentVector) std::vector< gdcm::Fragment >;
// -> error: ‘type_name’ is not a member of ‘swig::traits<gdcm::Fragment>’ (swig 3.0.7)
%include "gdcmPDBElement.h"
EXTEND_CLASS_PRINT(gdcm::PDBElement)
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/gdcm.git
More information about the debian-med-commit
mailing list