/*=========================================================================
-
+
Program: gdcm
Module: $RCSfile: gdcmPixelReadConvert.cxx,v $
Language: C++
- Date: $Date: 2005/06/22 08:04:34 $
- Version: $Revision: 1.71 $
+ 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();
}
{
//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;
*/
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
-