X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmPixelReadConvert.cxx;h=9b97cbb171e525e98fc0ea176a36a55d2e208ddc;hb=eeb624df6a1661e969566c200505f3dac84f4cd6;hp=7dc62ec99bdc02596f412bae40a94529a6fb1dc5;hpb=1996bbbcd752f893a137241cadbece7d758baa81;p=gdcm.git diff --git a/src/gdcmPixelReadConvert.cxx b/src/gdcmPixelReadConvert.cxx index 7dc62ec9..9b97cbb1 100644 --- a/src/gdcmPixelReadConvert.cxx +++ b/src/gdcmPixelReadConvert.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmPixelReadConvert.cxx,v $ Language: C++ - Date: $Date: 2005/06/22 07:52:32 $ - Version: $Revision: 1.69 $ + Date: $Date: 2005/07/01 11:25:51 $ + Version: $Revision: 1.74 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -50,6 +50,8 @@ PixelReadConvert::PixelReadConvert() LutRedData = 0; LutGreenData = 0; LutBlueData = 0; + RLEInfo = 0; + JPEGInfo = 0; } /// Canonical Destructor @@ -207,7 +209,7 @@ bool PixelReadConvert::ReadAndDecompressPixelData( std::ifstream *fp ) } fp->seekg( PixelOffset, std::ios::beg ); - if( fp->fail() || fp->eof()) + if ( fp->fail() || fp->eof() ) { gdcmWarningMacro( "Unable to find PixelOffset in file." ); return false; @@ -227,12 +229,12 @@ bool PixelReadConvert::ReadAndDecompressPixelData( std::ifstream *fp ) // after the field containing the image data. In this case, these // bad data are added to the size of the image (in the PixelDataLength // variable). But RawSize is the right size of the image ! - if( PixelDataLength != RawSize) + if ( PixelDataLength != RawSize ) { gdcmWarningMacro( "Mismatch between PixelReadConvert : " << PixelDataLength << " and RawSize : " << RawSize ); } - if( PixelDataLength > RawSize) + if ( PixelDataLength > RawSize ) { fp->read( (char*)Raw, RawSize); } @@ -328,7 +330,7 @@ bool PixelReadConvert::BuildRGBImage() AllocateRGB(); int j; - if( BitsAllocated <= 8 ) + if ( BitsAllocated <= 8 ) { uint8_t *localRGB = RGB; for (size_t i = 0; i < RawSize; ++i ) @@ -557,7 +559,7 @@ void PixelReadConvert::BuildLUTRGBA() nbRead = sscanf( LutRedDescriptor.c_str(), "%d\\%d\\%d", &lengthR, &debR, &nbitsR ); - if( nbRead != 3 ) + if ( nbRead != 3 ) { gdcmWarningMacro( "Wrong Red LUT descriptor" ); } @@ -568,7 +570,7 @@ void PixelReadConvert::BuildLUTRGBA() nbRead = sscanf( LutGreenDescriptor.c_str(), "%d\\%d\\%d", &lengthG, &debG, &nbitsG ); - if( nbRead != 3 ) + if ( nbRead != 3 ) { gdcmWarningMacro( "Wrong Green LUT descriptor" ); } @@ -579,7 +581,7 @@ void PixelReadConvert::BuildLUTRGBA() nbRead = sscanf( LutRedDescriptor.c_str(), "%d\\%d\\%d", &lengthB, &debB, &nbitsB ); - if( nbRead != 3 ) + if ( nbRead != 3 ) { gdcmWarningMacro( "Wrong Blue LUT descriptor" ); } @@ -591,16 +593,16 @@ void PixelReadConvert::BuildLUTRGBA() gdcmWarningMacro(" lengthB " << lengthB << " debB " << debB << " nbitsB " << nbitsB); - if( !lengthR ) // if = 2^16, this shall be 0 see : CP-143 + if ( !lengthR ) // if = 2^16, this shall be 0 see : CP-143 lengthR=65536; - if( !lengthG ) // if = 2^16, this shall be 0 + if ( !lengthG ) // if = 2^16, this shall be 0 lengthG=65536; - if( !lengthB ) // if = 2^16, this shall be 0 + if ( !lengthB ) // if = 2^16, this shall be 0 lengthB=65536; //////////////////////////////////////////////////////// - if( ( ! LutRedData ) || ( ! LutGreenData ) || ( ! LutBlueData ) ) + if ( ( ! LutRedData ) || ( ! LutGreenData ) || ( ! LutBlueData ) ) { gdcmWarningMacro( "(At least) a LUT is missing" ); return; @@ -608,7 +610,7 @@ void PixelReadConvert::BuildLUTRGBA() // ------------------------------------------------------------- - if( BitsAllocated <= 8 ) + if ( BitsAllocated <= 8 ) { // forge the 4 * 8 Bits Red/Green/Blue/Alpha LUT LutRGBA = new uint8_t[ 1024 ]; // 256 * 4 (R, G, B, Alpha) @@ -619,7 +621,7 @@ void PixelReadConvert::BuildLUTRGBA() memset( LutRGBA, 0, 1024 ); int mult; - if( ( nbitsR == 16 ) && ( BitsAllocated == 8 ) ) + if ( ( nbitsR == 16 ) && ( BitsAllocated == 8 ) ) { // when LUT item size is different than pixel size mult = 2; // high byte must be = low byte @@ -745,7 +747,7 @@ void PixelReadConvert::ConvertSwapZone() { unsigned int i; - if( BitsAllocated == 16 ) + if ( BitsAllocated == 16 ) { uint16_t *im16 = (uint16_t*)Raw; switch( SwapCode ) @@ -764,7 +766,7 @@ void PixelReadConvert::ConvertSwapZone() gdcmWarningMacro("SwapCode value (16 bits) not allowed."); } } - else if( BitsAllocated == 32 ) + else if ( BitsAllocated == 32 ) { uint32_t s32; uint16_t high; @@ -830,7 +832,7 @@ void PixelReadConvert::ConvertReorderEndianity() uint16_t *deb = (uint16_t *)Raw; for(int i = 0; i> (BitsStored - HighBitPosition - 1)) & pmask; deb++; } } - else + else // Pixels are signed { // smask : to check the 'sign' when BitsStored != BitsAllocated - uint16_t smask = 0x8000; - smask = smask >> ( BitsAllocated - BitsStored ); + uint16_t smask = 0x0001; + smask = smask << ( 16 - (BitsAllocated - BitsStored + 1) ); // nmask : to propagate sign bit on negative values - int16_t nmask = 0x8000; - nmask = nmask >> ( BitsAllocated - BitsStored ); - + int16_t nmask = (int16_t)0x8000; + nmask = nmask >> ( BitsAllocated - BitsStored - 1 ); +/* +std::cout << "BitsStored " << BitsStored + << " BitsAllocated " << BitsAllocated + << std::endl; +std::cout << std::hex << "pmask " << pmask + << " smask " << smask + << " nmask " << nmask + << std::endl; +*/ for(int i = 0; i> (BitsStored - HighBitPosition - 1); if ( *deb & smask ) + { *deb = *deb | nmask; + } else + { *deb = *deb & pmask; + } deb++; } } @@ -972,11 +987,11 @@ bool PixelReadConvert::ConvertReArrangeBits() throw ( FormatError ) else { // smask : to check the 'sign' when BitsStored != BitsAllocated - uint32_t smask = 0x80000000; - smask = smask >> ( BitsAllocated - BitsStored ); + uint32_t smask = 0x00000001; + smask = smask >> ( 32 - (BitsAllocated - BitsStored +1 )); // nmask : to propagate sign bit on negative values int32_t nmask = 0x80000000; - nmask = nmask >> ( BitsAllocated - BitsStored ) + nmask = nmask >> ( BitsAllocated - BitsStored -1 ); for(int i = 0; i