From 2d43f5c8ae2004242af2297ceb2926d81675548f Mon Sep 17 00:00:00 2001 From: malaterre Date: Thu, 28 Oct 2004 22:21:56 +0000 Subject: [PATCH] ENH: - cosmetic cleanup in TODO, we should remove entries fixed - some other cleanup at some other places - adding a first implementation for the binary_write function - adding big endian flag in cmake cache --- CMakeLists.txt | 3 ++ TODO | 20 ++++++---- src/gdcmJPEGFragmentsInfo.cxx | 6 +-- src/gdcmPixelConvert.cxx | 74 +++++++++++++++-------------------- src/gdcmUtil.cxx | 41 ++++++++++++++++++- 5 files changed, 90 insertions(+), 54 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d10d68d..cad43283 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,9 @@ INCLUDE (${CMAKE_ROOT}/Modules/CMakeBackwardCompatibilityCXX.cmake) IF(CMAKE_NO_ANSI_STRING_STREAM) SET(GDCM_NO_ANSI_STRING_STREAM 1) ENDIF(CMAKE_NO_ANSI_STRING_STREAM) +IF(${CMAKE_WORDS_BIGENDIAN}) + SET(GDCM_WORDS_BIGENDIAN 1) +ENDIF(${CMAKE_WORDS_BIGENDIAN}) INCLUDE (${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake) CHECK_INCLUDE_FILE("stdint.h" CMAKE_HAVE_STDINT_H) diff --git a/TODO b/TODO index 343b8051..271ae89f 100644 --- a/TODO +++ b/TODO @@ -16,11 +16,14 @@ Description: gdcmJpeg8 is strictly a copy/paste of gdcmJpeg12.cxx. Date: 2004 Oct 13 Attributed: Details: -We should write the code in a common place, then include this 'cxx' file so the the define from gdcm_mangle redefine to the proper one. +We should write the code in a common place, then include this 'cxx' file so +the define from gdcm_mangle redefine to the proper one. Comments: -This will be usefull since I may need in the future a 16bits version of this reading +This will be usefull since I may need in the future a 16bits version of this +reading ----------------------------------------------------------------------------- -Description: Change jpeg 'exit' call to standard c++ exception using the jpeg error +Description: Change jpeg 'exit' call to standard c++ exception using the jpeg + error handler Date: 2004 Oct 8 Attributed: @@ -41,15 +44,18 @@ Comments: ljpeg was rip from medcon and not the official one. medcon tried to optimised function using MACRO (doh!), so it make its very unreadable and very hard to fix warnings. Should go back to official source, copy proper copyright and fix warnings on dashboard -13/10: update apparently no dicom toolkit use this lib as it is too buggy. We should use the ls-patch for ijg instead. Thus we can safely get rid of that lib. -14/10: PHILIPS_Gyroscan-12-MONO2-Jpeg_Lossless.dcm prove that I was right the old Cornwell lib is buggy and does not read anything. +13/10: update apparently no dicom toolkit use this lib as it is too buggy. +We should use the ls-patch for ijg instead. Thus we can safely get rid of that +lib. +14/10: PHILIPS_Gyroscan-12-MONO2-Jpeg_Lossless.dcm prove that I was right the +old Cornwell lib is buggy and does not read anything. ----------------------------------------------------------------------------- Description: Extent reading support Date: 2004 Oct 8 Attributed: Mathieu Details: -Comments: All ITK/VTK readers support selecting extent. gdcm should support selecting -extent before being inserted into ITK +Comments: All ITK/VTK readers support selecting extent. gdcm should support +selecting extent before being inserted into ITK ----------------------------------------------------------------------------- Description: Generate new UID each time we write DICOM Date: 2004 Oct 8 diff --git a/src/gdcmJPEGFragmentsInfo.cxx b/src/gdcmJPEGFragmentsInfo.cxx index 06f331b3..7a1ad397 100644 --- a/src/gdcmJPEGFragmentsInfo.cxx +++ b/src/gdcmJPEGFragmentsInfo.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmJPEGFragmentsInfo.cxx,v $ Language: C++ - Date: $Date: 2004/10/20 14:30:40 $ - Version: $Revision: 1.3 $ + Date: $Date: 2004/10/28 22:21:57 $ + Version: $Revision: 1.4 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -30,7 +30,7 @@ JPEGFragmentsInfo::~JPEGFragmentsInfo() it != Fragments.end(); ++it ) { - delete (*it); + delete *it; } Fragments.clear(); } diff --git a/src/gdcmPixelConvert.cxx b/src/gdcmPixelConvert.cxx index 3935d80d..5abd6c4e 100644 --- a/src/gdcmPixelConvert.cxx +++ b/src/gdcmPixelConvert.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmPixelConvert.cxx,v $ Language: C++ - Date: $Date: 2004/10/25 17:07:16 $ - Version: $Revision: 1.21 $ + Date: $Date: 2004/10/28 22:21:57 $ + Version: $Revision: 1.22 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -28,7 +28,6 @@ namespace gdcm { - #define str2num(str, typeNum) *((typeNum *)(str)) // For JPEG 2000, body in file gdcmJpeg2000.cxx @@ -106,7 +105,7 @@ void PixelConvert::ReadAndDecompress12BitsTo16Bits( std::ifstream* fp ) { int nbPixels = XSize * YSize; uint16_t* localDecompres = (uint16_t*)Decompressed; - + for( int p = 0; p < nbPixels; p += 2 ) { uint8_t b0, b1, b2; @@ -131,7 +130,7 @@ void PixelConvert::ReadAndDecompress12BitsTo16Bits( std::ifstream* fp ) throw FormatError( "PixelConvert::ReadAndDecompress12BitsTo16Bits()", "Unfound second block" ); } - + // Two steps are necessary to please VC++ // // 2 pixels 12bit = [0xABCDEF] @@ -140,7 +139,7 @@ void PixelConvert::ReadAndDecompress12BitsTo16Bits( std::ifstream* fp ) *localDecompres++ = ((b0 >> 4) << 8) + ((b0 & 0x0f) << 4) + (b1 & 0x0f); // F C E *localDecompres++ = ((b2 & 0x0f) << 8) + ((b1 >> 4) << 4) + (b2 >> 4); - + /// \todo JPR Troubles expected on Big-Endian processors ? } } @@ -204,7 +203,7 @@ bool PixelConvert::ReadAndDecompressRLEFragment( uint8_t* subDecompressed, int8_t count; long numberOfOutputBytes = 0; long numberOfReadBytes = 0; - + while( numberOfOutputBytes < decompressedSegmentSize ) { fp->read( (char*)&count, 1 ); @@ -268,7 +267,6 @@ bool PixelConvert::ReadAndDecompressRLEFile( std::ifstream* fp ) // Loop on the fragments for( unsigned int k = 1; k <= (*it)->NumberFragments; k++ ) { - //fseek( fp, (*it)->Offset[k] ,SEEK_SET ); fp->seekg( (*it)->Offset[k] , std::ios_base::beg ); (void)ReadAndDecompressRLEFragment( subDecompressed, (*it)->Length[k], @@ -277,13 +275,13 @@ bool PixelConvert::ReadAndDecompressRLEFile( std::ifstream* fp ) subDecompressed += decompressedSegmentSize; } } - + if ( BitsAllocated == 16 ) { // Try to deal with RLE 16 Bits (void)DecompressRLE16BitsFromRLE8Bits( ZSize ); } - + return true; } @@ -293,7 +291,7 @@ bool PixelConvert::ReadAndDecompressRLEFile( std::ifstream* fp ) void PixelConvert::ConvertSwapZone() { unsigned int i; - + if( BitsAllocated == 16 ) { uint16_t* im16 = (uint16_t*)Decompressed; @@ -409,7 +407,6 @@ bool PixelConvert::ReadAndDecompressJPEGFile( std::ifstream* fp ) it != JPEGInfo->Fragments.end(); ++it ) { - //fseek( fp, (*it)->Offset, SEEK_SET ); fp->seekg( (*it)->Offset, std::ios_base::beg); if ( IsJPEG2000 ) @@ -451,12 +448,12 @@ bool PixelConvert::ReadAndDecompressJPEGFile( std::ifstream* fp ) "jpeg lossy compression "); return false; } - + // Advance to next free location in Decompressed // for next fragment decompression (if any) int length = XSize * YSize * SamplesPerPixel; int numberBytes = BitsAllocated / 8; - + localDecompressed += length * numberBytes; } return true; @@ -512,7 +509,7 @@ void PixelConvert::ConvertYcBcRPlanesToRGBPixels() uint8_t* localDecompressed = Decompressed; uint8_t* copyDecompressed = new uint8_t[ DecompressedSize ]; memmove( copyDecompressed, localDecompressed, DecompressedSize ); - + // to see the tricks about YBR_FULL, YBR_FULL_422, // YBR_PARTIAL_422, YBR_ICT, YBR_RCT have a look at : // ftp://medical.nema.org/medical/dicom/final/sup61_ft.pdf @@ -520,17 +517,17 @@ void PixelConvert::ConvertYcBcRPlanesToRGBPixels() // int l = XSize * YSize; int nbFrames = ZSize; - + uint8_t* a = copyDecompressed; uint8_t* b = copyDecompressed + l; uint8_t* c = copyDecompressed + l + l; double R, G, B; - + /// \todo : Replace by the 'well known' integer computation /// counterpart. Refer to /// http://lestourtereaux.free.fr/papers/data/yuvrgb.pdf /// for code optimisation. - + for ( int i = 0; i < nbFrames; i++ ) { for ( int j = 0; j < l; j++ ) @@ -538,14 +535,14 @@ void PixelConvert::ConvertYcBcRPlanesToRGBPixels() R = 1.164 *(*a-16) + 1.596 *(*c -128) + 0.5; G = 1.164 *(*a-16) - 0.813 *(*c -128) - 0.392 *(*b -128) + 0.5; B = 1.164 *(*a-16) + 2.017 *(*b -128) + 0.5; - + if (R < 0.0) R = 0.0; if (G < 0.0) G = 0.0; if (B < 0.0) B = 0.0; if (R > 255.0) R = 255.0; if (G > 255.0) G = 255.0; if (B > 255.0) B = 255.0; - + *(localDecompressed++) = (uint8_t)R; *(localDecompressed++) = (uint8_t)G; *(localDecompressed++) = (uint8_t)B; @@ -566,13 +563,13 @@ void PixelConvert::ConvertRGBPlanesToRGBPixels() uint8_t* localDecompressed = Decompressed; uint8_t* copyDecompressed = new uint8_t[ DecompressedSize ]; memmove( copyDecompressed, localDecompressed, DecompressedSize ); - + int l = XSize * YSize * ZSize; - + uint8_t* a = copyDecompressed; uint8_t* b = copyDecompressed + l; uint8_t* c = copyDecompressed + l + l; - + for (int j = 0; j < l; j++) { *(localDecompressed++) = *(a++); @@ -594,8 +591,7 @@ bool PixelConvert::ReadAndDecompressPixelData( std::ifstream* fp ) "unavailable file pointer." ); return false; } - - //if ( fseek( fp, PixelOffset, SEEK_SET ) == -1 ) + fp->seekg( PixelOffset, std::ios_base::beg ); if( fp->fail() || fp->eof()) //Fp->gcount() == 1 { @@ -603,7 +599,7 @@ bool PixelConvert::ReadAndDecompressPixelData( std::ifstream* fp ) "unable to find PixelOffset in file." ); return false; } - + ////////////////////////////////////////////////// //// Second stage: read from disk dans decompress. if ( BitsAllocated == 12 ) @@ -726,7 +722,7 @@ void PixelConvert::ConvertHandleColor() bool PixelConvert::IsDecompressedRGB() { if ( IsMonochrome - || ( PlanarConfiguration == 2 ) + || PlanarConfiguration == 2 || IsPaletteColor ) { return false; @@ -841,11 +837,9 @@ void PixelConvert::GrabInformationsFromHeader( Header* header ) DocEntry* lutRedDataEntry = header->GetDocEntryByNumber( 0x0028, 0x1201 ); LutRedData = new uint8_t[ lutRedDataEntry->GetLength() ]; - //fseek( fp, lutRedDataEntry->GetOffset() ,SEEK_SET ); fp->seekg( lutRedDataEntry->GetOffset() ,std::ios_base::beg ); - fp->read( (char*)LutRedData, (size_t)lutRedDataEntry->GetLength()); - //if ( numberItem != 1 ) - if ( fp->fail() || fp->eof())//Fp->gcount() == 1 + fp->read( (char*)LutRedData, (size_t)lutRedDataEntry->GetLength()); + if ( fp->fail() || fp->eof())//Fp->gcount() == 1 { dbg.Verbose(0, "PixelConvert::GrabInformationsFromHeader: " "unable to read red LUT data" ); @@ -861,11 +855,9 @@ void PixelConvert::GrabInformationsFromHeader( Header* header ) DocEntry* lutGreenDataEntry = header->GetDocEntryByNumber( 0x0028, 0x1202 ); LutGreenData = new uint8_t[ lutGreenDataEntry->GetLength() ]; - //fseek( fp, lutGreenDataEntry->GetOffset() ,SEEK_SET ); fp->seekg( lutGreenDataEntry->GetOffset() , std::ios_base::beg ); - fp->read( (char*)LutGreenData, (size_t)lutGreenDataEntry->GetLength() ); - //if ( numberItem != 1 ) - if ( fp->fail() || fp->eof())//Fp->gcount() == 1 + fp->read( (char*)LutGreenData, (size_t)lutGreenDataEntry->GetLength() ); + if ( fp->fail() || fp->eof())//Fp->gcount() == 1 { dbg.Verbose(0, "PixelConvert::GrabInformationsFromHeader: " "unable to read green LUT data" ); @@ -881,11 +873,9 @@ void PixelConvert::GrabInformationsFromHeader( Header* header ) DocEntry* lutBlueDataEntry = header->GetDocEntryByNumber( 0x0028, 0x1203 ); LutBlueData = new uint8_t[ lutBlueDataEntry->GetLength() ]; - //fseek( fp, lutBlueDataEntry->GetOffset() ,SEEK_SET ); fp->seekg( lutBlueDataEntry->GetOffset() , std::ios_base::beg ); fp->read( (char*)LutBlueData, (size_t)lutBlueDataEntry->GetLength() ); - //if ( numberItem != 1 ) - if ( fp->fail() || fp->eof())//Fp->gcount() == 1 + if ( fp->fail() || fp->eof())//Fp->gcount() == 1 { dbg.Verbose(0, "PixelConvert::GrabInformationsFromHeader: " "unable to read blue LUT data" ); @@ -926,9 +916,9 @@ void PixelConvert::BuildLUTRGBA() return; } - if ( ( LutRedDescriptor == GDCM_UNFOUND ) - || ( LutGreenDescriptor == GDCM_UNFOUND ) - || ( LutBlueDescriptor == GDCM_UNFOUND ) ) + if ( LutRedDescriptor == GDCM_UNFOUND + || LutGreenDescriptor == GDCM_UNFOUND + || LutBlueDescriptor == GDCM_UNFOUND ) { return; } @@ -1039,7 +1029,7 @@ bool PixelConvert::BuildRGBImage() { if ( RGB ) { - // The job is allready done. + // The job is already done. return true; } diff --git a/src/gdcmUtil.cxx b/src/gdcmUtil.cxx index d09fe453..a9900f46 100644 --- a/src/gdcmUtil.cxx +++ b/src/gdcmUtil.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmUtil.cxx,v $ Language: C++ - Date: $Date: 2004/10/27 22:58:06 $ - Version: $Revision: 1.56 $ + Date: $Date: 2004/10/28 22:21:57 $ + Version: $Revision: 1.57 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -189,5 +189,42 @@ std::string Util::GetName(std::string const & fullName) } } + +template +std::ostream& binary_write(std::ostream& os, const T& val) +{ + return os.write(reinterpret_cast(&val), sizeof val); +} + +std::ostream& binary_write(std::ostream& os, const uint16_t& val) +{ +#ifdef GDCM_WORDS_BIGENDIAN + uint16_t *swap; + swap = (((*val>>8)&0xff) | ((*val&0xff)<<8)); + return os.write(reinterpret_cast(swap), 2); +#else + return os.write(reinterpret_cast(&val), 2); +#endif //GDCM_WORDS_BIGENDIAN +} + +std::ostream& binary_write(std::ostream& os, const uint32_t& val) +{ +#ifdef GDCM_WORDS_BIGENDIAN + uint32_t *swap; + swap = ( ((val<<24) & 0xff000000) | ((val<<8) & 0x00ff0000) | + ((val>>8) & 0x0000ff00) | ((val>>24) & 0x000000ff) ); + return os.write(reinterpret_cast(swap), 4); +#else + return os.write(reinterpret_cast(&val), 4); +#endif //GDCM_WORDS_BIGENDIAN +} + +//template <> +std::ostream& binary_write(std::ostream& os, const char* val) +{ + return os.write(val, strlen(val)); +} + + } // end namespace gdcm -- 2.45.0