/*=========================================================================
-
+
Program: gdcm
Module: $RCSfile: gdcmPixelReadConvert.cxx,v $
Language: C++
- Date: $Date: 2005/06/22 08:00:29 $
- Version: $Revision: 1.70 $
+ Date: $Date: 2005/08/19 13:15:05 $
+ Version: $Revision: 1.76 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
LutRedData = 0;
LutGreenData = 0;
LutBlueData = 0;
+ RLEInfo = 0;
+ JPEGInfo = 0;
+ UserFunction = 0;
+ FileInternal = 0;
}
/// Canonical Destructor
YSize = file->GetYSize();
ZSize = file->GetZSize();
SamplesPerPixel = file->GetSamplesPerPixel();
- PixelSize = file->GetPixelSize();
+ //PixelSize = file->GetPixelSize(); Useless
PixelSign = file->IsSignedPixelData();
SwapCode = file->GetSwapCode();
std::string ts = file->GetTransferSyntax();
gdcmWarningMacro( "Unable to read Blue Palette Color Lookup Table data" );
}
}
+ FileInternal = file;
ComputeRawAndRGBSizes();
}
}
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;
// 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);
}
{
//gdcmWarningMacro( "Sorry, MPEG not yet taken into account" );
//return false;
- //ReadMPEGFile(fp, Raw, PixelDataLength); // fp has already been seek to start of mpeg
+ // fp has already been seek to start of mpeg
+ //ReadMPEGFile(fp, Raw, PixelDataLength);
return true;
}
else
ConvertReorderEndianity();
ConvertReArrangeBits();
ConvertFixGreyLevels();
+ if (UserFunction) // user is allowed to Mirror, TopDown, Rotate,...the image
+ UserFunction( Raw, FileInternal);
ConvertHandleColor();
return true;
AllocateRGB();
int j;
- if( BitsAllocated <= 8 )
+ if ( BitsAllocated <= 8 )
{
uint8_t *localRGB = RGB;
for (size_t i = 0; i < RawSize; ++i )
nbRead = sscanf( LutRedDescriptor.c_str(),
"%d\\%d\\%d",
&lengthR, &debR, &nbitsR );
- if( nbRead != 3 )
+ if ( nbRead != 3 )
{
gdcmWarningMacro( "Wrong Red LUT descriptor" );
}
nbRead = sscanf( LutGreenDescriptor.c_str(),
"%d\\%d\\%d",
&lengthG, &debG, &nbitsG );
- if( nbRead != 3 )
+ if ( nbRead != 3 )
{
gdcmWarningMacro( "Wrong Green LUT descriptor" );
}
nbRead = sscanf( LutRedDescriptor.c_str(),
"%d\\%d\\%d",
&lengthB, &debB, &nbitsB );
- if( nbRead != 3 )
+ if ( nbRead != 3 )
{
gdcmWarningMacro( "Wrong Blue LUT descriptor" );
}
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;
// -------------------------------------------------------------
- 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)
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
{
unsigned int i;
- if( BitsAllocated == 16 )
+ if ( BitsAllocated == 16 )
{
uint16_t *im16 = (uint16_t*)Raw;
switch( SwapCode )
gdcmWarningMacro("SwapCode value (16 bits) not allowed.");
}
}
- else if( BitsAllocated == 32 )
+ else if ( BitsAllocated == 32 )
{
uint32_t s32;
uint16_t high;
uint16_t *deb = (uint16_t *)Raw;
for(int i = 0; i<l; i++)
{
- if( *deb == 0xffff )
+ if ( *deb == 0xffff )
{
*deb = 0;
}
*/
bool PixelReadConvert::ConvertReArrangeBits() throw ( FormatError )
{
+
if ( BitsStored != BitsAllocated )
{
int l = (int)( RawSize / ( BitsAllocated / 8 ) );
uint16_t *deb = (uint16_t*)Raw;
- if ( !PixelSign )
+ if ( !PixelSign ) // Pixels are unsigned
{
for(int i = 0; i<l; i++)
- {
+ {
*deb = (*deb >> (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<l; i++)
{
*deb = *deb >> (BitsStored - HighBitPosition - 1);
if ( *deb & smask )
+ {
*deb = *deb | nmask;
+ }
else
+ {
*deb = *deb & pmask;
+ }
deb++;
}
}
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<l; i++)
{
//-----------------------------------------------------------------------------
} // end namespace gdcm
-
-// NOTES on File internal calls
-// User
-// ---> GetImageData
-// ---> GetImageDataIntoVector
-// |---> GetImageDataIntoVectorRaw
-// | lut intervention
-// User
-// ---> GetImageDataRaw
-// ---> GetImageDataIntoVectorRaw
-