]> Creatis software - gdcm.git/blobdiff - src/gdcmPixelReadConvert.cxx
To prepare use of progression bar in all types of Document
[gdcm.git] / src / gdcmPixelReadConvert.cxx
index a06da263d07d8d6af1e2088137008ce30c22a1a8..c8c76c22d2f12747c805bd1fa1043d47c88423d7 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmPixelReadConvert.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/11/28 15:20:34 $
-  Version:   $Revision: 1.103 $
+  Date:      $Date: 2005/11/29 17:21:35 $
+  Version:   $Revision: 1.106 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
@@ -82,7 +82,8 @@ bool PixelReadConvert::IsRawRGB()
  * \brief Gets various usefull informations from the file header
  * @param file gdcm::File pointer
  */
-void PixelReadConvert::GrabInformationsFromFile( File *file )
+void PixelReadConvert::GrabInformationsFromFile( File *file, 
+                                                 FileHelper *fileHelper )
 {
    // Number of Bits Allocated for storing a Pixel is defaulted to 16
    // when absent from the file.
@@ -157,7 +158,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;
-            gdcmStaticWarningMacro("Unexpected Transfer Syntax :[" << ts << "]");
+            gdcmWarningMacro("Unexpected Transfer Syntax :[" << ts << "]");
             break;
          } 
       }
@@ -207,7 +208,7 @@ void PixelReadConvert::GrabInformationsFromFile( File *file )
       LutRedData = (uint8_t*)file->GetEntryBinArea( 0x0028, 0x1201 );
       if ( ! LutRedData )
       {
-         gdcmStaticWarningMacro("Unable to read Red Palette Color Lookup Table data");
+         gdcmWarningMacro("Unable to read Red Palette Color Lookup Table data");
       }
 
       // //// Green round:
@@ -215,7 +216,7 @@ void PixelReadConvert::GrabInformationsFromFile( File *file )
       LutGreenData = (uint8_t*)file->GetEntryBinArea(0x0028, 0x1202 );
       if ( ! LutGreenData)
       {
-         gdcmStaticWarningMacro("Unable to read Green Palette Color Lookup Table data");
+         gdcmWarningMacro("Unable to read Green Palette Color Lookup Table data");
       }
 
       // //// Blue round:
@@ -223,11 +224,11 @@ void PixelReadConvert::GrabInformationsFromFile( File *file )
       LutBlueData = (uint8_t*)file->GetEntryBinArea( 0x0028, 0x1203 );
       if ( ! LutBlueData )
       {
-         gdcmStaticWarningMacro("Unable to read Blue Palette Color Lookup Table data");
+         gdcmWarningMacro("Unable to read Blue Palette Color Lookup Table data");
       }
    }
    FileInternal = file;   
-
+   FH = fileHelper;
    ComputeRawAndRGBSizes();
 }
 
@@ -243,22 +244,32 @@ bool PixelReadConvert::ReadAndDecompressPixelData( std::ifstream *fp )
    //// First stage: get our hands on the Pixel Data.
    if ( !fp )
    {
-      gdcmStaticWarningMacro( "Unavailable file pointer." );
+      gdcmWarningMacro( "Unavailable file pointer." );
       return false;
    }
 
    fp->seekg( PixelOffset, std::ios::beg );
    if ( fp->fail() || fp->eof() )
    {
-      gdcmStaticWarningMacro( "Unable to find PixelOffset in file." );
+      gdcmWarningMacro( "Unable to find PixelOffset in file." );
       return false;
    }
 
    AllocateRaw();
 
    //////////////////////////////////////////////////
+   
+   CallStartMethod(); // for progress bar
+   unsigned int count = 0;
+   unsigned int frameSize;
+   unsigned int bitsAllocated = BitsAllocated;
+   if(bitsAllocated == 12)
+      bitsAllocated = 16;
+   frameSize = XSize*YSize*SamplesPerPixel*bitsAllocated/8;
+   
    //// Second stage: read from disk and decompress.
-   if ( BitsAllocated == 12 )
+   
+   if ( BitsAllocated == 12 ) // We suppose 'BitsAllocated' = 12 only exist for uncompressed files
    {
       ReadAndDecompress12BitsTo16Bits( fp);
    }
