From 15424662ec90f5a5071bcf32e7f6dc09cead024d Mon Sep 17 00:00:00 2001 From: frog Date: Fri, 8 Oct 2004 17:02:52 +0000 Subject: [PATCH] * CLEANUP_ROUND (9) for gdcmPixelConvert - src/gdcmFile.[cxx|h} gdcmPixelConvert.[cxx|h], SwapZone(), ConvertReorderEndianity(), ConvertDecmpres12BitsTo16Bits() moved away from gdcmFile:: to gdcmPixelConvert::. --- ChangeLog | 5 ++ src/gdcmFile.cxx | 180 ++------------------------------------- src/gdcmFile.h | 16 +--- src/gdcmPixelConvert.cxx | 169 +++++++++++++++++++++++++++++++----- src/gdcmPixelConvert.h | 56 +++++++----- 5 files changed, 195 insertions(+), 231 deletions(-) diff --git a/ChangeLog b/ChangeLog index c8163a29..912b4b43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,11 @@ - src/gdcmPixelConvert.cxx all RLE code is now in PixelConvert:: - src/CMakeLists.txt gdcmFile.[cxx|h] changed accordingly - src/gdcmRLEFrame*.h gdcmPixelConvert is now a friend class. + * CLEANUP_ROUND (9) for gdcmPixelConvert + - src/gdcmFile.[cxx|h} gdcmPixelConvert.[cxx|h], SwapZone(), + ConvertReorderEndianity(), ConvertDecmpres12BitsTo16Bits() moved + away from gdcmFile:: to gdcmPixelConvert::. + 2004-10-07 Eric Boix * CLEANUP_ROUND (5) for gdcmPixelConvert (Upshit creek without a paddle) diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index 7a3c1fcc..323cdba5 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFile.cxx,v $ Language: C++ - Date: $Date: 2004/10/08 16:27:20 $ - Version: $Revision: 1.135 $ + Date: $Date: 2004/10/08 17:02:53 $ + Version: $Revision: 1.136 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -520,10 +520,12 @@ size_t gdcmFile::GetImageDataIntoVectorRaw (void* destination, size_t maxSize) bool signedPixel = Header->IsSignedPixelData(); - ConvertReorderEndianity( (uint8_t*) destination, + gdcmPixelConvert::ConvertReorderEndianity( + (uint8_t*) destination, ImageDataSize, numberBitsStored, numberBitsAllocated, + Header->GetSwapCode(), signedPixel ); ConvertReArrangeBits( (uint8_t*) destination, @@ -656,39 +658,6 @@ void gdcmFile::ConvertReArrangeBits( uint8_t* pixelZone, } } -/** - * \brief Deal with endianity i.e. re-arange bytes inside the integer - */ -void gdcmFile::ConvertReorderEndianity( uint8_t* pixelZone, - size_t imageDataSize, - int numberBitsStored, - int numberBitsAllocated, - bool signedPixel) -{ - if ( numberBitsAllocated != 8 ) - { - SwapZone( pixelZone, Header->GetSwapCode(), ImageDataSize, - numberBitsAllocated ); - } - - // Special kludge in order to deal with xmedcon broken images: - if ( ( numberBitsAllocated == 16 ) - && ( numberBitsStored < numberBitsAllocated ) - && ( ! signedPixel ) ) - { - int l = (int)(ImageDataSize / (numberBitsAllocated/8)); - uint16_t *deb = (uint16_t *)pixelZone; - for(int i = 0; i> 8) | (im16[i] << 8 ); - } - break; - default: - std::cout << "SWAP value (16 bits) not allowed :i" << swap << - std::endl; - } - } - else if( nb == 32 ) - { - uint32_t s32; - uint16_t fort, faible; - uint32_t* im32 = (uint32_t*)im; - switch ( swap ) - { - case 0: - case 1234: - break; - case 4321: - for(i = 0; i < lgr/4; i++) - { - faible = im32[i] & 0x0000ffff; // 4321 - fort = im32[i] >> 16; - fort = ( fort >> 8 ) | ( fort << 8 ); - faible = ( faible >> 8 ) | ( faible << 8); - s32 = faible; - im32[i] = ( s32 << 16 ) | fort; - } - break; - case 2143: - for(i = 0; i < lgr/4; i++) - { - faible = im32[i] & 0x0000ffff; // 2143 - fort = im32[i] >> 16; - fort = ( fort >> 8 ) | ( fort << 8 ); - faible = ( faible >> 8) | ( faible << 8); - s32 = fort; - im32[i] = ( s32 << 16 ) | faible; - } - break; - case 3412: - for(i = 0; i < lgr/4; i++) - { - faible = im32[i] & 0x0000ffff; // 3412 - fort = im32[i] >> 16; - s32 = faible; - im32[i] = ( s32 << 16 ) | fort; - } - break; - default: - std::cout << "SWAP value (32 bits) not allowed : " << swap << - std::endl; - } - } -} - /** * \brief Read pixel data from disk (optionaly decompressing) into the * caller specified memory location. @@ -1054,7 +940,8 @@ bool gdcmFile::ReadPixelData(void* destination) if ( Header->GetBitsAllocated() == 12 ) { - ConvertDecompress12BitsTo16Bits( (uint8_t*)destination, + gdcmPixelConvert::ConvertDecompress12BitsTo16Bits( + (uint8_t*)destination, Header->GetXSize(), Header->GetYSize(), fp); @@ -1216,56 +1103,3 @@ bool gdcmFile::ReadPixelData(void* destination) return res; } -/** - * \brief Read from file a 12 bits per pixel image and uncompress it - * into a 16 bits per pixel image. - */ -void gdcmFile::ConvertDecompress12BitsTo16Bits( - uint8_t* pixelZone, - int sizeX, - int sizeY, - FILE* filePtr) - throw ( gdcmFormatError ) -{ - int nbPixels = sizeX * sizeY; - uint16_t* destination = (uint16_t*)pixelZone; - - for( int p = 0; p < nbPixels; p += 2 ) - { - uint8_t b0, b1, b2; - size_t ItemRead; - - ItemRead = fread( &b0, 1, 1, filePtr); - if ( ItemRead != 1 ) - { - throw gdcmFormatError( "gdcmFile::ConvertDecompress12BitsTo16Bits()", - "Unfound first block" ); - } - - ItemRead = fread( &b1, 1, 1, filePtr); - if ( ItemRead != 1 ) - { - throw gdcmFormatError( "gdcmFile::ConvertDecompress12BitsTo16Bits()", - "Unfound second block" ); - } - - ItemRead = fread( &b2, 1, 1, filePtr); - if ( ItemRead != 1 ) - { - throw gdcmFormatError( "gdcmFile::ConvertDecompress12BitsTo16Bits()", - "Unfound second block" ); - } - - // Two steps are necessary to please VC++ - // - // 2 pixels 12bit = [0xABCDEF] - // 2 pixels 16bit = [0x0ABD] + [0x0FCE] - // A B D - *destination++ = ((b0 >> 4) << 8) + ((b0 & 0x0f) << 4) + (b1 & 0x0f); - // F C E - *destination++ = ((b2 & 0x0f) << 8) + ((b1 >> 4) << 4) + (b2 >> 4); - - /// \todo JPR Troubles expected on Big-Endian processors ? - } -} -//----------------------------------------------------------------------------- diff --git a/src/gdcmFile.h b/src/gdcmFile.h index 3bb74872..057f02bd 100644 --- a/src/gdcmFile.h +++ b/src/gdcmFile.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmFile.h,v $ Language: C++ - Date: $Date: 2004/10/08 16:27:20 $ - Version: $Revision: 1.57 $ + Date: $Date: 2004/10/08 17:02:53 $ + Version: $Revision: 1.58 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -49,17 +49,6 @@ public: int numberBitsStored, int numberBitsAllocated, int highBitPosition ) throw ( gdcmFormatError ); - void ConvertReorderEndianity( - uint8_t* pixelZone, - size_t imageDataSize, - int numberBitsStored, - int numberBitsAllocated, - bool signedPixel ); - void ConvertDecompress12BitsTo16Bits( - uint8_t* pixelZone, - int sizeX, - int sizeY, - FILE* filePtr) throw ( gdcmFormatError); /// Accessor to \ref ImageDataSize size_t GetImageDataSize(){ return ImageDataSize; }; @@ -102,7 +91,6 @@ protected: private: void Initialise(); - void SwapZone(void* im, int swap, int lgr, int nb); bool ReadPixelData(void* destination); diff --git a/src/gdcmPixelConvert.cxx b/src/gdcmPixelConvert.cxx index 789a600a..9a8afcd3 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/08 16:27:20 $ - Version: $Revision: 1.3 $ + Date: $Date: 2004/10/08 17:02:53 $ + 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 @@ -70,46 +70,53 @@ void gdcmPixelConvert::AllocateUncompressed() * \brief Read from file a 12 bits per pixel image and uncompress it * into a 16 bits per pixel image. */ -bool gdcmPixelConvert::ReadAndUncompress12Bits( FILE* filePointer, - size_t uncompressedSize, - size_t PixelNumber ) +void gdcmPixelConvert::ConvertDecompress12BitsTo16Bits( + uint8_t* pixelZone, + int sizeX, + int sizeY, + FILE* filePtr) + throw ( gdcmFormatError ) { - SetUncompressedSize( uncompressedSize ); - AllocateUncompressed(); - - uint16_t* pdestination = (uint16_t*)Uncompressed; + int nbPixels = sizeX * sizeY; + uint16_t* destination = (uint16_t*)pixelZone; - for(int p = 0; p < PixelNumber; p += 2 ) + for( int p = 0; p < nbPixels; p += 2 ) { - // 2 pixels 12bit = [0xABCDEF] - // 2 pixels 16bit = [0x0ABD] + [0x0FCE] uint8_t b0, b1, b2; size_t ItemRead; - ItemRead = fread( &b0, 1, 1, filePointer); + + ItemRead = fread( &b0, 1, 1, filePtr); if ( ItemRead != 1 ) { - return false; + throw gdcmFormatError( "gdcmFile::ConvertDecompress12BitsTo16Bits()", + "Unfound first block" ); } - ItemRead = fread( &b1, 1, 1, filePointer); + + ItemRead = fread( &b1, 1, 1, filePtr); if ( ItemRead != 1 ) { - return false; + throw gdcmFormatError( "gdcmFile::ConvertDecompress12BitsTo16Bits()", + "Unfound second block" ); } - ItemRead = fread( &b2, 1, 1, filePointer); + + ItemRead = fread( &b2, 1, 1, filePtr); if ( ItemRead != 1 ) { - return false; + throw gdcmFormatError( "gdcmFile::ConvertDecompress12BitsTo16Bits()", + "Unfound second block" ); } - //Two steps are necessary to please VC++ - *pdestination++ = ((b0 >> 4) << 8) + ((b0 & 0x0f) << 4) + (b1 & 0x0f); + // Two steps are necessary to please VC++ + // + // 2 pixels 12bit = [0xABCDEF] + // 2 pixels 16bit = [0x0ABD] + [0x0FCE] // A B D - *pdestination++ = ((b2 & 0x0f) << 8) + ((b1 >> 4) << 4) + (b2 >> 4); + *destination++ = ((b0 >> 4) << 8) + ((b0 & 0x0f) << 4) + (b1 & 0x0f); // F C E + *destination++ = ((b2 & 0x0f) << 8) + ((b1 >> 4) << 4) + (b2 >> 4); /// \todo JPR Troubles expected on Big-Endian processors ? } - return true; } /** @@ -305,3 +312,121 @@ bool gdcmPixelConvert::gdcm_read_RLE_file( void* image_buffer, return true; } +/** + * \brief Swap the bytes, according to swap code. + * \warning not end user intended + * @param im area to deal with + * @param swap swap code + * @param lgr Area Length + * @param nb Pixels Bit number + */ +void gdcmPixelConvert::SwapZone(void* im, int swap, int lgr, int nb) +{ + int i; + + if( nb == 16 ) + { + uint16_t* im16 = (uint16_t*)im; + switch( swap ) + { + case 0: + case 12: + case 1234: + break; + case 21: + case 3412: + case 2143: + case 4321: + for(i=0; i < lgr/2; i++) + { + im16[i]= (im16[i] >> 8) | (im16[i] << 8 ); + } + break; + default: + std::cout << "SWAP value (16 bits) not allowed :i" << swap << + std::endl; + } + } + else if( nb == 32 ) + { + uint32_t s32; + uint16_t fort, faible; + uint32_t* im32 = (uint32_t*)im; + switch ( swap ) + { + case 0: + case 1234: + break; + case 4321: + for(i = 0; i < lgr/4; i++) + { + faible = im32[i] & 0x0000ffff; // 4321 + fort = im32[i] >> 16; + fort = ( fort >> 8 ) | ( fort << 8 ); + faible = ( faible >> 8 ) | ( faible << 8); + s32 = faible; + im32[i] = ( s32 << 16 ) | fort; + } + break; + case 2143: + for(i = 0; i < lgr/4; i++) + { + faible = im32[i] & 0x0000ffff; // 2143 + fort = im32[i] >> 16; + fort = ( fort >> 8 ) | ( fort << 8 ); + faible = ( faible >> 8) | ( faible << 8); + s32 = fort; + im32[i] = ( s32 << 16 ) | faible; + } + break; + case 3412: + for(i = 0; i < lgr/4; i++) + { + faible = im32[i] & 0x0000ffff; // 3412 + fort = im32[i] >> 16; + s32 = faible; + im32[i] = ( s32 << 16 ) | fort; + } + break; + default: + std::cout << "SWAP value (32 bits) not allowed : " << swap << + std::endl; + } + } +} + + + +/** + * \brief Deal with endianity i.e. re-arange bytes inside the integer + */ +void gdcmPixelConvert::ConvertReorderEndianity( uint8_t* pixelZone, + size_t imageDataSize, + int numberBitsStored, + int numberBitsAllocated, + int swapCode, + bool signedPixel) +{ + if ( numberBitsAllocated != 8 ) + { + SwapZone( pixelZone, swapCode, imageDataSize, numberBitsAllocated ); + } + + // Special kludge in order to deal with xmedcon broken images: + if ( ( numberBitsAllocated == 16 ) + && ( numberBitsStored < numberBitsAllocated ) + && ( ! signedPixel ) ) + { + int l = (int)(imageDataSize / (numberBitsAllocated/8)); + uint16_t *deb = (uint16_t *)pixelZone; + for(int i = 0; i