]> Creatis software - gdcm.git/blobdiff - src/gdcmPixelReadConvert.cxx
Two ;; at end of line can cause troubles
[gdcm.git] / src / gdcmPixelReadConvert.cxx
index da84491d2de7e0aa883111dd5c0636ff0549a5ff..3e4a1e346c8b0db4cc26618b18ec9bc0e4759363 100644 (file)
@@ -1,10 +1,10 @@
 /*=========================================================================
-
   Program:   gdcm
   Module:    $RCSfile: gdcmPixelReadConvert.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/06/22 08:04:34 $
-  Version:   $Revision: 1.71 $
+  Date:      $Date: 2005/09/07 14:12:23 $
+  Version:   $Revision: 1.77 $
                                                                                 
   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,10 @@ PixelReadConvert::PixelReadConvert()
    LutRedData   = 0;
    LutGreenData = 0;
    LutBlueData  = 0;
+   RLEInfo      = 0;
+   JPEGInfo     = 0;
+   UserFunction = 0;
+   FileInternal = 0;
 }
 
 /// Canonical Destructor
@@ -107,7 +111,7 @@ void PixelReadConvert::GrabInformationsFromFile( File *file )
    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();
@@ -186,6 +190,7 @@ void PixelReadConvert::GrabInformationsFromFile( File *file )
          gdcmWarningMacro( "Unable to read Blue Palette Color Lookup Table data" );
       }
    }
+   FileInternal = file;   
 
    ComputeRawAndRGBSizes();
 }
@@ -259,7 +264,8 @@ bool PixelReadConvert::ReadAndDecompressPixelData( std::ifstream *fp )
    {
       //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
@@ -277,6 +283,8 @@ bool PixelReadConvert::ReadAndDecompressPixelData( std::ifstream *fp )
    ConvertReorderEndianity();
    ConvertReArrangeBits();
    ConvertFixGreyLevels();
+   if (UserFunction) // user is allowed to Mirror, TopDown, Rotate,...the image
+      UserFunction( Raw, FileInternal);
    ConvertHandleColor();
 
    return true;
@@ -914,6 +922,7 @@ void PixelReadConvert::ConvertFixGreyLevels()
  */
 bool PixelReadConvert::ConvertReArrangeBits() throw ( FormatError )
 {
+
    if ( BitsStored != BitsAllocated )
    {
       int l = (int)( RawSize / ( BitsAllocated / 8 ) );
@@ -925,30 +934,34 @@ bool PixelReadConvert::ConvertReArrangeBits() throw ( FormatError )
 
          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 );
             for(int i = 0; i<l; i++)
             {
                *deb = *deb >> (BitsStored - HighBitPosition - 1);
                if ( *deb & smask )
+               {
                   *deb = *deb | nmask;
+               }
                else
+               {
                   *deb = *deb & pmask;
+               }
                deb++;
             }
          }
@@ -972,11 +985,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<l; i++)
             {
@@ -1266,14 +1279,3 @@ void PixelReadConvert::Print( std::ostream &os, std::string const &indent )
 
 //-----------------------------------------------------------------------------
 } // end namespace gdcm
-
-// NOTES on File internal calls
-// User
-// ---> GetImageData
-//     ---> GetImageDataIntoVector
-//        |---> GetImageDataIntoVectorRaw
-//        | lut intervention
-// User
-// ---> GetImageDataRaw
-//     ---> GetImageDataIntoVectorRaw
-