From ba9a199345c301686a92d44e03b58e79671a1b1a Mon Sep 17 00:00:00 2001
From: Patrick Imbo <patrick.imbo@c-s.fr>
Date: Tue, 4 Jul 2006 16:58:56 +0000
Subject: [PATCH]

---
 .../otbLineDetectorImageFilterBase.txx        |  6 +-
 Code/IO/otbONERAImageIO.cxx                   | 62 ++++++++++++++-----
 Code/IO/otbONERAImageIO.h                     |  3 +-
 3 files changed, 53 insertions(+), 18 deletions(-)

diff --git a/Code/FeatureExtraction/otbLineDetectorImageFilterBase.txx b/Code/FeatureExtraction/otbLineDetectorImageFilterBase.txx
index 66da4d9c17..26374b5378 100755
--- a/Code/FeatureExtraction/otbLineDetectorImageFilterBase.txx
+++ b/Code/FeatureExtraction/otbLineDetectorImageFilterBase.txx
@@ -270,8 +270,10 @@ void LineDetectorImageFilterBase< TInputImage, TOutputImage, InterpolatorType>
 
       // Loop on the region 
       //for (i = 0; i < neighborhoodSize; ++i)
-      for (int i = 0; i < m_Radius[0]; ++i)
-	for (int j = 0; j < m_Radius[1]; ++j)
+//      for (int i = 0; i < m_Radius[0]; ++i)
+//	for (int j = 0; j < m_Radius[1]; ++j)
+      for (int i = 0; i < m_Radius[0]; i++)
+	for (int j = 0; j < m_Radius[1]; j++)
         {
 
 	off[0]=i-m_Radius[0]/2;
diff --git a/Code/IO/otbONERAImageIO.cxx b/Code/IO/otbONERAImageIO.cxx
index 86e1a7b10a..e1a69c0553 100644
--- a/Code/IO/otbONERAImageIO.cxx
+++ b/Code/IO/otbONERAImageIO.cxx
@@ -52,6 +52,7 @@ ONERAImageIO::ONERAImageIO()
   m_Origin[0] = 0.0;
   m_Origin[1] = 0.0;
 
+  m_FlagWriteImageInformation = true;
 
 }
 
@@ -451,32 +452,63 @@ bool ONERAImageIO::CanWriteFile( const char* FileNameToWrite )
 
 void ONERAImageIO::Write(const void* buffer)
 {
+  if( m_FlagWriteImageInformation == true )
+    {
+     otbMsgDevMacro(<<"ONERAImageIO::Write() m_FlagWriteImageInformation : " <<m_FlagWriteImageInformation );
+     this->WriteImageInformation();
+     m_FlagWriteImageInformation = false;
+    }
 
-  unsigned long step = this->GetNumberOfComponents();
-
+  unsigned long step                     = this->GetNumberOfComponents();
   const unsigned long numberOfBytes      = this->GetImageSizeInBytes();
   const unsigned long numberOfComponents = this->GetImageSizeInComponents();
 
-  char *tempmemory = new char[numberOfBytes];
-  memcpy(tempmemory,buffer,numberOfBytes);
+  int lNbLignes   = this->GetIORegion().GetSize()[1];
+  int lNbColonnes = this->GetIORegion().GetSize()[0];
+  int lPremiereLigne   = this->GetIORegion().GetIndex()[1] ; // [1... ]
+  int lPremiereColonne = this->GetIORegion().GetIndex()[0] ; // [1... ]
+
+  unsigned long numberOfBytesPerLines = step * lNbColonnes * m_NbOctetPixel;
+  unsigned long headerLength = ONERA_HEADER_LENGTH + 4 + numberOfBytesPerLines;
+  unsigned long offset;
+  unsigned long numberOfBytesToBeWrite = step * m_NbOctetPixel *lNbColonnes;
+  unsigned long numberOfBytesRegion = step * m_NbOctetPixel *lNbColonnes *lNbLignes;
+  unsigned long numberOfBytesWrite;        
+
+
+  char *tempmemory = new char[numberOfBytesRegion];
+  memcpy(tempmemory,buffer,numberOfBytesRegion);
+
   if(this->GetComponentType() == FLOAT)
     {
     itk::ByteSwapper<float>::SwapRangeFromSystemToLittleEndian(
-        reinterpret_cast<float *>(tempmemory), numberOfComponents );
+        reinterpret_cast<float *>(tempmemory), numberOfBytesRegion );
     }
-     
-   int lNbLignes   = this->GetIORegion().GetSize()[1];
-   int lNbColonnes = this->GetIORegion().GetSize()[0];
+   
 
+  char* value = new char[numberOfBytesToBeWrite];
+  unsigned long cpt = 0;
+ 
+  for(int LineNo = lPremiereLigne;LineNo <lPremiereLigne + lNbLignes; LineNo++ )
+    {
+	for( unsigned long  i=0 ; i < numberOfBytesToBeWrite ; i = i+  2 * m_NbOctetPixel )
+           {
+            memcpy((void*)(&(value[i])),(const void*)(&(tempmemory[cpt])),(size_t)( 2* m_NbOctetPixel) );
+            cpt += 2*m_NbOctetPixel;
+           }
 
-  unsigned long numberOfBytesPerLines = 2 * lNbColonnes * m_NbOctetPixel;
-  unsigned long headerLength = ONERA_HEADER_LENGTH + 4 + numberOfBytesPerLines;
-  unsigned long offset;
+	offset  =  headerLength + numberOfBytesPerLines * LineNo;
+	offset +=  m_NbOctetPixel * lPremiereColonne;
+  	m_Datafile.seekg(offset, std::ios::beg);
+	m_Datafile.write( static_cast<char *>( value ), numberOfBytesToBeWrite );
+    	numberOfBytesWrite = m_Datafile.gcount();
+  	m_Datafile.seekg(offset, std::ios::end);
+    }
 
-  offset  =  headerLength + numberOfBytesPerLines;
-  m_Datafile.seekg(offset, std::ios::beg);
-  m_Datafile.write( static_cast<const char *>(tempmemory) , numberOfBytes );
+  delete [] value;
   delete [] tempmemory;
+
+
 }
 
 void ONERAImageIO::WriteImageInformation()
@@ -504,7 +536,7 @@ void ONERAImageIO::WriteImageInformation()
   m_Headerfile << "# [dans ordre LSBfirst = big-endian]" << std::endl;
 
   std::string sPixelType("cmplx_real_4");
-  if(m_PixelType == COMPLEX && m_ComponentType == FLOAT)
+  if( (this->GetPixelType() == COMPLEX) && (m_ComponentType == FLOAT) )
     {
     sPixelType = "cmplx_real_4";
     }
diff --git a/Code/IO/otbONERAImageIO.h b/Code/IO/otbONERAImageIO.h
index fe155d806f..2f30822668 100644
--- a/Code/IO/otbONERAImageIO.h
+++ b/Code/IO/otbONERAImageIO.h
@@ -128,7 +128,8 @@ private:
 
 
   /** Nombre d'octets par pixel */
-  int           m_NbOctetPixel;
+  int     m_NbOctetPixel;
+  bool    m_FlagWriteImageInformation;
   
 
 };
-- 
GitLab