]> Creatis software - gdcm.git/blobdiff - src/gdcmPixelReadConvert.cxx
Doxygenation
[gdcm.git] / src / gdcmPixelReadConvert.cxx
index 05402379a28fcb91a477ae52f2eb5262112abaf0..fc73af9c4fd1ee2106ffdd3108c5407fd235f659 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmPixelReadConvert.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/10/13 07:14:45 $
-  Version:   $Revision: 1.78 $
+  Date:      $Date: 2005/10/20 09:17:54 $
+  Version:   $Revision: 1.82 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -118,10 +118,13 @@ void PixelReadConvert::GrabInformationsFromFile( File *file )
    IsRaw =
         ( ! file->IsDicomV3() )
      || Global::GetTS()->GetSpecialTransferSyntax(ts) == TS::ImplicitVRLittleEndian
-     || Global::GetTS()->GetSpecialTransferSyntax(ts) == TS::ImplicitVRLittleEndianDLXGE
+     || Global::GetTS()->GetSpecialTransferSyntax(ts) == TS::ImplicitVRBigEndianPrivateGE
      || Global::GetTS()->GetSpecialTransferSyntax(ts) == TS::ExplicitVRLittleEndian
      || Global::GetTS()->GetSpecialTransferSyntax(ts) == TS::ExplicitVRBigEndian
      || Global::GetTS()->GetSpecialTransferSyntax(ts) == TS::DeflatedExplicitVRLittleEndian;
+     
+   IsPrivateGETransferSyntax = 
+                ( Global::GetTS()->GetSpecialTransferSyntax(ts) == TS::ImplicitVRBigEndianPrivateGE );
 
    IsMPEG          = Global::GetTS()->IsMPEG(ts);
    IsJPEG2000      = Global::GetTS()->IsJPEG2000(ts);
@@ -148,9 +151,9 @@ void PixelReadConvert::GrabInformationsFromFile( File *file )
    if ( HasLUT )
    {
       // Just in case some access to a File element requires disk access.
-      LutRedDescriptor   = file->GetEntryValue( 0x0028, 0x1101 );
-      LutGreenDescriptor = file->GetEntryValue( 0x0028, 0x1102 );
-      LutBlueDescriptor  = file->GetEntryValue( 0x0028, 0x1103 );
+      LutRedDescriptor   = file->GetEntryString( 0x0028, 0x1101 );
+      LutGreenDescriptor = file->GetEntryString( 0x0028, 0x1102 );
+      LutBlueDescriptor  = file->GetEntryString( 0x0028, 0x1103 );
    
       // The following comment is probabely meaningless, since LUT are *always*
       // loaded at parsing time, whatever their length is.
@@ -164,7 +167,7 @@ void PixelReadConvert::GrabInformationsFromFile( File *file )
       // \TODO Reading a [Bin|Val]Entry directly from disk is a kludge.
       //       We should NOT bypass the [Bin|Val]Entry class. Instead
       //       an access to an UNLOADED content of a [Bin|Val]Entry occurence
-      //       (e.g. BinEntry::GetBinArea()) should force disk access from
+      //       (e.g. DataEntry::GetBinArea()) should force disk access from
       //       within the [Bin|Val]Entry class itself. The only problem
       //       is that the [Bin|Val]Entry is unaware of the FILE* is was
       //       parsed from. Fix that. FIXME.
@@ -174,7 +177,7 @@ void PixelReadConvert::GrabInformationsFromFile( File *file )
       LutRedData = (uint8_t*)file->GetEntryBinArea( 0x0028, 0x1201 );
       if ( ! LutRedData )
       {
-         gdcmWarningMacro( "Unable to read Red Palette Color Lookup Table data" );
+         gdcmWarningMacro("Unable to read Red Palette Color Lookup Table data");
       }
 
       // //// Green round:
@@ -182,7 +185,7 @@ void PixelReadConvert::GrabInformationsFromFile( File *file )
       LutGreenData = (uint8_t*)file->GetEntryBinArea(0x0028, 0x1202 );
       if ( ! LutGreenData)
       {
-         gdcmWarningMacro( "Unable to read Green Palette Color Lookup Table data" );
+         gdcmWarningMacro("Unable to read Green Palette Color Lookup Table data");
       }
 
       // //// Blue round:
@@ -190,7 +193,7 @@ void PixelReadConvert::GrabInformationsFromFile( File *file )
       LutBlueData = (uint8_t*)file->GetEntryBinArea( 0x0028, 0x1203 );
       if ( ! LutBlueData )
       {
-         gdcmWarningMacro( "Unable to read Blue Palette Color Lookup Table data" );
+         gdcmWarningMacro("Unable to read Blue Palette Color Lookup Table data");
       }
    }
    FileInternal = file;   