@@ -270,21 +281,45 @@ bool PixelReadConvert::ReadAndDecompressPixelData( std::ifstream *fp )
       // variable). But RawSize is the right size of the image !
       if ( PixelDataLength != RawSize )
       {
-         gdcmStaticWarningMacro( "Mismatch between PixelReadConvert : "
+         gdcmWarningMacro( "Mismatch between PixelReadConvert : "
                               << PixelDataLength << " and RawSize : " << RawSize );
       }
+      
+      //todo : is it the right patch?
+      char *raw = (char*)Raw;
+      uint32_t remainingLength;
+      unsigned int i; 
+      unsigned int lengthToRead;
+       
       if ( PixelDataLength > RawSize )
-      {
-         fp->read( (char*)Raw, RawSize);
-      }
+        lengthToRead =  RawSize;
       else
+        lengthToRead = PixelDataLength;
+      // perform a frame by frame reading
+      remainingLength = lengthToRead;
+      unsigned int nbFrames = lengthToRead / frameSize;
+      for (i=0;i<nbFrames; i++)
       {
-         fp->read( (char*)Raw, PixelDataLength);
+         fp->read( raw, frameSize);
+         raw +=  frameSize;
+         remainingLength -=  frameSize;
       }
+      if (remainingLength !=0 )
+        fp->read( raw, remainingLength);
+                 
+      //if ( PixelDataLength > RawSize )
+      //{
+      //   fp->read( (char*)Raw, RawSize); // Read all the frames with a single fread    
+      //}
+      //else
+      //{
+      //   fp->read( (char*)Raw, PixelDataLength); // Read all the frames with a single fread
+      //}
 
       if ( fp->fail() || fp->eof())
       {
-         gdcmStaticWarningMacro( "Reading of Raw pixel data failed." );
+         gdcmWarningMacro( "Reading of Raw pixel data failed." );
          return false;
       }
    } 
@@ -293,13 +328,13 @@ bool PixelReadConvert::ReadAndDecompressPixelData( std::ifstream *fp )
       if ( ! RLEInfo->DecompressRLEFile
                                ( fp, Raw, XSize, YSize, ZSize, BitsAllocated ) )
       {
-         gdcmStaticWarningMacro( "RLE decompressor failed." );
+         gdcmWarningMacro( "RLE decompressor failed." );
          return false;
       }
    }
    else if ( IsMPEG )
    {
-      //gdcmStaticWarningMacro( "Sorry, MPEG not yet taken into account" );
+      //gdcmWarningMacro( "Sorry, MPEG not yet taken into account" );
       //return false;
       // fp has already been seek to start of mpeg
       //ReadMPEGFile(fp, (char*)Raw, PixelDataLength); 
@@ -310,7 +345,7 @@ bool PixelReadConvert::ReadAndDecompressPixelData( std::ifstream *fp )
       // Default case concerns JPEG family
       if ( ! ReadAndDecompressJPEGFile( fp ) )
       {
-         gdcmStaticWarningMacro( "JPEG decompressor ( ReadAndDecompressJPEGFile()"
+         gdcmWarningMacro( "JPEG decompressor ( ReadAndDecompressJPEGFile()"
                               << " method ) failed." );
          return false;
       }
@@ -368,7 +403,7 @@ bool PixelReadConvert::BuildRGBImage()
       return false;
    }
 
-   gdcmStaticDebugMacro( "--> BuildRGBImage" );
+   gdcmDebugMacro( "--> BuildRGBImage" );
                                                                                 
    // Build RGB Pixels
    AllocateRGB();
@@ -477,7 +512,7 @@ bool PixelReadConvert::ReadAndDecompressJPEGFile( std::ifstream *fp )
          inputlength += jpegfrag->GetLength();
          jpegfrag = JPEGInfo->GetNextFragment();
       }
-      gdcmStaticAssertMacro( inputlength != 0);
+      gdcmAssertMacro( inputlength != 0);
       uint8_t *inputdata = new uint8_t[inputlength];
       char *pinputdata = (char*)inputdata;
       jpegfrag = JPEGInfo->GetFirstFragment();
@@ -495,7 +530,7 @@ bool PixelReadConvert::ReadAndDecompressJPEGFile( std::ifstream *fp )
          return true;
       }
       // wow what happen, must be an error
-      gdcmStaticWarningMacro( "gdcm_read_JPEG2000_file() failed "); 
+      gdcmWarningMacro( "gdcm_read_JPEG2000_file() failed "); 
       return false;
    }
    else if ( IsJPEGLS )
@@ -519,7 +554,7 @@ bool PixelReadConvert::ReadAndDecompressJPEGFile( std::ifstream *fp )
          inputlength += jpegfrag->GetLength();
          jpegfrag = JPEGInfo->GetNextFragment();
       }
-      gdcmStaticAssertMacro( inputlength != 0);
+      gdcmAssertMacro( inputlength != 0);
       uint8_t *inputdata = new uint8_t[inputlength];
       char *pinputdata = (char*)inputdata;
       jpegfrag = JPEGInfo->GetFirstFragment();
@@ -539,7 +574,7 @@ bool PixelReadConvert::ReadAndDecompressJPEGFile( std::ifstream *fp )
   delete[] inputdata;
 #endif
 
