]> Creatis software - gdcm.git/blobdiff - src/gdcmPixelReadConvert.cxx
Clean code
[gdcm.git] / src / gdcmPixelReadConvert.cxx
index a80e759c4ebf81c7fac2147e4510bb720933e4dd..3d3783f06ee750df514863c1de3d0c774c980ff5 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmPixelReadConvert.cxx,v $
   Language:  C++
-  Date:      $Date: 2006/08/29 15:17:51 $
-  Version:   $Revision: 1.113 $
+  Date:      $Date: 2007/09/04 15:43:38 $
+  Version:   $Revision: 1.121 $
                                                                                 
   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 <mem.h> // for memset
 #endif 
 
-namespace gdcm
+namespace GDCM_NAME_SPACE
 {
 
 //bool ReadMPEGFile (std::ifstream *fp, char *inputdata, size_t lenght); 
@@ -97,11 +97,11 @@ void PixelReadConvert::GrabInformationsFromFile( File *file,
    {
       BitsAllocated = 16;
    }
-   else if (BitsAllocated > 8 && 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();
@@ -170,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;
          } 
@@ -594,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;
    }
 }
@@ -1065,27 +1072,38 @@ bool PixelReadConvert::ConvertReArrangeBits() throw ( FormatError )
       {
          // pmask : to mask the 'unused bits' (may contain overlays)
          uint16_t pmask = 0xffff;
-         pmask = pmask >> ( BitsAllocated - BitsStored );
+         // It's up to the user to decide if he wants to ignore overlays (if any),
+         // not to gdcm, without asking.
+         // default is NOT TO LOAD, in order not to confuse ITK users (and others!).
+
+         if ( !FH->GetKeepOverlays() ) // mask spurious bits ! (overlay are NOT loaded!)
+         {
+            pmask = pmask >> ( BitsAllocated - BitsStored );
+         }
+         // else : it's up to the user to manage the 'pixels + overlays' he just loaded!
 
          uint16_t *deb = (uint16_t*)Raw;
 
          if ( !PixelSign )  // Pixels are unsigned
          {
             for(int i = 0; i<l; i++)
-            {   
-               *deb = (*deb >> (BitsStored - HighBitPosition - 1)) & pmask;
+            {  
+               *deb = (*deb >> (BitsStored - HighBitPosition - 1)) & pmask ;
                deb++;
             }
          }
          else // Pixels are signed
          {
+            // Hope there is never ACR-NEMA-like overlays within signed pixels (?!?)
+
             // smask : to check the 'sign' when BitsStored != BitsAllocated
             uint16_t smask = 0x0001;
             smask = smask << ( 16 - (BitsAllocated - BitsStored + 1) );
             // nmask : to propagate sign bit on negative values
             int16_t nmask = (int16_t)0x8000;  
             nmask = nmask >> ( BitsAllocated - BitsStored - 1 );
+
             for(int i = 0; i<l; i++)
             {
                *deb = *deb >> (BitsStored - HighBitPosition - 1);
@@ -1102,7 +1120,7 @@ bool PixelReadConvert::ConvertReArrangeBits() throw ( FormatError )
          }
       }
       else if ( BitsAllocated == 32 )
-      {
+      { 
          // pmask : to mask the 'unused bits' (may contain overlays)
          uint32_t pmask = 0xffffffff;
          pmask = pmask >> ( BitsAllocated - BitsStored );
@@ -1131,8 +1149,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++;
             }
          }
@@ -1187,9 +1205,9 @@ void PixelReadConvert::ConvertYcBcRPlanesToRGBPixels()
   // except for the few patches of color on the image.
   // On such images, RLE achieves a compression ratio that is much better 
   // than the compression ratio on an equivalent RGB image. 
+
    gdcmWarningMacro("--> ConvertYcBcRPlanesToRGBPixels");
-   
+
    uint8_t *localRaw = Raw;
    uint8_t *copyRaw = new uint8_t[ RawSize ];
    memmove( copyRaw, localRaw, RawSize );
@@ -1199,7 +1217,7 @@ void PixelReadConvert::ConvertYcBcRPlanesToRGBPixels()
    // ftp://medical.nema.org/medical/dicom/final/sup61_ft.pdf
    // and be *very* affraid
    //
-   
+
    /// \todo : find an example to see how 3rd dim and 4th dim work together
    int l        = XSize * YSize * TSize;
    int nbFrames = ZSize;
@@ -1351,7 +1369,10 @@ void PixelReadConvert::ComputeRawAndRGBSizes()
    else
    {
       RGBSize = RawSize;
+      
    }
+   RawSize += RawSize%2;
+   RGBSize += RGBSize%2;
 }
 
 /// Allocates room for RGB Pixels