X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmPixelReadConvert.cxx;h=c8aec3dfaefcb0fb087fc9d7fd84ad327ba25578;hb=1771b10b3f1a4d6f96ea1869fb005f0d48b62eda;hp=32a8f81dfa4bb3d4573e4f0c14ae45964f527d99;hpb=2532a8e86e06d379d58b2fdda8e2413641d0a5f0;p=gdcm.git diff --git a/src/gdcmPixelReadConvert.cxx b/src/gdcmPixelReadConvert.cxx index 32a8f81d..c8aec3df 100644 --- a/src/gdcmPixelReadConvert.cxx +++ b/src/gdcmPixelReadConvert.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmPixelReadConvert.cxx,v $ Language: C++ - Date: $Date: 2006/03/29 16:09:48 $ - Version: $Revision: 1.111 $ + Date: $Date: 2007/09/04 13:14:33 $ + Version: $Revision: 1.119 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -32,7 +32,7 @@ #include // for memset #endif -namespace gdcm +namespace GDCM_NAME_SPACE { //bool ReadMPEGFile (std::ifstream *fp, char *inputdata, size_t lenght); @@ -85,6 +85,7 @@ bool PixelReadConvert::IsRawRGB() /** * \brief Gets various usefull informations from the file header * @param file gdcm::File pointer + * @param fileHelper gdcm::FileHelper pointer */ void PixelReadConvert::GrabInformationsFromFile( File *file, FileHelper *fileHelper ) @@ -97,6 +98,10 @@ void PixelReadConvert::GrabInformationsFromFile( File *file, BitsAllocated = 16; } + else if (BitsAllocated > 8 && BitsAllocated < 16 && BitsAllocated != 12) + { + BitsAllocated = 16; + } // Number of "Bits Stored", defaulted to number of "Bits Allocated" // when absent from the file. BitsStored = file->GetBitsStored(); @@ -165,7 +170,7 @@ void PixelReadConvert::GrabInformationsFromFile( File *file, if( IsJPEG2000 = Global::GetTS()->IsJPEG2000(ts) ) break; if( IsMPEG = Global::GetTS()->IsMPEG(ts) ) break; if( IsJPEGLS = Global::GetTS()->IsJPEGLS(ts) ) break; - // DeflatedExplicitVRLittleEndian is considered as 'Unexpected' (we don't know yet haow to process !) + // DeflatedExplicitVRLittleEndian is considered as 'Unexpected' (we don't know yet how to process !) gdcmWarningMacro("Unexpected Transfer Syntax :[" << ts << "]"); break; } @@ -271,7 +276,8 @@ bool PixelReadConvert::ReadAndDecompressPixelData( std::ifstream *fp ) unsigned int count = 0; unsigned int frameSize; unsigned int bitsAllocated = BitsAllocated; - if(bitsAllocated == 12) + //if(bitsAllocated == 12) + if(bitsAllocated > 8 && bitsAllocated < 16) bitsAllocated = 16; frameSize = XSize*YSize*SamplesPerPixel*bitsAllocated/8; @@ -588,8 +594,15 @@ bool PixelReadConvert::ReadAndDecompressJPEGFile( std::ifstream *fp ) // Precompute the offset localRaw will be shifted with int length = XSize * YSize * ZSize * SamplesPerPixel; int numberBytes = BitsAllocated / 8; - - JPEGInfo->DecompressFromFile(fp, Raw, BitsStored, numberBytes, length ); + + // to avoid major troubles when BitsStored == 8 && BitsAllocated==16 ! + int dummy; + if (BitsStored == 8 && BitsAllocated==16) + dummy = 16; + else + dummy = BitsStored; + + JPEGInfo->DecompressFromFile(fp, Raw, /*BitsStored*/ dummy , numberBytes, length ); return true; } } @@ -963,6 +976,7 @@ void PixelReadConvert::ConvertReorderEndianity() && BitsStored < BitsAllocated && !PixelSign ) { + int l = (int)( RawSize / ( BitsAllocated / 8 ) ); int l = (int)( RawSize / ( BitsAllocated / 8 ) ); uint16_t *deb = (uint16_t *)Raw; for(int i = 0; i> ( BitsAllocated - BitsStored ); + + // It's up to the user to remove overlays if any), + // not to gdcm, witout asking ! + //pmask = pmask >> ( BitsAllocated - BitsStored ); uint16_t *deb = (uint16_t*)Raw; if ( !PixelSign ) // Pixels are unsigned { for(int i = 0; i> (BitsStored - HighBitPosition - 1)) & pmask; + { + // save CPU time + *deb = (*deb >> (BitsStored - HighBitPosition - 1))/* & pmask */; deb++; } } else // Pixels are signed { + // Hope there is never A + // smask : to check the 'sign' when BitsStored != BitsAllocated uint16_t smask = 0x0001; smask = smask << ( 16 - (BitsAllocated - BitsStored + 1) ); @@ -1097,10 +1117,17 @@ bool PixelReadConvert::ConvertReArrangeBits() throw ( FormatError ) } else if ( BitsAllocated == 32 ) { + } + deb++; + } + } + } + else if ( BitsAllocated == 32 ) + { // pmask : to mask the 'unused bits' (may contain overlays) uint32_t pmask = 0xffffffff; pmask = pmask >> ( BitsAllocated - BitsStored ); - + uint32_t *deb = (uint32_t*)Raw; if ( !PixelSign ) @@ -1125,8 +1152,8 @@ bool PixelReadConvert::ConvertReArrangeBits() throw ( FormatError ) *deb = *deb >> (BitsStored - HighBitPosition - 1); if ( *deb & smask ) *deb = *deb | nmask; - else - *deb = *deb & pmask; + else + *deb = *deb & pmask; deb++; } } @@ -1345,7 +1372,10 @@ void PixelReadConvert::ComputeRawAndRGBSizes() else { RGBSize = RawSize; + } + RawSize += RawSize%2; + RGBSize += RGBSize%2; } /// Allocates room for RGB Pixels @@ -1516,13 +1546,6 @@ of 12 for the third value and a max of 0xfff). Since almost every vendor that I have encountered that encodes LUTs makes this mistake, perhaps it is time to amend the standard to warn -implementor's of receivers and/or sanction this bad behavior. We have -talked about this in the past in WG 6 but so far everyone has been -reluctant to write into the standard such a comment. Maybe it is time -to try again, since if one is not aware of this problem, one cannot -effectively implement display using VOI LUTs, and there is a vast -installed base to contend with. - I did not check presentation states, in which VOI LUTs could also be encountered, for the prevalence of this mistake, nor did I look at the encoding of Modality LUT's, which are unusual. Nor did I check digital