-      gdcmStaticWarningMacro( "Sorry, JPEG-LS not yet taken into account" );
+      gdcmWarningMacro( "Sorry, JPEG-LS not yet taken into account" );
       fp->seekg( JPEGInfo->GetFirstFragment()->GetOffset(), std::ios::beg);
 //    if ( ! gdcm_read_JPEGLS_file( fp,Raw ) )
          return false;
@@ -598,7 +633,7 @@ void PixelReadConvert::BuildLUTRGBA()
        || LutGreenDescriptor == GDCM_UNFOUND
        || LutBlueDescriptor  == GDCM_UNFOUND )
    {
-      gdcmStaticWarningMacro( "(At least) a LUT Descriptor is missing" );
+      gdcmWarningMacro( "(At least) a LUT Descriptor is missing" );
       return;
    }
 
@@ -614,7 +649,7 @@ void PixelReadConvert::BuildLUTRGBA()
                         &lengthR, &debR, &nbitsR );
    if ( nbRead != 3 )
    {
-      gdcmStaticWarningMacro( "Wrong Red LUT descriptor" );
+      gdcmWarningMacro( "Wrong Red LUT descriptor" );
    }                                                                                
    int lengthG;  // Green LUT length in Bytes
    int debG;     // Subscript of the first Lut Value
@@ -625,7 +660,7 @@ void PixelReadConvert::BuildLUTRGBA()
                     &lengthG, &debG, &nbitsG );  
    if ( nbRead != 3 )
    {
-      gdcmStaticWarningMacro( "Wrong Green LUT descriptor" );
+      gdcmWarningMacro( "Wrong Green LUT descriptor" );
    }
                                                                                 
    int lengthB;  // Blue LUT length in Bytes
@@ -636,15 +671,15 @@ void PixelReadConvert::BuildLUTRGBA()
                     &lengthB, &debB, &nbitsB );
    if ( nbRead != 3 )
    {
-      gdcmStaticWarningMacro( "Wrong Blue LUT descriptor" );
+      gdcmWarningMacro( "Wrong Blue LUT descriptor" );
    }
  
-   gdcmStaticDebugMacro(" lengthR " << lengthR << " debR " 
-                      << debR << " nbitsR " << nbitsR);
-   gdcmStaticDebugMacro(" lengthG " << lengthG << " debG " 
-                      << debG << " nbitsG " << nbitsG);
-   gdcmStaticDebugMacro(" lengthB " << lengthB << " debB " 
-                      << debB << " nbitsB " << nbitsB);
+   gdcmDebugMacro(" lengthR " << lengthR << " debR " 
+                << debR << " nbitsR " << nbitsR);
+   gdcmDebugMacro(" lengthG " << lengthG << " debG " 
+                << debG << " nbitsG " << nbitsG);
+   gdcmDebugMacro(" lengthB " << lengthB << " debB " 
+                << debB << " nbitsB " << nbitsB);
 
    if ( !lengthR ) // if = 2^16, this shall be 0 see : CP-143
       lengthR=65536;
@@ -657,7 +692,7 @@ void PixelReadConvert::BuildLUTRGBA()
 
    if ( ( ! LutRedData ) || ( ! LutGreenData ) || ( ! LutBlueData ) )
    {
-      gdcmStaticWarningMacro( "(At least) a LUT is missing" );
+      gdcmWarningMacro( "(At least) a LUT is missing" );
       return;
    }
 
@@ -735,7 +770,7 @@ void PixelReadConvert::BuildLUTRGBA()
       // with 65536 entries LUT ?!?
       // Still looking for accurate info on the web :-(
 
-      gdcmStaticWarningMacro( "Sorry Palette Color Lookup Tables not yet dealt with"
+      gdcmWarningMacro( "Sorry Palette Color Lookup Tables not yet dealt with"
                          << " for 16 Bits Per Pixel images" );
 
       // forge the 4 * 16 Bits Red/Green/Blue/Alpha LUT
@@ -860,7 +895,7 @@ void PixelReadConvert::ConvertSwapZone()
             }
             break;
          default:
-            gdcmStaticWarningMacro("SwapCode value (16 bits) not allowed." 
+            gdcmWarningMacro("SwapCode value (16 bits) not allowed." 
                         << tempSwapCode);
       }
    }
@@ -906,7 +941,7 @@ void PixelReadConvert::ConvertSwapZone()
             }
             break;
          default:
-            gdcmStaticWarningMacro("SwapCode value (32 bits) not allowed." << tempSwapCode );
+            gdcmWarningMacro("SwapCode value (32 bits) not allowed." << tempSwapCode );
       }
    }
 }
