From 5b9a03cd4882488ff701f3a7b9462a893ae1c003 Mon Sep 17 00:00:00 2001
From: Julien Michel <julien.michel@c-s.fr>
Date: Mon, 10 Dec 2007 17:00:58 +0000
Subject: [PATCH] Correction bug extract ROI.

---
 Code/Common/otbExtractROIBase.h           |  4 +++
 Code/Common/otbExtractROIBase.txx         | 44 ++++++++++++++++++++---
 Code/Common/otbMultiChannelExtractROI.txx | 12 +++----
 3 files changed, 50 insertions(+), 10 deletions(-)

diff --git a/Code/Common/otbExtractROIBase.h b/Code/Common/otbExtractROIBase.h
index a4f5a775d7..0e4067e643 100755
--- a/Code/Common/otbExtractROIBase.h
+++ b/Code/Common/otbExtractROIBase.h
@@ -105,6 +105,10 @@ protected:
   ~ExtractROIBase() {};
   void PrintSelf(std::ostream& os, itk::Indent indent) const;
 
+
+  virtual void GenerateInputRequestedRegion();
+
+
   /** ExtractROIBase can produce an image which is a different
    * resolution than its input image.  As such, ExtractROIBase
    * needs to provide an implementation for
diff --git a/Code/Common/otbExtractROIBase.txx b/Code/Common/otbExtractROIBase.txx
index 3a59bf08ff..8e0ffe690b 100755
--- a/Code/Common/otbExtractROIBase.txx
+++ b/Code/Common/otbExtractROIBase.txx
@@ -64,8 +64,18 @@ ExtractROIBase<TInputImage,TOutputImage>
 ::CallCopyOutputRegionToInputRegion(InputImageRegionType &destRegion,
                                     const OutputImageRegionType &srcRegion)
 {
-  ExtractROIBaseRegionCopierType extractImageRegionCopier;
-  extractImageRegionCopier(destRegion, srcRegion, m_ExtractionRegion);
+ //  ExtractROIBaseRegionCopierType extractImageRegionCopier;
+//   extractImageRegionCopier(destRegion, srcRegion, m_ExtractionRegion);
+
+  destRegion = srcRegion;
+
+  OutputImageIndexType index = destRegion.GetIndex();
+  
+  for (unsigned int i = 0; i < InputImageDimension; ++i)
+    {
+      index[i]+=m_ExtractionRegion.GetIndex()[i];
+    }
+  destRegion.SetIndex(index);
 }
 
 
@@ -90,7 +100,7 @@ ExtractROIBase<TInputImage,TOutputImage>
     if (inputSize[i])
       { 
       outputSize[nonzeroSizeCount] = inputSize[i];    
-      outputIndex[nonzeroSizeCount] = extractRegion.GetIndex()[i];
+      outputIndex[nonzeroSizeCount] =0;
       nonzeroSizeCount++;
       }
     }
@@ -105,6 +115,32 @@ ExtractROIBase<TInputImage,TOutputImage>
   this->Modified();
 }
 
+template <class TInputImage, class TOutputImage>
+void 
+ExtractROIBase<TInputImage,TOutputImage>
+::GenerateInputRequestedRegion()
+{
+  Superclass::GenerateInputRequestedRegion();
+  
+  typename Superclass::InputImagePointer  inputPtr  = const_cast<InputImageType*>(this->GetInput());
+  typename Superclass::OutputImagePointer      outputPtr = this->GetOutput();
+
+  if ( !outputPtr || !inputPtr)
+    {
+      return;
+    }
+  InputImageRegionType requestedRegion = outputPtr->GetRequestedRegion();
+  InputImageIndexType index = requestedRegion.GetIndex();
+  InputImageIndexType offset = m_ExtractionRegion.GetIndex();
+
+  for (unsigned int i=0; i < InputImageDimension; ++i)
+        {
+	  index[i]+=offset[i];
+	}
+  requestedRegion.SetIndex(index);  
+  inputPtr->SetRequestedRegion(requestedRegion);
+}
+
 
 
 /** 
@@ -166,7 +202,7 @@ ExtractROIBase<TInputImage,TOutputImage>
     }
 
   // Set the output image size to the same value as the extraction region.
-  outputPtr->SetLargestPossibleRegion( m_OutputImageRegion );
+  outputPtr->SetRegions( m_OutputImageRegion );
 
   // Set the output spacing and origin
   const itk::ImageBase<InputImageDimension> *phyData;
diff --git a/Code/Common/otbMultiChannelExtractROI.txx b/Code/Common/otbMultiChannelExtractROI.txx
index c7d43a0736..44ee07e47a 100755
--- a/Code/Common/otbMultiChannelExtractROI.txx
+++ b/Code/Common/otbMultiChannelExtractROI.txx
@@ -96,6 +96,8 @@ void
 MultiChannelExtractROI<TInputPixelType,TOutputPixelType>
 ::GenerateOutputInformation()
 {
+   // Call to the superclass implementation
+  Superclass::GenerateOutputInformation();
         // Analyse of channels to process
         ChannelsType Channels;
         if( m_Channels.empty() == false )
@@ -177,12 +179,7 @@ MultiChannelExtractROI<TInputPixelType,TOutputPixelType>
  			     	itkExceptionMacro(<< oss.str().c_str());
  			     }
         }
-        
 	outputPtr->SetNumberOfComponentsPerPixel( outputPtr->GetVectorLength() );
-
-        // Call to the superclass implementation
-        Superclass::GenerateOutputInformation();
-
 }
 
 
@@ -212,6 +209,9 @@ MultiChannelExtractROI<TInputPixelType,TOutputPixelType>
   OutputIterator outIt(outputPtr, outputRegionForThread);
   InputIterator inIt(inputPtr, inputRegionForThread);
 
+  outIt.GoToBegin();
+  inIt.GoToBegin();
+
   // if default behaviour
   if ( m_ChannelsWorksBool == false )
   {
@@ -245,7 +245,7 @@ MultiChannelExtractROI<TInputPixelType,TOutputPixelType>
                         pixelOutput[channelOut] = static_cast<OutputValueType>(pixelInput[channelIn]);
                         channelOut++;
                 }
-                outIt.Set( pixelOutput );
+		outIt.Set( pixelOutput );
                 ++outIt; 
                 ++inIt; 
                 progress.CompletedPixel();
-- 
GitLab