@@ -238,7 +241,7 @@ bool PixelReadConvert::ReadAndDecompressPixelData( std::ifstream *fp )
       if ( PixelDataLength != RawSize )
       {
          gdcmWarningMacro( "Mismatch between PixelReadConvert : "
-                            << PixelDataLength << " and RawSize : " << RawSize );
+                          << PixelDataLength << " and RawSize : " << RawSize );
       }
       if ( PixelDataLength > RawSize )
       {
@@ -257,7 +260,8 @@ bool PixelReadConvert::ReadAndDecompressPixelData( std::ifstream *fp )
    } 
    else if ( IsRLELossless )
    {
-      if ( ! RLEInfo->DecompressRLEFile( fp, Raw, XSize, YSize, ZSize, BitsAllocated ) )
+      if ( ! RLEInfo->DecompressRLEFile
+                               ( fp, Raw, XSize, YSize, ZSize, BitsAllocated ) )
       {
          gdcmWarningMacro( "RLE decompressor failed." );
          return false;
@@ -743,6 +747,7 @@ void PixelReadConvert::BuildLUTRGBA()
          a16 += 4;
       }
 /* Just to 'see' the LUT, at debug time
+// Don't remove this commented out code.
 
       a16=(uint16_t*)LutRGBA;
       for (int j=0;j<65536;j++)
@@ -761,11 +766,53 @@ void PixelReadConvert::BuildLUTRGBA()
 void PixelReadConvert::ConvertSwapZone()
 {
    unsigned int i;
-
+   uint16_t localSwapCode = SwapCode;
+   
+   // If this file is 'ImplicitVR BigEndian PrivateGE Transfer Syntax', 
+   // then the header is in little endian format and the pixel data is in 
+   // big endian format.  When reading the header, GDCM has already established
+   // a byte swapping code suitable for this machine to read the
+   // header. In TS::ImplicitVRBigEndianPrivateGE, this code will need
+   // to be switched in order to read the pixel data.  This must be
+   // done REGARDLESS of the processor endianess!
+   //
+   // Example:  Assume we are on a little endian machine.  When
+   // GDCM reads the header, the header will match the machine
+   // endianess and the swap code will be established as a no-op.
+   // When GDCM reaches the pixel data, it will need to switch the
+   // swap code to do big endian to little endian conversion.
+   //
+   // Now, assume we are on a big endian machine.  When GDCM reads the
+   // header, the header will be recognized as a different endianess
+   // than the machine endianess, and a swap code will be established
+   // to convert from little endian to big endian.  When GDCM readers
+   // the pixel data, the pixel data endianess will now match the
+   // machine endianess.  But we currently have a swap code that
+   // converts from little endian to big endian.  In this case, we
+   // need to switch the swap code to a no-op.
+   //
+   // Therefore, in either case, if the file is in
+   // 'ImplicitVR BigEndian PrivateGE Transfer Syntax', then GDCM needs to switch
+   // the byte swapping code when entering the pixel data.
+    
+   if ( IsPrivateGETransferSyntax )
+   {
+      // PrivateGETransferSyntax only exists for 'true' Dicom images
+      // we assume there is no 'exotic' 32 bits endianess!
+      switch (localSwapCode)
+      {
+         case 1234:
+            localSwapCode = 4321;
+            break;
+         case 4321:
+            localSwapCode = 1234;
+            break;
+      }  
+   }
    if ( BitsAllocated == 16 )
    {
       uint16_t *im16 = (uint16_t*)Raw;
-      switch( SwapCode )
+      switch( localSwapCode )
       {
          case 1234:
             break;
@@ -787,7 +834,7 @@ void PixelReadConvert::ConvertSwapZone()
       uint16_t high;
       uint16_t low;
       uint32_t *im32 = (uint32_t*)Raw;
-      switch ( SwapCode )
+      switch ( localSwapCode )
       {
          case 1234:
             break;