@@ -1096,7 +1131,7 @@ bool PixelReadConvert::ConvertReArrangeBits() throw ( FormatError )
       }
       else
       {
-         gdcmStaticWarningMacro("Weird image (BitsAllocated !=8, 12, 16, 32)");
+         gdcmWarningMacro("Weird image (BitsAllocated !=8, 12, 16, 32)");
          throw FormatError( "Weird image !?" );
       }
    }
@@ -1109,7 +1144,7 @@ bool PixelReadConvert::ConvertReArrangeBits() throw ( FormatError )
  */
 void PixelReadConvert::ConvertRGBPlanesToRGBPixels()
 {
-   gdcmStaticWarningMacro("--> ConvertRGBPlanesToRGBPixels");
+   gdcmWarningMacro("--> ConvertRGBPlanesToRGBPixels");
 
    uint8_t *localRaw = Raw;
    uint8_t *copyRaw = new uint8_t[ RawSize ];
@@ -1145,7 +1180,7 @@ void PixelReadConvert::ConvertYcBcRPlanesToRGBPixels()
   // On such images, RLE achieves a compression ratio that is much better 
   // than the compression ratio on an equivalent RGB image. 
  
-   gdcmStaticWarningMacro("--> ConvertYcBcRPlanesToRGBPixels");
+   gdcmWarningMacro("--> ConvertYcBcRPlanesToRGBPixels");
    
    uint8_t *localRaw = Raw;
    uint8_t *copyRaw = new uint8_t[ RawSize ];
@@ -1245,13 +1280,13 @@ void PixelReadConvert::ConvertHandleColor()
    // - [Planar 1] AND [Photo C] handled with ConvertYcBcRPlanesToRGBPixels()
    // - [Planar 2] OR  [Photo D] requires LUT intervention.
 
-   gdcmStaticDebugMacro("--> ConvertHandleColor "
+   gdcmDebugMacro("--> ConvertHandleColor "
                      << "Planar Configuration " << PlanarConfiguration );
 
    if ( ! IsRawRGB() )
    {
       // [Planar 2] OR  [Photo D]: LUT intervention done outside
-      gdcmStaticDebugMacro("--> RawRGB : LUT intervention done outside");
+      gdcmDebugMacro("--> RawRGB : LUT intervention done outside");
       return;
    }
                                                                                 
@@ -1260,13 +1295,13 @@ void PixelReadConvert::ConvertHandleColor()
       if ( IsYBRFull )
       {
          // [Planar 1] AND [Photo C] (remember YBR_FULL_422 acts as RGB)
-         gdcmStaticDebugMacro("--> YBRFull");
+         gdcmDebugMacro("--> YBRFull");
          ConvertYcBcRPlanesToRGBPixels();
       }
       else
       {
          // [Planar 1] AND [Photo C]
-         gdcmStaticDebugMacro("--> YBRFull");
+         gdcmDebugMacro("--> YBRFull");
          ConvertRGBPlanesToRGBPixels();
       }
       return;
@@ -1277,7 +1312,7 @@ void PixelReadConvert::ConvertHandleColor()
 
    if (IsRLELossless)
    { 
-     gdcmStaticDebugMacro("--> RLE Lossless");
+     gdcmDebugMacro("--> RLE Lossless");
      ConvertRGBPlanesToRGBPixels();
    }
 
@@ -1352,7 +1387,7 @@ void PixelReadConvert::Print( std::ostream &os, std::string const &indent )
       }
       else
       {
-         gdcmStaticWarningMacro("Set as RLE file but NO RLEinfo present.");
+         gdcmWarningMacro("Set as RLE file but NO RLEinfo present.");
       }
    }
 
@@ -1364,11 +1399,39 @@ void PixelReadConvert::Print( std::ostream &os, std::string const &indent )
       }
       else
       {
-         gdcmStaticWarningMacro("Set as JPEG file but NO JPEGinfo present.");
+         gdcmWarningMacro("Set as JPEG file but NO JPEGinfo present.");
       }
    }
 }
 
+/**
+ * \brief   CallStartMethod
+ */
+void PixelReadConvert::CallStartMethod()
+{
+   Progress = 0.0f;
+   Abort    = false;
+   CommandManager::ExecuteCommand(FH,CMD_STARTPROGRESS);
+}
+
+/**
+ * \brief   CallProgressMethod
+ */
+void PixelReadConvert::CallProgressMethod()
+{
+   CommandManager::ExecuteCommand(FH,CMD_PROGRESS);
+}
+
+/**
+ * \brief   CallEndMethod
+ */
+void PixelReadConvert::CallEndMethod()
+{
+   Progress = 1.0f;
+   CommandManager::ExecuteCommand(FH,CMD_ENDPROGRESS);
+}
+
+
 //-----------------------------------------------------------------------------
 } // end namespace gdcm