Blob Blame History Raw
From 9e1b3f343d9cc7c217d55a1630aab15e1956b17c Mon Sep 17 00:00:00 2001
From: Larry Gritz <lg@larrygritz.com>
Date: Tue, 16 Jan 2018 22:24:04 -0800
Subject: [PATCH 1/3] Fix dcmtk build errors on some platforms

Fixes #1841
---
 src/dicom.imageio/dicominput.cpp | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/dicom.imageio/dicominput.cpp b/src/dicom.imageio/dicominput.cpp
index aebbc0859..d5a9613e3 100644
--- a/src/dicom.imageio/dicominput.cpp
+++ b/src/dicom.imageio/dicominput.cpp
@@ -297,13 +297,13 @@ DICOMInput::read_metadata ()
                     m_spec.attribute (name, (float)val);
                 // N.B. we cast to float. Will anybody care?
             } else if (evr == EVR_SL || evr == EVR_IS) {
-                int val;
+                Sint32 val;
                 if (dataset->findAndGetSint32 (tag, val).good())
-                    m_spec.attribute (name, val);
+                    m_spec.attribute (name, static_cast<int>(val));
             } else if (evr == EVR_UL) {
-                unsigned int val;
+                Uint32 val;
                 if (dataset->findAndGetUint32 (tag, val).good())
-                    m_spec.attribute (name, TypeDesc::UINT32, &val);
+                    m_spec.attribute (name, static_cast<unsigned int>(val));
             } else if (evr == EVR_US) {
                 unsigned short val;
                 if (dataset->findAndGetUint16 (tag, val).good())

From 533c1e71a7b3a984ddcca84a5c49f706027b6929 Mon Sep 17 00:00:00 2001
From: Larry Gritz <lg@larrygritz.com>
Date: Tue, 16 Jan 2018 23:22:40 -0800
Subject: [PATCH 2/3] DCMTK version enforcement

Have CMake figure out the version of DCMTK found.
Reject anything older than 3.6.1.
Older versions botched some preprocessor symbols in ways that are painful
to deal with, so since the ones that work (>= 3.6.1) date from 2011 (!),
I don't think it's too stringent a requirement.
---
 src/cmake/externalpackages.cmake  |  2 +-
 src/cmake/modules/FindDCMTK.cmake | 31 +++++++++++++++++++++++++------
 2 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/src/cmake/externalpackages.cmake b/src/cmake/externalpackages.cmake
index 4c8a1f9d3..a41d7fa1c 100644
--- a/src/cmake/externalpackages.cmake
+++ b/src/cmake/externalpackages.cmake
@@ -478,7 +478,7 @@ endif()
 ###########################################################################
 # DCMTK
 if (USE_DICOM)
-    find_package (DCMTK)
+    find_package (DCMTK 3.6.1)
     if (NOT DCMTK_FOUND)
         set (DCMTK_INCLUDE_DIR "")
         set (DCMTK_LIBRARIES "")
diff --git a/src/cmake/modules/FindDCMTK.cmake b/src/cmake/modules/FindDCMTK.cmake
index 9b2edca1b..83f395614 100644
--- a/src/cmake/modules/FindDCMTK.cmake
+++ b/src/cmake/modules/FindDCMTK.cmake
@@ -1,6 +1,3 @@
-# FIXME: CMake >= 3.5 has its own FindDCMTK.cmake, so when our minimum
-# cmake is at least that, we can remove this file.
-
 # Module to find DCMTK
 #
 # This module will first look into the directories defined by the variables:
@@ -8,9 +5,11 @@
 #
 # This module defines the following variables:
 #
-# DCMTK_FOUND       - True if DCMTK was found.
-# DCMTK_INCLUDES -    where to find DCMTK headers
-# DCMTK_LIBRARIES   - list of libraries to link against when using DCMTK
+# DCMTK_FOUND            True if DCMTK was found.
+# DCMTK_INCLUDES         Where to find DCMTK headers
+# DCMTK_LIBRARIES        List of libraries to link against when using DCMTK
+# DCMTK_VERSION          Version of DCMTK (e.g., 3.6.2)
+# DCMTK_VERSION_NUMBER   Int version of DCMTK (e.g., 362 for 3.6.2)
 
 include (FindPackageHandleStandardArgs)
 include (FindPackageMessage)
@@ -53,6 +52,13 @@ foreach (COMPONENT dcmimage dcmimgle dcmdata oflog ofstd iconv)
     endif ()
 endforeach()
 
+message (STATUS "DCMTK_INCLUDE_DIR = ${DCMTK_INCLUDE_DIR}")
+if (DCMTK_INCLUDE_DIR AND EXISTS "${DCMTK_INCLUDE_DIR}/dcmtk/config/osconfig.h")
+    file(STRINGS "${DCMTK_INCLUDE_DIR}/dcmtk/config/osconfig.h" TMP REGEX "^#define PACKAGE_VERSION[ \t].*$")
+    string(REGEX MATCHALL "[0-9.]+" DCMTK_VERSION ${TMP})
+    file(STRINGS "${DCMTK_INCLUDE_DIR}/dcmtk/config/osconfig.h" TMP REGEX "^#define PACKAGE_VERSION_NUMBER[ \t].*$")
+    string(REGEX MATCHALL "[0-9.]+" DCMTK_VERSION_NUMBER ${TMP})
+endif ()
 
 if (DCMTK_INCLUDE_DIR AND DCMTK_LIBRARIES)
     set(DCMTK_FOUND TRUE)
@@ -60,9 +66,22 @@ if (DCMTK_INCLUDE_DIR AND DCMTK_LIBRARIES)
     if (NOT DCMTK_FIND_QUIETLY)
         message(STATUS "Found DCMTK library ${DCMTK_LIBRARIES}")
         message(STATUS "Found DCMTK includes ${DCMTK_INCLUDES}")
+        message(STATUS "Found DCMTK short version number ${DCMTK_VERSION_NUMBER}")
     endif ()
 else()
     set(DCMTK_FOUND FALSE)
     message(STATUS "DCMTK not found. Specify DCMTK_PATH to locate it")
 endif()
 
+include (FindPackageHandleStandardArgs)
+find_package_handle_standard_args (DCMTK
+    REQUIRED_VARS   DCMTK_INCLUDE_DIR DCMTK_LIBRARIES
+    VERSION_VAR     DCMTK_VERSION
+    )
+
+mark_as_advanced (
+    DCMTK_INCLUDE_DIR
+    DCMTK_LIBRARIES
+    DCMTK_VERSION
+    DCMTK_VERSION_NUMBER
+    )

From b1eb9c97eaa11b423b5bb279e1a60e0a30490ea2 Mon Sep 17 00:00:00 2001
From: Larry Gritz <lg@larrygritz.com>
Date: Tue, 16 Jan 2018 23:26:27 -0800
Subject: [PATCH 3/3] dcmtk: More conservative goards on certain symbols.

EVR_OD, EVR_UC, EVR_UR were added part way through 3.6.1 releases.
So test for them with 3.6.2 minimum not 3.6.1.

(Thanks, Richard Shaw, for the tip on this one.)
---
 src/dicom.imageio/dicominput.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/dicom.imageio/dicominput.cpp b/src/dicom.imageio/dicominput.cpp
index d5a9613e3..23294d346 100644
--- a/src/dicom.imageio/dicominput.cpp
+++ b/src/dicom.imageio/dicominput.cpp
@@ -288,7 +288,7 @@ DICOMInput::read_metadata ()
                 if (dataset->findAndGetFloat32 (tag, val).good())
                     m_spec.attribute (name, val);
             } else if (evr == EVR_FD
-#if PACKAGE_VERSION_NUMBER >= 361
+#if PACKAGE_VERSION_NUMBER >= 362
                        || evr == EVR_OD
 #endif
                        ) {
@@ -312,7 +312,7 @@ DICOMInput::read_metadata ()
                        evr == EVR_DT || evr == EVR_LT || evr == EVR_PN ||
                        evr == EVR_ST || evr == EVR_TM || evr == EVR_UI ||
                        evr == EVR_UT || evr == EVR_LO || evr == EVR_SH
-#if PACKAGE_VERSION_NUMBER >= 361
+#if PACKAGE_VERSION_NUMBER >= 362
                        || evr == EVR_UC ||evr == EVR_UR
 #endif
                        ) {