]> Creatis software - gdcm.git/blobdiff - src/gdcmParsePixels.cxx
2004-10-18 Eric Boix <Eric.Boix@creatis.insa-lyon.fr>
[gdcm.git] / src / gdcmParsePixels.cxx
index c95b825f5cf1c0b491b5918b145e2c70d6bebf8f..477ec99f6b80f7c2085e562f761f56cd19bef83b 100644 (file)
@@ -1,13 +1,32 @@
-// gdcmParse.cxx
-//-----------------------------------------------------------------------------
+/*=========================================================================
+                                                                                
+  Program:   gdcm
+  Module:    $RCSfile: gdcmParsePixels.cxx,v $
+  Language:  C++
+  Date:      $Date: 2004/10/12 04:35:46 $
+  Version:   $Revision: 1.12 $
+                                                                                
+  Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
+  l'Image). All rights reserved. See Doc/License.txt or
+  http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
+                                                                                
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+                                                                                
+=========================================================================*/
+
 #include "gdcmCommon.h"
 #include "gdcmFile.h"
 
+namespace gdcm 
+{
+
 #define str2num(str, typeNum) *((typeNum *)(str))
 
 //-----------------------------------------------------------------------------
 /**
- * \ingroup gdcmFile
+ * \ingroup File
  * \brief   Parse pixel data from disk and *prints* the result
  * \        For multi-fragment Jpeg/Rle files checking purpose *only*
  * \        Allows to 'see' if the file *does* conform
  * \        with Dicom Part 3, Annex A (PS 3.5-2003, page 58, page 85)
  *
  */
-bool gdcmFile::ParsePixelData(void) {
+bool File::ParsePixelData(void) {
 // DO NOT remove the printf s.
 // The ONLY purpose of this method is to PRINT the content
-   FILE *fp;
+   FILEfp;
 
-   if ( !(fp=Header->OpenFile()))
+   if ( !(fp=GetHeader()->OpenFile()))
       return false;
       
-    if ( fseek(fp, Header->GetPixelOffset(), SEEK_SET) == -1 ) {
-      Header->CloseFile();
+    if ( fseek(fp, GetHeader()->GetPixelOffset(), SEEK_SET) == -1 ) {
+      GetHeader()->CloseFile();
       return false;
    } 
    
-   if ( !Header->IsDicomV3()                             ||
-        Header->IsImplicitVRLittleEndianTransferSyntax() ||
-        Header->IsExplicitVRLittleEndianTransferSyntax() ||
-        Header->IsExplicitVRBigEndianTransferSyntax()    ||
-        Header->IsDeflatedExplicitVRLittleEndianTransferSyntax() ) { 
+   if ( !GetHeader()->IsDicomV3()                             ||
+        GetHeader()->IsImplicitVRLittleEndianTransferSyntax() ||
+        GetHeader()->IsExplicitVRLittleEndianTransferSyntax() ||
+        GetHeader()->IsExplicitVRBigEndianTransferSyntax()    ||
+        GetHeader()->IsDeflatedExplicitVRLittleEndianTransferSyntax() ) { 
         
-        printf ("gdcmFile::ParsePixelData : non JPEG/RLE File\n");
+        printf ("File::ParsePixelData : non JPEG/RLE File\n");
         return false;       
    }        
 
    int nb;
-   std::string str_nb=Header->GetEntryByNumber(0x0028,0x0100);
+   std::string str_nb=GetHeader()->GetEntryByNumber(0x0028,0x0100);
    if (str_nb == GDCM_UNFOUND ) {
       nb = 16;
    } else {
       nb = atoi(str_nb.c_str() );
       if (nb == 12) nb =16;
    }
-   int nBytes= nb/8;
+   //int nBytes= nb/8;   //FIXME
       
-   int taille = Header->GetXSize() * Header->GetYSize() * Header->GetSamplesPerPixel(); 
+   //int taille = GetHeader()->GetXSize() * GetHeader()->GetYSize() * GetHeader()->GetSamplesPerPixel(); 
          
    printf ("Checking the Dicom-encapsulated Jpeg/RLE Pixels\n");
       
-   guint16 ItemTagGr,ItemTagEl; 
+   uint16_t ItemTagGr,ItemTagEl; 
    int ln;
    long ftellRes;
-   char * destination = NULL;
+   //char * destination = NULL;
 
   // -------------------- for Parsing : Position on begining of Jpeg/RLE Pixels 
 
-   if( !Header->IsRLELossLessTransferSyntax()) {
+   if( !GetHeader()->IsRLELossLessTransferSyntax()) {
 
       // JPEG Image
       ftellRes=ftell(fp);
       fread(&ItemTagGr,2,1,fp);  //Reading (fffe):Basic Offset Table Item Tag Gr
       fread(&ItemTagEl,2,1,fp);  //Reading (e000):Basic Offset Table Item Tag El
-      if(Header->GetSwapCode()) {
-         ItemTagGr=Header->SwapShort(ItemTagGr); 
-         ItemTagEl=Header->SwapShort(ItemTagEl);            
+      if(GetHeader()->GetSwapCode()) {
+         ItemTagGr=GetHeader()->SwapShort(ItemTagGr); 
+         ItemTagEl=GetHeader()->SwapShort(ItemTagEl);            
       }
       printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
-                ftellRes,ItemTagGr,ItemTagEl );
+                (unsigned)ftellRes,ItemTagGr,ItemTagEl );
       ftellRes=ftell(fp);
       fread(&ln,4,1,fp); 
-      if(Header->GetSwapCode()) 
-         ln=Header->SwapLong(ln);    // Basic Offset Table Item Length
-      printf("at %x : Basic Offset Table Item Length (??) %d x(%08x)\n",
-            ftellRes,ln,ln);
+      if(GetHeader()->GetSwapCode()) 
+         ln=GetHeader()->SwapLong(ln);    // Basic Offset Table Item Length
+      printf("at %x : Basic Offset Table Item Length (\?\?) %d x(%08x)\n",
+            (unsigned)ftellRes,ln,ln);
       if (ln != 0) {
          // What is it used for ??
-         char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
+         char * BasicOffsetTableItemValue= new char[ln+1];
          fread(BasicOffsetTableItemValue,ln,1,fp); 
-         guint32 a;
+         uint32_t a;
          for (int i=0;i<ln;i+=4){
-            a=str2num(&BasicOffsetTableItemValue[i],guint32);
+            a=str2num(&BasicOffsetTableItemValue[i],uint32_t);
             printf("      x(%08x)  %d\n",a,a);
          }              
       }
@@ -91,21 +110,21 @@ bool gdcmFile::ParsePixelData(void) {
       ftellRes=ftell(fp);
       fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
       fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
-      if(Header->GetSwapCode()) {
-         ItemTagGr=Header->SwapShort(ItemTagGr); 
-         ItemTagEl=Header->SwapShort(ItemTagEl);            
+      if(GetHeader()->GetSwapCode()) {
+         ItemTagGr=GetHeader()->SwapShort(ItemTagGr); 
+         ItemTagEl=GetHeader()->SwapShort(ItemTagEl);            
       }  
       printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
-            ftellRes,ItemTagGr,ItemTagEl );
+            (unsigned)ftellRes,ItemTagGr,ItemTagEl );
       
       while ( ( ItemTagGr==0xfffe) && (ItemTagEl!=0xe0dd) ) { // Parse fragments
       
          ftellRes=ftell(fp);
          fread(&ln,4,1,fp); 
-         if(Header->GetSwapCode()) 
-            ln=Header->SwapLong(ln);    // length
+         if(GetHeader()->GetSwapCode()) 
+            ln=GetHeader()->SwapLong(ln);    // length
          printf("      at %x : fragment length %d x(%08x)\n",
-                ftellRes, ln,ln);
+                (unsigned)ftellRes, ln,ln);
 
         // destination += taille * nBytes; // location in user's memory        
         //printf ("      Destination will be x(%x) = %d \n",
@@ -118,45 +137,45 @@ bool gdcmFile::ParsePixelData(void) {
          ftellRes=ftell(fp);
          fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
          fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
-         if(Header->GetSwapCode()) {
-            ItemTagGr=Header->SwapShort(ItemTagGr); 
-            ItemTagEl=Header->SwapShort(ItemTagEl);            
+         if(GetHeader()->GetSwapCode()) {
+            ItemTagGr=GetHeader()->SwapShort(ItemTagGr); 
+            ItemTagEl=GetHeader()->SwapShort(ItemTagEl);            
          }
          printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
-               ftellRes,ItemTagGr,ItemTagEl );
+               (unsigned)ftellRes,ItemTagGr,ItemTagEl );
       } 
 
    } else {
 
       // RLE Image
       long RleSegmentLength[15],fragmentLength;
-      guint32 nbRleSegments;
-      guint32 RleSegmentOffsetTable[15];
+      uint32_t nbRleSegments;
+      uint32_t RleSegmentOffsetTable[15];
       ftellRes=ftell(fp);
       // Basic Offset Table with Item Value
          // Item Tag
       fread(&ItemTagGr,2,1,fp);  //Reading (fffe):Basic Offset Table Item Tag Gr
       fread(&ItemTagEl,2,1,fp);  //Reading (e000):Basic Offset Table Item Tag El
-      if(Header->GetSwapCode()) {
-         ItemTagGr=Header->SwapShort(ItemTagGr); 
-         ItemTagEl=Header->SwapShort(ItemTagEl);            
+      if(GetHeader()->GetSwapCode()) {
+         ItemTagGr=GetHeader()->SwapShort(ItemTagGr); 
+         ItemTagEl=GetHeader()->SwapShort(ItemTagEl);            
       }
       printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n",
-                ftellRes,ItemTagGr,ItemTagEl );
+                (unsigned)ftellRes,ItemTagGr,ItemTagEl );
          // Item Length
       ftellRes=ftell(fp);
       fread(&ln,4,1,fp); 
-      if(Header->GetSwapCode()) 
-         ln=Header->SwapLong(ln);    // Basic Offset Table Item Length
-      printf("at %x : Basic Offset Table Item Length (??) %d x(%08x)\n",
-            ftellRes,ln,ln);
+      if(GetHeader()->GetSwapCode()) 
+         ln=GetHeader()->SwapLong(ln);    // Basic Offset Table Item Length
+      printf("at %x : Basic Offset Table Item Length (\?\?) %d x(%08x)\n",
+            (unsigned)ftellRes,ln,ln);
       if (ln != 0) {
          // What is it used for ??
-         char * BasicOffsetTableItemValue= (char *)malloc(ln+1);
+         char * BasicOffsetTableItemValue= new char[ln+1];
          fread(BasicOffsetTableItemValue,ln,1,fp); 
-         guint32 a;
+         uint32_t a;
          for (int i=0;i<ln;i+=4){
-            a=str2num(&BasicOffsetTableItemValue[i],guint32);
+            a=str2num(&BasicOffsetTableItemValue[i],uint32_t);
             printf("      x(%08x)  %d\n",a,a);
          }              
       }
@@ -164,47 +183,47 @@ bool gdcmFile::ParsePixelData(void) {
       ftellRes=ftell(fp);
       fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
       fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
-      if(Header->GetSwapCode()) {
-         ItemTagGr=Header->SwapShort(ItemTagGr); 
-         ItemTagEl=Header->SwapShort(ItemTagEl);            
+      if(GetHeader()->GetSwapCode()) {
+         ItemTagGr=GetHeader()->SwapShort(ItemTagGr); 
+         ItemTagEl=GetHeader()->SwapShort(ItemTagEl);            
       }  
       printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
-            ftellRes,ItemTagGr,ItemTagEl );
+            (unsigned)ftellRes,ItemTagGr,ItemTagEl );
 
       // while 'Sequence Delimiter Item' (fffe,e0dd) not found
       while (  ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) { 
       // Parse fragments of the current Fragment (Frame)    
          ftellRes=ftell(fp);
          fread(&fragmentLength,4,1,fp); 
-         if(Header->GetSwapCode()) 
-            fragmentLength=Header->SwapLong(fragmentLength);    // length
+         if(GetHeader()->GetSwapCode()) 
+            fragmentLength=GetHeader()->SwapLong(fragmentLength);    // length
          printf("      at %x : 'fragment' length %d x(%08x)\n",
-                ftellRes, fragmentLength,fragmentLength);
+                (unsigned)ftellRes, (unsigned)fragmentLength,(unsigned)fragmentLength);
                        
           //------------------ scanning (not reading) fragment pixels
  
          fread(&nbRleSegments,4,1,fp);  // Reading : Number of RLE Segments
-         if(Header->GetSwapCode()) 
-            nbRleSegments=Header->SwapLong(nbRleSegments);
+         if(GetHeader()->GetSwapCode()) 
+            nbRleSegments=GetHeader()->SwapLong(nbRleSegments);
             printf("   Nb of RLE Segments : %d\n",nbRleSegments);
  
          for(int k=1; k<=15; k++) { // Reading RLE Segments Offset Table
             ftellRes=ftell(fp);
             fread(&RleSegmentOffsetTable[k],4,1,fp);
-            if(Header->GetSwapCode())
-               RleSegmentOffsetTable[k]=Header->SwapLong(RleSegmentOffsetTable[k]);
+            if(GetHeader()->GetSwapCode())
+               RleSegmentOffsetTable[k]=GetHeader()->SwapLong(RleSegmentOffsetTable[k]);
             printf("        at : %x Offset Segment %d : %d (%x)\n",
-                    ftellRes,k,RleSegmentOffsetTable[k],
+                    (unsigned)ftellRes,k,RleSegmentOffsetTable[k],
                     RleSegmentOffsetTable[k]);
          }
 
           if (nbRleSegments>1) { // skipping (not reading) RLE Segments
-             for(int k=1; k<=nbRleSegments-1; k++) { 
+             for(unsigned int k=1; k<=nbRleSegments-1; k++) { 
                 RleSegmentLength[k]=   RleSegmentOffsetTable[k+1]
                                      - RleSegmentOffsetTable[k];
                 ftellRes=ftell(fp);
                 printf ("  Segment %d : Length = %d x(%x) Start at %x\n",
-                           k,RleSegmentLength[k],RleSegmentLength[k], ftellRes);
+                           k,(unsigned)RleSegmentLength[k],(unsigned)RleSegmentLength[k], (unsigned)ftellRes);
                 fseek(fp,RleSegmentLength[k],SEEK_CUR);    
              }
           }
@@ -212,8 +231,8 @@ bool gdcmFile::ParsePixelData(void) {
                                          - RleSegmentOffsetTable[nbRleSegments];
           ftellRes=ftell(fp);
           printf ("  Segment %d : Length = %d x(%x) Start at %x\n",
-                           nbRleSegments,RleSegmentLength[nbRleSegments],
-                           RleSegmentLength[nbRleSegments],ftellRes);
+                           nbRleSegments,(unsigned)RleSegmentLength[nbRleSegments],
+                           (unsigned)RleSegmentLength[nbRleSegments],(unsigned)ftellRes);
 
           fseek(fp,RleSegmentLength[nbRleSegments],SEEK_CUR); 
             
@@ -222,15 +241,17 @@ bool gdcmFile::ParsePixelData(void) {
          ftellRes=ftell(fp);
          fread(&ItemTagGr,2,1,fp);  // Reading (fffe) : Item Tag Gr
          fread(&ItemTagEl,2,1,fp);  // Reading (e000) : Item Tag El
-         if(Header->GetSwapCode()) {
-            ItemTagGr=Header->SwapShort(ItemTagGr); 
-            ItemTagEl=Header->SwapShort(ItemTagEl);            
+         if(GetHeader()->GetSwapCode()) {
+            ItemTagGr=GetHeader()->SwapShort(ItemTagGr); 
+            ItemTagEl=GetHeader()->SwapShort(ItemTagEl);            
          }
          printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n",
-               ftellRes,ItemTagGr,ItemTagEl );
+               (unsigned)ftellRes,ItemTagGr,ItemTagEl );
       } 
    }
    return true;            
 }
 
 //-----------------------------------------------------------------------------
+} // end namespace gdcm
+