diff --git a/Modules/ThirdParty/GDCM/itk-module.cmake b/Modules/ThirdParty/GDCM/itk-module.cmake index a5962846078..12f563ba788 100644 --- a/Modules/ThirdParty/GDCM/itk-module.cmake +++ b/Modules/ThirdParty/GDCM/itk-module.cmake @@ -14,6 +14,7 @@ else() ITKZLIB ITKExpat ITKOpenJPEG + ITKJPEG DESCRIPTION "${DOCUMENTATION}" ) diff --git a/Modules/ThirdParty/GDCM/src/CMakeLists.txt b/Modules/ThirdParty/GDCM/src/CMakeLists.txt index 9b99de751a3..3b8db411d5d 100644 --- a/Modules/ThirdParty/GDCM/src/CMakeLists.txt +++ b/Modules/ThirdParty/GDCM/src/CMakeLists.txt @@ -39,6 +39,12 @@ set(GDCM_USE_SYSTEM_ZLIB ON CACHE INTERNAL "") set(ZLIB_INCLUDE_DIR ${ITKZLIB_INCLUDE_DIRS}) set(ZLIB_LIBRARY ${ITKZLIB_LIBRARIES}) +# JPEG +set(LJPEG_LIBRARIES ${ITKJPEG_LIBRARIES}) +set(LJPEG_INCLUDE_DIRS ${ITKJPEG_INCLUDE_DIRS}) +message(STATUS "ITKJPEG_INCLUDE_DIRS: ${ITKJPEG_INCLUDE_DIRS}") + + # Configure GDCM privately so its options do not appear to the user. set(GDCM_LEGACY_REMOVE OFF CACHE INTERNAL "Remove all legacy code completely.") set(GDCM_LEGACY_SILENT OFF CACHE INTERNAL "Silence all legacy code messages.") @@ -46,7 +52,7 @@ set(GDCM_SUPPORT_BROKEN_IMPLEMENTATION ON CACHE INTERNAL "Handle broken DICOM") set(GDCM_TEMP_DIRECTORY "${ITK_TEST_OUTPUT_DIR}" CACHE INTERNAL "Path to a valid temp directory") set(GDCM_USE_KAKADU OFF CACHE INTERNAL "Use kakadu lib, only turn it on if you know what you are doing.") set(GDCM_USE_PVRG OFF CACHE INTERNAL "Use pvrg lib, only turn it on if you know what you are doing.") -set(GDCM_USE_SYSTEM_LJPEG OFF CACHE INTERNAL "Use system ljpeg (ijg lib)") +set(GDCM_USE_SYSTEM_LJPEG ON CACHE INTERNAL "Use system ljpeg (ijg lib)") set(GDCM_USE_SYSTEM_OPENSSL OFF CACHE INTERNAL "Use system OpenSSL") set(GDCM_USE_SYSTEM_PODOFO OFF CACHE INTERNAL "Use system podofo (pdf)") set(GDCM_USE_SYSTEM_POPPLER OFF CACHE INTERNAL "Use system poppler (pdf)") diff --git a/Modules/ThirdParty/GDCM/src/gdcm/CMakeLists.txt b/Modules/ThirdParty/GDCM/src/gdcm/CMakeLists.txt index b60369205d1..ea15b9270c6 100644 --- a/Modules/ThirdParty/GDCM/src/gdcm/CMakeLists.txt +++ b/Modules/ThirdParty/GDCM/src/gdcm/CMakeLists.txt @@ -338,7 +338,7 @@ endif() mark_as_advanced(GDCM_USE_SYSTEM_LIBXML2) if(GDCM_USE_SYSTEM_LJPEG) - find_package(LJPEG REQUIRED) + #find_package(LJPEG REQUIRED) set(GDCM_LJPEG_LIBRARIES ${LJPEG_LIBRARIES}) else() set(GDCM_LJPEG_LIBRARIES gdcmjpeg8 gdcmjpeg12 gdcmjpeg16) diff --git a/Modules/ThirdParty/GDCM/src/gdcm/Source/MediaStorageAndFileFormat/gdcmJPEGBITSCodec.hxx b/Modules/ThirdParty/GDCM/src/gdcm/Source/MediaStorageAndFileFormat/gdcmJPEGBITSCodec.hxx index 5a08842681b..1f1564ededc 100644 --- a/Modules/ThirdParty/GDCM/src/gdcm/Source/MediaStorageAndFileFormat/gdcmJPEGBITSCodec.hxx +++ b/Modules/ThirdParty/GDCM/src/gdcm/Source/MediaStorageAndFileFormat/gdcmJPEGBITSCodec.hxx @@ -16,6 +16,18 @@ #include +#if !defined(LIBJPEG_TURBO_VERSION_NUMBER) +#define GDCM_JPEG_IS_LOSSLESS(CINFO) CINFO.process == JPROC_LOSSLESS +#define GDCM_JPEG_IS_SEQUENTIAL(CINFO) CINFO.process == JPROC_SEQUENTIAL +#define GDCM_JPEG_IS_PROGRESSIVE(CINFO) CINFO.process == JPROC_PROGRESSIVE +#else +// cinfo->master->lossless looks to be the right check for losslessness but the master structire is private +#define GDCM_JPEG_IS_LOSSLESS(CINFO) CINFO.data_precision == 12 || CINFO.data_precision == 16 +#define GDCM_JPEG_IS_SEQUENTIAL(CINFO) CINFO.progressive_mode == FALSE +#define GDCM_JPEG_IS_PROGRESSIVE(CINFO) CINFO.progressive_mode == TRUE +#endif + + /* * jdatasrc.c * @@ -218,7 +230,7 @@ term_source (j_decompress_ptr cinfo) * for closing it after finishing decompression. */ -GLOBAL(void) +METHODDEF(void) jpeg_stdio_src (j_decompress_ptr cinfo, std::istream & infile, bool flag) { my_src_ptr src; @@ -463,8 +475,8 @@ bool JPEGBITSCodec::GetHeaderInfo(std::istream &is, TransferSyntax &ts) { assert( cinfo.num_components == 3 ); PI = PhotometricInterpretation::YBR_FULL_422; - if( cinfo.process == JPROC_LOSSLESS ) - PI = PhotometricInterpretation::RGB; // wotsit ? + //if( cinfo.process == JPROC_LOSSLESS ) + PI = PhotometricInterpretation::RGB; // wotsit ? this->PF.SetSamplesPerPixel( 3 ); this->PlanarConfiguration = 1; } @@ -486,7 +498,7 @@ bool JPEGBITSCodec::GetHeaderInfo(std::istream &is, TransferSyntax &ts) assert( 0 ); //TODO } } - if( cinfo.process == JPROC_LOSSLESS ) + if( GDCM_JPEG_IS_LOSSLESS(cinfo) ) { int predictor = cinfo.Ss; /* not very user friendly... */ @@ -500,14 +512,14 @@ bool JPEGBITSCodec::GetHeaderInfo(std::istream &is, TransferSyntax &ts) break; } } - else if( cinfo.process == JPROC_SEQUENTIAL ) + else if( GDCM_JPEG_IS_SEQUENTIAL(cinfo) ) { if( this->BitSample == 8 ) ts = TransferSyntax::JPEGBaselineProcess1; else if( this->BitSample == 12 ) ts = TransferSyntax::JPEGExtendedProcess2_4; } - else if( cinfo.process == JPROC_PROGRESSIVE ) + else if( GDCM_JPEG_IS_PROGRESSIVE(cinfo) ) { if( this->BitSample == 8 ) { @@ -528,7 +540,7 @@ bool JPEGBITSCodec::GetHeaderInfo(std::istream &is, TransferSyntax &ts) assert(0); // TODO return false; } - if( cinfo.process == JPROC_LOSSLESS ) + if( GDCM_JPEG_IS_LOSSLESS(cinfo) ) { LossyFlag = false; } @@ -764,6 +776,7 @@ bool JPEGBITSCodec::DecodeByStreams(std::istream &is, std::ostream &os) // First of all are we using the proper JPEG decoder (correct bit sample): if( jerr.pub.num_warnings ) { +#ifdef JWRN_MUST_DOWNSCALE // PHILIPS_Gyroscan-12-MONO2-Jpeg_Lossless.dcm if ( jerr.pub.msg_code == JWRN_MUST_DOWNSCALE ) { @@ -781,6 +794,9 @@ bool JPEGBITSCodec::DecodeByStreams(std::istream &is, std::ostream &os) { assert( 0 ); } +#else + assert(0); +#endif } // Let's check the color space: // JCS_UNKNOWN -> 0 @@ -824,7 +840,7 @@ bool JPEGBITSCodec::DecodeByStreams(std::istream &is, std::ostream &os) break; case JCS_RGB: //assert( GetPhotometricInterpretation() == PhotometricInterpretation::RGB ); - if ( cinfo.process == JPROC_LOSSLESS ) + if ( GDCM_JPEG_IS_LOSSLESS(cinfo) ) { cinfo.jpeg_color_space = JCS_UNKNOWN; cinfo.out_color_space = JCS_UNKNOWN; @@ -851,7 +867,7 @@ bool JPEGBITSCodec::DecodeByStreams(std::istream &is, std::ostream &os) cinfo.jpeg_color_space = JCS_UNKNOWN; cinfo.out_color_space = JCS_UNKNOWN; } - if ( cinfo.process == JPROC_LOSSLESS ) + if ( GDCM_JPEG_IS_LOSSLESS(cinfo) ) { //cinfo.jpeg_color_space = JCS_UNKNOWN; //cinfo.out_color_space = JCS_UNKNOWN; @@ -867,14 +883,14 @@ bool JPEGBITSCodec::DecodeByStreams(std::istream &is, std::ostream &os) break; case JCS_CMYK: assert( GetPhotometricInterpretation() == PhotometricInterpretation::CMYK ); - if ( cinfo.process == JPROC_LOSSLESS ) + if ( GDCM_JPEG_IS_LOSSLESS(cinfo) ) { cinfo.jpeg_color_space = JCS_UNKNOWN; cinfo.out_color_space = JCS_UNKNOWN; } break; case JCS_UNKNOWN: - if ( cinfo.process == JPROC_LOSSLESS ) + if ( GDCM_JPEG_IS_LOSSLESS(cinfo) ) { cinfo.jpeg_color_space = JCS_UNKNOWN; cinfo.out_color_space = JCS_UNKNOWN; @@ -958,7 +974,7 @@ bool JPEGBITSCodec::DecodeByStreams(std::istream &is, std::ostream &os) /* we are done decompressing the file, now is a good time to store the type of compression used: lossless or not */ - if( cinfo.process == JPROC_LOSSLESS ) + if( GDCM_JPEG_IS_LOSSLESS(cinfo) ) { LossyFlag = false; } @@ -1130,7 +1146,7 @@ term_destination (j_compress_ptr cinfo) * for closing it after finishing compression. */ -GLOBAL(void) + METHODDEF(void) jpeg_stdio_dest (j_compress_ptr cinfo, /*FILE * */ std::ostream * outfile) { my_dest_ptr dest; @@ -1281,7 +1297,11 @@ bool JPEGBITSCodec::InternalCode(const char* input, unsigned long len, std::ostr */ if( !LossyFlag ) { +#ifdef LIBJPEG_TURBO_VERSION_NUMBER + jpeg_enable_lossless(&cinfo, 1, 0); +#else jpeg_simple_lossless (&cinfo, 1, 0); +#endif //jpeg_simple_lossless (&cinfo, 7, 0); } @@ -1508,7 +1528,11 @@ bool JPEGBITSCodec::EncodeBuffer(std::ostream &os, const char *data, size_t data { if( !LossyFlag ) { - jpeg_simple_lossless (&cinfo, 1, 0); +#ifdef LIBJPEG_TURBO_VERSION_NUMBER + jpeg_enable_lossless(&cinfo, 1, 0); +#else + jpeg_simple_lossless (&cinfo, 1, 0); +#endif //jpeg_simple_lossless (&cinfo, 7, 0); } } diff --git a/Modules/ThirdParty/GDCM/src/gdcm/Utilities/gdcm_ljpeg12.h b/Modules/ThirdParty/GDCM/src/gdcm/Utilities/gdcm_ljpeg12.h index 5703ce27c0c..a9c269e103a 100644 --- a/Modules/ThirdParty/GDCM/src/gdcm/Utilities/gdcm_ljpeg12.h +++ b/Modules/ThirdParty/GDCM/src/gdcm/Utilities/gdcm_ljpeg12.h @@ -19,9 +19,10 @@ #ifdef GDCM_USE_SYSTEM_LJPEG extern "C" { -# include -# include -# include +#include "itk_jpeg.h" +#ifndef SIZEOF +#define SIZEOF(X) sizeof(X) +#endif } #else extern "C" { diff --git a/Modules/ThirdParty/GDCM/src/gdcm/Utilities/gdcm_ljpeg16.h b/Modules/ThirdParty/GDCM/src/gdcm/Utilities/gdcm_ljpeg16.h index 1db5fd62274..17b5f6ddf4f 100644 --- a/Modules/ThirdParty/GDCM/src/gdcm/Utilities/gdcm_ljpeg16.h +++ b/Modules/ThirdParty/GDCM/src/gdcm/Utilities/gdcm_ljpeg16.h @@ -19,9 +19,10 @@ #ifdef GDCM_USE_SYSTEM_LJPEG extern "C" { -# include -# include -# include +#include "itk_jpeg.h" +#ifndef SIZEOF +#define SIZEOF(X) sizeof(X) +#endif } #else extern "C" { diff --git a/Modules/ThirdParty/GDCM/src/gdcm/Utilities/gdcm_ljpeg8.h b/Modules/ThirdParty/GDCM/src/gdcm/Utilities/gdcm_ljpeg8.h index 2810f0f2724..73371b0fc3d 100644 --- a/Modules/ThirdParty/GDCM/src/gdcm/Utilities/gdcm_ljpeg8.h +++ b/Modules/ThirdParty/GDCM/src/gdcm/Utilities/gdcm_ljpeg8.h @@ -19,9 +19,10 @@ #ifdef GDCM_USE_SYSTEM_LJPEG extern "C" { -# include -# include -# include +#include "itk_jpeg.h" +#ifndef SIZEOF +#define SIZEOF(X) sizeof(X) +#endif } #else extern "C" {