]> Creatis software - gdcm.git/blobdiff - src/gdcmFile.h
Fix mistypings
[gdcm.git] / src / gdcmFile.h
index 90ea66afd248678bfd8c2d678af2cbe0bdb38765..86866908f34f68c5ded235aab4d5862a13ba5657 100644 (file)
@@ -3,12 +3,12 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmFile.h,v $
   Language:  C++
-  Date:      $Date: 2004/09/13 07:49:36 $
-  Version:   $Revision: 1.47 $
+  Date:      $Date: 2007/09/17 12:16:02 $
+  Version:   $Revision: 1.134 $
                                                                                 
   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.htm for details.
+  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
                                                                                 
 =========================================================================*/
 
-#ifndef GDCMFILE_H
-#define GDCMFILE_H
+#ifndef _GDCMFILE_H_
+#define _GDCMFILE_H_
 
-#include "gdcmCommon.h"
-#include "gdcmHeader.h"
+#include "gdcmDebug.h"
+#include "gdcmDocument.h"
+#include "gdcmTagKey.h"
 
-//-----------------------------------------------------------------------------
-/*
- * In addition to Dicom header exploration, this class is designed
- * for accessing the image/volume content. One can also use it to
- * write Dicom/ACR-NEMA/RAW files.
- */
-class GDCM_EXPORT gdcmFile
+
+namespace GDCM_NAME_SPACE 
 {
-public:
-   gdcmFile( gdcmHeader *header );
-   gdcmFile( std::string const & filename );
-   virtual ~gdcmFile();
 
-   /// Accessor to \ref Header
-   gdcmHeader* GetHeader() { return Header; }
+class RLEFramesInfo;
+class JPEGFragmentsInfo;
 
-   void   SetPixelDataSizeFromHeader();
-   
+//-----------------------------------------------------------------------------
+// Dicom Part 3.3 Compliant
+enum ModalityType {
+   Unknow,
+   AU,       // Voice Audio
+   AS,       // Angioscopy
+   BI,       // Biomagnetic Imaging
+   CF,       // Cinefluorography
+   CP,       // Culposcopy
+   CR,       // Computed Radiography
+   CS,       // Cystoscopy
+   CT,       // Computed Tomography
+   DD,       // Duplex Dopler
+   DF,       // Digital Fluoroscopy
+   DG,       // Diaphanography
+   DM,       // Digital Microscopy
+   DS,       // Digital Substraction Angiography
+   DX,       // Digital Radiography
+   ECG,      // Echocardiography
+   EPS,      // Basic Cardiac EP
+   ES,       // Endoscopy
+   FA,       // Fluorescein Angiography
+   FS,       // Fundoscopy
+   HC,       // Hard Copy
+   HD,       // Hemodynamic
+   LP,       // Laparoscopy
+   LS,       // Laser Surface Scan
+   MA,       // Magnetic Resonance Angiography
+   MR,       // Magnetic Resonance
+   NM,       // Nuclear Medicine
+   OT,       // Other
+   PT,       // Positron Emission Tomography
+   RF,       // Radio Fluoroscopy
+   RG,       // Radiographic Imaging
+   RTDOSE,   // Radiotherapy Dose
+   RTIMAGE,  // Radiotherapy Image
+   RTPLAN,   // Radiotherapy Plan
+   RTSTRUCT, // Radiotherapy Structure Set
+   SM,       // Microscopic Imaging
+   ST,       // Single-photon Emission Computed Tomography
+   TG,       // Thermography
+   US,       // Ultrasound
+   VF,       // Videofluorography
+   XA,       // X-Ray Angiography
+   XC        // Photographic Imaging
+};
 
-/// \brief     Returns the size (in bytes) of required memory to hold
-///            the pixel data represented in this file.
-   size_t GetImageDataSize(){ return ImageDataSize; };
+//-----------------------------------------------------------------------------
 
-   
-/// \brief     Returns the size (in bytes) of required memory to hold
-///            the pixel data represented in this file, if user DOESN'T want 
-///            to get RGB pixels image when it's stored as a PALETTE COLOR image
-///            -the (vtk) user is supposed to know how to deal with LUTs-     
-   size_t GetImageDataSizeRaw(){ return ImageDataSizeRaw; };
-
-   void * GetImageData();
-   size_t GetImageDataIntoVector(void* destination, size_t maxSize);
-   void * GetImageDataRaw();
-   size_t GetImageDataIntoVectorRaw(void* destination, size_t maxSize);
-
-   // Allocates ExpectedSize bytes of memory at this->Data and copies the
-   // pointed data to it. Copying the image might look useless but
-   // the caller might destroy it's image (without knowing it: think
-   // of a complicated interface where display is done with a library
-   // e.g. VTK) before calling the Write
-      
-   // see also gdcmHeader::SetImageDataSize ?!?         
-   bool SetImageData (void * data, size_t expectedSize);
-
-   /// \todo When the caller is aware we simply point to the data:
-   /// int SetImageDataNoCopy (void * Data, size_t ExpectedSize);
-
-   // Write pixels of ONE image on hard drive
-   // No test is made on processor "endianity"
-   // The user must call his reader correctly
-   bool WriteRawData  (std::string const & fileName);
-   bool WriteDcmImplVR(std::string const & fileName);
-   bool WriteDcmExplVR(std::string const & fileName);
-   bool WriteAcr      (std::string const & fileName);
-
-   // Don't look any longer for the code : 
-   // It's in file gdcmParsePixels.cxx
-   bool ParsePixelData();
-
-   virtual bool SetEntryByNumber(std::string const & content,
-                                 uint16_t group, uint16_t element)
-   { 
-      Header->SetEntryByNumber(content,group,element);
-      return true;
-   }
-     
-protected:
-   bool WriteBase(std::string const & fileName, FileType type);
+/**
+ * \brief DICOM elements and their corresponding values (and
+ * additionaly the corresponding DICOM dictionary entry) of the header
+ * of a DICOM file.
+ *
+ * The typical usage of instances of class File is to classify a set of
+ * dicom files according to header information e.g. to create a file hierarchy
+ * reflecting the Patient/Study/Serie informations, or extracting a given
+ * SerieId. Accessing the content (image[s] or volume[s]) is beyond the
+ * functionality of this class and belongs to gdcm::FileHelper.
+ * \note  The various entries of the explicit value representation (VR) shall
+ *        be managed within a dictionary which is shared by all File
+ *        instances.
+ * \note  The File::Set*Tag* family members cannot be defined as
+ *        protected due to Swig limitations for as Has_a dependency between
+ *        File and FileHelper.
+ */
+class GDCM_EXPORT File : public Document
+{
+   gdcmTypeMacro(File);
 
-private:
-   void SwapZone(void* im, int swap, int lgr, int nb);
-   void SetInitialValues();  
-   bool ReadPixelData(void * destination);
+public:
+   static File *New() {return new File();}
+
+   // Loading
+  // GDCM_LEGACY(bool Load( std::string const &filename ))
+   bool Load();
+   // Standard values and informations contained in the header
+   bool IsReadable();
+
+   void SetFourthDimensionLocation(uint16_t group, uint16_t elem) {
+                   FourthDimensionLocation = TagKey(group, elem); }
+
+   // Some heuristic based accessors, end user intended
+   int GetImageNumber();
+   ModalityType GetModality();
+
+   int GetXSize();
+   int GetYSize();
+   int GetZSize();
+   int GetTSize(); // unnormalized in DICOM V3
+
+   bool GetSpacing(float &xspacing, float &yspacing, float &zspacing);
+   float GetXSpacing();
+   float GetYSpacing();
+   float GetZSpacing();
+
+   float GetXOrigin();
+   float GetYOrigin();
+   float GetZOrigin();
+
+   float GetXCosineOnX();
+   float GetXCosineOnY();  
+   float GetXCosineOnZ();
+   float GetYCosineOnX();
+   float GetYCosineOnY();  
+   float GetYCosineOnZ();   
+     
+   bool GetImageOrientationPatient( float iop[6] );
+   bool GetImagePositionPatient( float ipp[3] );
    
-   // For JPEG 8 Bits, body in file gdcmJpeg.cxx
-   bool gdcm_read_JPEG_file     (FILE *fp, void * image_buffer); 
-   static int gdcm_read_RLE_fragment(char **areaToRead, long lengthToDecode, 
-                                     long uncompressedSegmentSize, FILE *fp);
-
-   // For JPEG 12 Bits, body in file gdcmJpeg12.cxx
-   bool gdcm_read_JPEG_file12   (FILE *fp, void* image_buffer);
-
-   // For JPEG 2000, body in file gdcmJpeg2000.cxx
-   bool gdcm_read_JPEG2000_file (FILE *fp, void* image_buffer);
-
-   // For Run Length Encoding
-   bool gdcm_read_RLE_file      (FILE *fp, void* image_buffer); 
+   int GetBitsStored();
+   int GetBitsAllocated();
+   int GetHighBitPosition();
+   int GetSamplesPerPixel();
+   int GetPlanarConfiguration();
+   int GetPixelSize();
+   std::string GetPixelType();
+   bool IsSignedPixelData();
+   bool IsMonochrome();
+   bool IsMonochrome1();
+   bool IsPaletteColor();
+   bool IsYBRFull();
+
+   bool HasLUT();
+   int GetLUTNbits();
+
+   // For rescaling graylevel:
+   bool GetRescaleSlopeIntercept(double &slope, double &intercept);   
+   double GetRescaleIntercept();
+   double GetRescaleSlope();
+
+   int GetNumberOfScalarComponents();
+   int GetNumberOfScalarComponentsRaw();
+
+   /// Accessor to  File::GrPixel
+   uint16_t GetGrPixel()  { return GrPixel; }
+   /// Accessor to  File::NumPixel
+   uint16_t GetNumPixel() { return NumPixel; }
+
+   size_t GetPixelOffset();
+   size_t GetPixelAreaLength();
+
+   /// returns the RLE info
+   RLEFramesInfo *GetRLEInfo() { return RLEInfo; }
+   /// Returns the JPEG Fragments info
+   JPEGFragmentsInfo *GetJPEGInfo() { return JPEGInfo; }
+
+// Anonymization process
+   void AddAnonymizeElement (uint16_t group, uint16_t elem, 
+                             std::string const &value);
+   /// Clears the list of elements to be anonymized
+   void ClearAnonymizeList() { UserAnonymizeList.clear(); }      
+   void AnonymizeNoLoad();
+   /// Replace patient's own information by info from the Anonymization list
+   bool AnonymizeFile();
+
+   bool Write(std::string fileName, FileType filetype);
 
-// members variables:
-
-   /// \brief Header to use to load the file
-   gdcmHeader *Header;
-
-   /// \brief Whether the underlying \ref gdcmHeader was loaded by
-   ///  the constructor or passed to the constructor. When false
-   ///  the destructor is in charge of deletion.
-   bool SelfHeader;
-
-   /// \brief to hold the Pixels (when read)
-   void* Pixel_Data;  // (was PixelData; should be removed)
-   
-   /// \brief Area length to receive the pixels
-   size_t ImageDataSizeRaw;
-   
-   /// \brief Area length to receive the RGB pixels
-   /// from Grey Plane + Palette Color  
-   size_t ImageDataSize;
-       
-  /// \brief ==1  if GetImageDataRaw was used
-  ///        ==0  if GetImageData    was used
-  ///        ==-1 if ImageData never read                       
-   int PixelRead;
-   
-  /// wether already parsed 
-   bool Parsed;
+protected:
+   File();
+   virtual ~File();
+   /// \brief Protect the Writer from writing illegal groups
+   bool MayIWrite(uint16_t group)
+     { if (group < 8 &&  group !=2 ) return false; else return true; }
       
-  /// \brief length of the last allocated area devoided to receive Pixels
-  ///        ( to allow us not to (free + new) if un necessary )     
-   size_t LastAllocatedPixelDataLength; 
+   /// Store the RLE frames info obtained during parsing of pixels.
+   RLEFramesInfo *RLEInfo;
+   /// Store the JPEG fragments info obtained during parsing of pixels.
+   JPEGFragmentsInfo *JPEGInfo;
+
+   /// \brief In some cases (e.g. for some ACR-NEMA images) the Entry Element
+   /// Number of the 'Pixel Element' is *not* found at 0x0010. In order to
+   /// make things easier the parser shall store the proper value in
+   /// NumPixel to provide a unique access facility. 
+   uint16_t NumPixel;
+   /// \brief In some cases (e.g. for some ACR-NEMA images) the header entry for
+   /// the group of pixels is *not* found at 0x7fe0. 
+   /// In order to make things easier the parser shall store the proper value
+   /// in GrPixel to provide a unique access facility.
+   uint16_t GrPixel;
+   /// \brief allows user to tell gdcm in which DataElement is stored 
+   ///the -unnormalized- 4th Dimension   
+   TagKey FourthDimensionLocation;
 
-  // Initial values of some fields that can be modified during reading process
-  // if user asked to transform gray level + LUT image into RGB image
-     
-  /// \brief Samples Per Pixel           (0x0028,0x0002), as found on disk
-   std::string InitialSpp;
-  /// \brief Photometric Interpretation  (0x0028,0x0004), as found on disk
-   std::string InitialPhotInt;
-  /// \brief Planar Configuration        (0x0028,0x0006), as found on disk   
-   std::string InitialPlanConfig;    
-  /// \brief Bits Allocated              (0x0028,0x0100), as found on disk
-   std::string InitialBitsAllocated;
-   
-  // some DocEntry that can be moved out of the H table during reading process
-  // if user asked to transform gray level + LUT image into RGB image
-  // We keep a pointer on them for a future use.
-     
-  /// \brief Red Palette Color Lookup Table Descriptor   0028 1101 as read
-  gdcmDocEntry* InitialRedLUTDescr;  
-  /// \brief Green Palette Color Lookup Table Descriptor 0028 1102 as read
-  gdcmDocEntry* InitialGreenLUTDescr;
-  /// \brief Blue Palette Color Lookup Table Descriptor  0028 1103 as read
-  gdcmDocEntry* InitialBlueLUTDescr;
-  
-  /// \brief Red Palette Color Lookup Table Data         0028 1201 as read
-  gdcmDocEntry* InitialRedLUTData;  
-  /// \brief Green Palette Color Lookup Table Data       0028 1202 as read
-  gdcmDocEntry* InitialGreenLUTData;
-  /// \brief Blue Palette Color Lookup Table Data        0028 1203 as read
-  gdcmDocEntry* InitialBlueLUTData;
+private:
+   bool DoTheLoadingJob();
+   void ComputeRLEInfo();
+   void ComputeJPEGFragmentInfo();
+   bool     ReadTag(uint16_t, uint16_t);
+   uint32_t ReadTagLength(uint16_t, uint16_t);
+   void ReadEncapsulatedBasicOffsetTable();
+   uint32_t *BasicOffsetTableItemValue;
 
 };
+} // end namespace gdcm
 
 //-----------------------------------------------------------------------------
 #endif