- if (jpg2000) { // JPEG 2000 : call to ???
-
- res = (bool)gdcm_read_JPEG2000_file (fp,destination); // Not Yet written
-
- } // ------------------------------------- endif (JPEG2000)
-
- else if (jpgLossless) { // JPEG LossLess : call to xmedcom JPEG
-
- JPEGLosslessDecodeImage (fp, // Reading Fragment pixels
- (unsigned short *)destination,
- Header->GetPixelSize()*8* Header->GetSamplesPerPixel(),
- ln);
- res=1; // in order not to break the loop
-
- } // ------------------------------------- endif (JPEGLossless)
-
- else { // JPEG Lossy : call to IJG 6b
-
- if (Header->GetBitsStored() == 8) {
- res = (bool)gdcm_read_JPEG_file (fp,destination); // Reading Fragment pixels
- } else {
- res = (bool)gdcm_read_JPEG_file12 (fp,destination);// Reading Fragment pixels
- }
- } // ------------------------------------- endif (JPEGLossy)
-
- if (!res) break;
-
- destination = (char *)destination + taille * nBytes; // location in user's memory
- // for next fragment (if any)
-
- fseek(fp,fragmentBegining,SEEK_SET); // To be sure we start
- fseek(fp,ln,SEEK_CUR); // at the begining of next fragment
-
- ItemTagGr = ItemTagEl =0;
- 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);
- }
-
- } // endWhile parsing fragments until Sequence Delim. Tag found
-
- Header->CloseFile();
+// These are the deprecated method that one day should be removed (after the next release)
+
+#ifndef GDCM_LEGACY_REMOVE
+/**
+ * \brief Constructor (DEPRECATED : temporaryly kept not to break the API)
+ * @param filename name of the file whose header we want to analyze
+ * @deprecated do not use any longer
+ */
+File::File( std::string const &filename )
+ :Document( )
+{
+ RLEInfo = new RLEFramesInfo;
+ JPEGInfo = new JPEGFragmentsInfo;
+
+ SetFileName( filename );
+ Load( ); // gdcm::Document is first Loaded, then the 'File part'
+}
+
+/**
+ * \brief Loader. (DEPRECATED : temporaryly kept not to break the API)
+ * @param fileName file to be open for parsing
+ * @return false if file cannot be open or no swap info was found,
+ * or no tag was found.
+ * @deprecated Use the Load() [ + SetLoadMode() ] + SetFileName() functions instead
+ */
+bool File::Load( std::string const &fileName )
+{
+ GDCM_LEGACY_REPLACED_BODY(File::Load(std::string), "1.2",
+ File::Load());
+ SetFileName( fileName );
+ if ( ! this->Document::Load( ) )
+ return false;
+
+ return DoTheLoadingJob( );
+}
+#endif
+
+// -----------------------------------------------------------------------------------------
+// THERALYS Algorithm to determine the most similar basic orientation
+//
+// Transliterated from original Python code.
+// Kept as close as possible to the original code
+// in order to speed up any further modif of Python code :-(
+// ------------------------------------------------------------------------------------------
+
+/**
+ * \brief THERALYS' Algorithm to determine the most similar basic orientation
+ * (Axial, Coronal, Sagital) of the image
+ * \note Should be run on the first gdcm::File of a 'coherent' Serie
+ * @return orientation code
+ * @return orientation code
+ * # 0 : Not Applicable (neither 0020,0037 Image Orientation Patient
+ * # nor 0020,0032Image Position found )
+ * # 1 : Axial
+ * # -1 : Axial invert
+ * # 2 : Coronal
+ * # -2 : Coronal invert
+ * # 3 : Sagital
+ * # -3 : Sagital invert
+ * # 4 : Heart Axial
+ * # -4 : Heart Axial invert
+ * # 5 : Heart Coronal
+ * # -5 : Heart Coronal invert
+ * # 6 : Heart Sagital
+ * # -6 : Heart Sagital invert
+ */
+double File::TypeOrientation( )
+{
+ float iop[6];
+ bool succ = GetImageOrientationPatient( iop );
+ if ( !succ )
+ {
+ return 0.;
+ }
+
+ vector3D ori1;
+ vector3D ori2;
+
+ ori1.x = iop[0]; ori1.y = iop[1]; ori1.z = iop[2];
+ ori1.x = iop[3]; ori2.y = iop[4]; ori2.z = iop[5];
+
+ // two perpendicular vectors describe one plane
+ double dicPlane[6][2][3] =
+ { { {1, 0, 0 },{0, 1, 0 } }, // Axial
+ { {1, 0, 0 },{0, 0, -1 } }, // Coronal
+ { {0, 1, 0 },{0, 0, -1 } }, // Sagittal
+ { { 0.8, 0.5, 0.0 },{-0.1, 0.1 , -0.95 } }, // Axial - HEART
+ { { 0.8, 0.5, 0.0 },{-0.6674, 0.687, 0.1794} }, // Coronal - HEART
+ { {-0.1, 0.1, -0.95},{-0.6674, 0.687, 0.1794} } // Sagittal - HEART
+ };
+
+ vector3D refA;
+ vector3D refB;
+ int i = 0;
+ Res res; // [ <result> , <memory of the last succes calcule> ]
+ res.first = 0;
+ res.second = 99999;
+ for (int numDicPlane=0; numDicPlane<6; numDicPlane++)
+ {
+ ++i;
+ // refA=plane[0]
+ refA.x = dicPlane[numDicPlane][0][0];
+ refA.y = dicPlane[numDicPlane][0][1];
+ refA.z = dicPlane[numDicPlane][0][2];
+ // refB=plane[1]
+ refB.x = dicPlane[numDicPlane][1][0];
+ refB.y = dicPlane[numDicPlane][1][1];
+ refB.z = dicPlane[numDicPlane][1][2];
+ res=VerfCriterion( i, CalculLikelyhood2Vec(refA,refB,ori1,ori2), res );
+ res=VerfCriterion( -i, CalculLikelyhood2Vec(refB,refA,ori1,ori2), res );
+ }
+ return res.first;
+/*
+// i=0
+// res=[0,99999] ## [ <result> , <memory of the last succes calculus> ]
+// for plane in dicPlane:
+// i=i+1
+// refA=plane[0]
+// refB=plane[1]
+// res=self.VerfCriterion( i , self.CalculLikelyhood2Vec(refA,refB,ori1,ori2) , res )
+// res=self.VerfCriterion( -i , self.CalculLikelyhood2Vec(refB,refA,ori1,ori2) , res )
+// return res[0]
+*/
+
+}
+
+Res
+File::VerfCriterion(int typeCriterion, double criterionNew, Res const & in)
+{
+ Res res;
+ double criterion = in.second;
+ if (criterionNew < criterion)
+ {
+ res.first = criterionNew;
+ res.second = typeCriterion;
+ }
+/*
+// type = res[0]
+// criterion = res[1]
+// # if criterionNew<0.1 and criterionNew<criterion:
+// if criterionNew<criterion:
+// criterion=criterionNew
+// type=typeCriterion
+// return [ type , criterion ]
+*/